Apache24 nginx работа в связке на FreeBSD 13

 

Дано: сервер на 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>

 

 


Источники:

  1. https://linux-notes.org/ustanovka-apache-i-nginx-v-svyazke-na-freebsd/
  2.  https://serveradmin.ru/freebsd-10-ustanovka-i-nastroyka-web-servera-dlya-razmeshheniya-bloga-wordpress-ch-3/#_frontend_nginx
Довольны?
[Оценок: 0 средняя: 0]

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *