🪶 Apache HTTP Server

Конфигурация: виртуальные хосты, модули, .htaccess, mod_rewrite, прокси и HTTPS.

Шпаргалки · Администрирование · #apache #httpd #webserver

Команды

sudo apachectl configtest                 # проверка
sudo systemctl reload|restart apache2     # Debian, Ubuntu (httpd на RHEL)
sudo a2ensite site; sudo a2dissite site   # включить / выключить сайт
sudo a2enmod rewrite proxy ssl headers    # модули
sudo a2enconf name
tail -f /var/log/apache2/error.log

Файлы: /etc/apache2/apache2.conf, sites-available/, mods-enabled/; RHEL: /etc/httpd/conf/httpd.conf, conf.d/.

Виртуальный хост

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example

    <Directory /var/www/example>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/example_error.log
    CustomLog ${APACHE_LOG_DIR}/example_access.log combined
</VirtualHost>

HTTPS

<VirtualHost *:443>
    ServerName example.com
    SSLEngine on
    SSLCertificateFile    /etc/letsencrypt/live/example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
    SSLProtocol -all +TLSv1.2 +TLSv1.3
</VirtualHost>

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / https://example.com/
</VirtualHost>

Сертификат: sudo certbot --apache -d example.com.

.htaccess

Включается AllowOverride All. Лежит в каталоге сайта.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# SPA / фронт-контроллер
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]

ErrorDocument 404 /404.html
Header set X-Content-Type-Options "nosniff"
AuthType Basic
AuthName "Закрыто"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user

Пароль: htpasswd -c /etc/apache2/.htpasswd anna.

Реверс-прокси

ProxyPreserveHost On
ProxyPass        /api http://127.0.0.1:3000/
ProxyPassReverse /api http://127.0.0.1:3000/

Нужны proxy, proxy_http (для WebSocket proxy_wstunnel).

PHP

libapache2-mod-php (prefork) или php-fpm через proxy_fcgi (быстрее, рекомендуется с MPM event).

MPM (модели обработки)

MPM Особенность
prefork процесс на запрос, для устаревших модулей
worker потоки в процессах
event потоки и асинхронная работа с keep-alive (современный выбор)

Контроль доступа

Require ip 10.0.0.0/8, Require all denied, Require user anna, <FilesMatch "\.env$">Require all denied</FilesMatch>.

Apache или Nginx

Apache: гибкие модули, .htaccess без перезапуска. Nginx: легче при большом числе соединений, часто стоит перед Apache как прокси.