Дано: сервер на FreeBSD 13 с уже установленным Apache24. Даже сайт крутится.
Задача: построить работу хостинга таким образом, чтобы входящие запросы на 80порт принимал nginx и далее передавал часть работы на апач, а часть запросов сам обрабатывал. Работа хостинга в итоге должна выглядеть следующим образом:
Приходит некий HTTP запрос на ваш адрес, после чего сервер начинает обработку nginx-ом который «висит на 80-м порте», если это статические данные (картинки или видео, музыка), то он отдает ответ энжинксом, а если нет, — тогда обработку ведет beckend (apache24) который «висит на 8080 порте».
1. Установка и настройка nginx
Nginx будет смотреть в интернет и принимать запросы от пользователей, чтобы потом их перенаправлять на apache. Идем в порты и устанавливаем nginx:
# cd /usr/ports/www/nginx-devel # make install clean
Выбираем опции:
[X] HTTP_MODULE Enable HTTP module [X] HTTP_ADDITION_MODULE Enable http_addition module [X] HTTP_DAV_MODULE Enable http_webdav module [X] HTTP_FLV_MODULE Enable http_flv module [X] HTTP_PERL_MODULE Enable http_perl module [X] HTTP_REALIP_MODULE Enable http_realip module [X] HTTP_REWRITE_MODULE Enable http_rewrite module [X] HTTP_SSL_MODULE Enable http_ssl module [X] HTTP_STATUS_MODULE Enable http_stub_status module [X] HTTP_SUB_MODULE Enable http_sub module [X] WWW Enable html sample files
Добавим nginx в автозагрузку:
# echo 'nginx_enable="YES"' >> /etc/rc.conf
Редактируем конфиг nginx /usr/local/etc/nginx/nginx.conf, приводим его к следующему виду:
worker_processes 1; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; sendfile on; keepalive_timeout 65; gzip on; server { listen 192.168.1.20:80; server_name xn--h1afhbk.xn--p1ai www.xn--h1afhbk.xn--p1ai; location / { proxy_pass http://127.0.0.1:8080/; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_send_lowat 12000; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; proxy_temp_path /var/tmp/nginx; } location ~* \.(ogv|mp3|avi|mp4|7z|zip|rar|img|bin|jpeg|jpg|gif|png|css|js|pdf|txt|tar)$ { # Обрабатываемые типы файлов root /usr/local/www/orlin/; # Путь к корневому каталогу вашего сайта } } }
В строке
listen 192.168.1.20:80;
Указываем свой внешний ip адрес. Проверяем настройки nginx:
# nginx -t
Если видите:
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
значит все в порядке.
2. Перенастраиваем Apache24.
Теперь необходимо изменить конфигурацию apache, чтобы он слушал только локальный интерфейс 127.0.0.1, а все внешние запросы принимал nginx и перенаправлял к apache. Изменяем в настройках апача адрес и порт, которые он слушает на 127.0.0.1:8080:
mcedit /usr/local/etc/apache24/httpd.conf
Перезапускаем apache:
# /usr/local/etc/rc.d/apache24 restart
Запускаем nginx:
# /usr/local/etc/rc.d/nginx start
Сама схема теперь работает.
3. Работа над ошибками. RFAP — не работает, его убирал из инструкции
Методом «тыка» удалось победить — добавляем 2 строчки в vhost согласно инструкции:
RemoteIPHeader X-Forwarded-For
RemoteIPProxiesHeader X-Forwarded-By
в итоге будет:
<VirtualHost *:8080>
ServerAdmin ss@mail.ru
DocumentRoot "/usr/local/www/orlin"
ServerName xn--h1afhbk.xn--p1ai
RemoteIPHeader X-Forwarded-For
RemoteIPProxiesHeader X-Forwarded-By
ErrorLog "/var/log/apache24/orlin-error.log"
TransferLog "/var/log/apache24/orlin-access.log"
</VirtualHost>
Иначе было так
В результате получили не совсем то, что хотели. В логах апача адрес клиентов всегда теперь 127.0.0.1.
На сегодняшний день решение есть в использовании модуля mod_remoteip
Спасибо за наводку парням отсюда: https://github.com/gnif/mod_rpaf/issues/33
Устаревшее решение(не работает на свежем апаче) выглядело так(для информации, можно удалить):
Если мы используем сервер апач в связке с энжинкс в качестве бэкэнда, то он не будет получать реальные IP-адреса пользователей, посетивших ресурс. Это не позволит корректно вести логи работы сервера. Чтобы решить задачу нужно ещё установить модуль для Apache — mod_rpaf (что является аббревиатурой от reverse proxy add forward).
Добавляем дополнительный модуль mod_rpaf2 к Апачу. Модуль RPAF используется для того чтобы в логах apache регистрировались адреса клиентов, вместо адреса шлюза ngin.
pkg install ap24_mod_rfap2
После установки в /usr/local/etc/apache24/modules.d появятся файлы настроек данного модуля:
далее приводим 200_mod_rfap.conf к нужному нам виду, например:
LoadModule rpaf_module libexec/apache24/mod_rpaf.so <IfModule rpaf_module> # Enable reverse proxy add forward RPAF_Enable On # What IPs & bitmasked subnets to adjust requests for RPAF_ProxyIPs 127.0.0.1 # The header to use for the real IP address RPAF_Header X-Forwarded-For # Update vhost name so ServerName & ServerAlias work RPAF_SetHostName On # Set the HTTPS environment variable # to the header value contained in # X-HTTPS, or X-Forwarded-HTTPS. For # best results make sure that mod_ssl # is NOT enabled. #RPAF_SetHTTPS Off # Set the server port to the header # value contained in X-Port, or # X-Forwarded-Port. # (see https://github.com/gnif/mod_rpaf/issues/12) #RPAF_SetPort Off # Option to forbid request if not from # trusted RPAF_ProxyIPs; otherwise # cannot be done with Allow/Deny after # remote addr substitution #RPAF_ForbidIfNotProxy Off </IfModule>
Источники:
- https://linux-notes.org/ustanovka-apache-i-nginx-v-svyazke-na-freebsd/
- https://serveradmin.ru/freebsd-10-ustanovka-i-nastroyka-web-servera-dlya-razmeshheniya-bloga-wordpress-ch-3/#_frontend_nginx