Поиск по сайту:

Как установить nginx в качестве обратного прокси для Apache в Ubuntu 16.04


Это руководство существует для этих версий ОС

  • Ubuntu 16.04 (Xenial Xerus)
  • Ubuntu 12.04 LTS (Precise Pangolin)

На этой странице

  1. 1 Предварительное примечание
  2. 2 Настройка Apache
  3. 3 Настройка nginx
  4. 4 ссылки

В этом руководстве показано, как настроить nginx в качестве обратного прокси-сервера перед веб-сервером Apache2 в Ubuntu 16.04. nginx (произносится как «engine x») — это бесплатный высокопроизводительный HTTP-сервер с открытым исходным кодом. nginx известен своей стабильностью, богатым набором функций, простой настройкой и низким потреблением ресурсов.

1 Предварительное примечание

В этом руководстве я использую имя хоста server1.example.com с IP-адресом 192.168.1.100. Эти настройки могут отличаться для вас, поэтому вам придется заменить их там, где это необходимо.

Я предполагаю, что у вас есть существующий виртуальный хост Apache (в этом руководстве я буду использовать виртуальный хост Apache по умолчанию), который прослушивает порт 80 на IP-адресе 192.168.1.100, который вы хотите проксировать через nginx. В качестве основы я буду использовать руководство Ubuntu LAMP. Обратите внимание, что это руководство охватывает только HTTP, а не https (SSL).

2 Настройка Апача

Первое, что нам нужно сделать, это настроить наш виртуальный хост Apache для прослушивания на локальном хосте (127.0.0.1) на неиспользуемом порту, отличном от 80 (например, 8000). Откройте файл /etc/apache2/ports.conf...

nano /etc/apache2/ports.conf

... и измените строки NameVirtualHost и Listen для порта 80, чтобы использовать порт 8000:

# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf

Listen 8000

<IfModule ssl_module>
Listen 443
</IfModule>

<IfModule mod_gnutls.c>
Listen 443
</IfModule>

Затем откройте файл конфигурации виртуального хоста (например, /etc/apache2/sites-available/000-default.conf)...

nano /etc/apache2/sites-available/000-default.conf

... и измените строку , чтобы использовать IP-адрес 127.0.0.1 и порт 8000:

<VirtualHost 127.0.0.1:8000>
[...]

Мы настроим nginx как прозрачный прокси, т. е. он будет передавать исходный IP-адрес пользователя в поле с именем X-Forwarded-For серверному Apache. Конечно, серверная часть Apache должна регистрировать исходный IP-адрес пользователя в своих журналах доступа вместо IP-адреса nginx (127.0.0.1). Есть два способа добиться этого:

1) Мы можем изменить строку LogFormat в /etc/apache2/apache2.conf и заменить %h на %{X-Forwarded-For}i:

nano /etc/apache2/apache2.conf
[...]
#LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
[...]

2) В Debian/Ubuntu мы можем установить модуль Apache libapache2-mod-rpaf, который позаботится о регистрации правильного IP-адреса:

apt-get -y install libapache2-mod-rpaf

После всех этих изменений перезапустите Apache:

service apache2 restart

3 Настройка nginx

Если nginx еще не установлен, установите его следующим образом:

apt-get -y install nginx

Создайте его системные ссылки для запуска и убедитесь, что он запущен:

systemctl enable nginx.service
service nginx restart

Теперь он должен прослушивать порт 80.

Некоторые стандартные параметры прокси находятся в файле /etc/nginx/proxy_params:

nano /etc/nginx/proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

Поскольку позже мы включим этот файл в прокси-часть нашего виртуального хоста nginx, например, example.com, вы можете добавить дополнительные директивы прокси в этот файл, если хотите, например. следующее:

proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme; client_max_body_size 100M; client_body_buffer_size 1m; proxy_intercept_errors on; proxy_buffering on; proxy_buffer_size 128k; proxy_buffers 256 16k; proxy_busy_buffers_size 256k; proxy_temp_file_write_size 256k; proxy_max_temp_file_size 0; proxy_read_timeout 300;

Теперь измените виртуальный хост по умолчанию для nginx — убедитесь, что он использует тот же корень документа, что и виртуальный хост Apache для example.com (например, /var/www/html), чтобы nginx мог доставлять статические файлы напрямую, не передавая запрос Apache:

nano /etc/nginx/sites-available/default
server {
listen 80 default_server;
listen [::]:80 default_server;

root /var/www/html;

# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;

server_name _;

location / {
proxy_pass http://localhost:8000;
include /etc/nginx/proxy_params;
}
}

Это очень простая конфигурация, которая будет проксировать все запросы к Apache.

Перезагрузите nginx, чтобы изменения вступили в силу:

service nginx reload

Теперь вы можете ввести имя хоста сервера или IP-адрес 192.168.1.100 в своем браузере, и вы должны увидеть веб-сайт Apache по умолчанию, но на этот раз доставленный через nginx.

Как я уже говорил, это очень простая конфигурация, которая проксирует все запросы к Apache. Но поскольку nginx намного быстрее доставляет статические файлы (такие как JavaScript, CSS, изображения, PDF-файлы, статические HTML-файлы и т. д.), чем Apache, рекомендуется разрешить nginx обслуживать эти файлы напрямую. Это можно сделать, добавив новое место для этих файлов, например. следующее:

server {
       listen 80 default_server;
listen [::]:80 default_server;

root /var/www/html;

# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;

server_name _;

location / {
proxy_pass http://localhost:8000;
include /etc/nginx/proxy_params;
} location ~* \.(js|css|jpg|jpeg|gif|png|svg|ico|pdf|html|htm)$ { } }

Перезагрузите nginx:

service nginx reload

Вы даже можете установить HTTP-заголовок Expires для этих файлов, чтобы браузеры кэшировали эти файлы (подробнее см. Как заставить браузеры кэшировать статические файлы в nginx):

server {
       listen 80 default_server;
listen [::]:80 default_server;

root /var/www/html;

# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;

server_name _;

location / {
proxy_pass http://localhost:8000;
include /etc/nginx/proxy_params;
} location ~* \.(js|css|jpg|jpeg|gif|png|svg|ico|pdf|html|htm)$ { expires 30d; } }

Теперь мы можем сделать эту настройку еще на один шаг, позволив nginx обслуживать столько запросов, сколько он может выполнить, и передавать только оставшиеся запросы плюс файлы PHP в Apache:

server {
       listen 80 default_server;
listen [::]:80 default_server;

root /var/www/html;

# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;

server_name _;

location / {
proxy_pass http://localhost:8000;
include /etc/nginx/proxy_params;
} location ~* \.(js|css|jpg|jpeg|gif|png|svg|ico|pdf|html|htm)$ { expires 30d; } location @proxy { proxy_pass http://127.0.0.1:8000; include /etc/nginx/proxy_params; } location ~* \.php$ { proxy_pass http://127.0.0.1:8000; include /etc/nginx/proxy_params; } }

Перезагрузите nginx:

service nginx reload

Конечно, вы можете еще более тонко настроить эту настройку, например, используя nginx proxy_cache (если ваше приложение это позволяет — например, вы должны убедиться, что капчи или корзины покупок не кэшируются, и что вошедшие пользователи всегда получают свежая копия страницы) или если ваше приложение имеет полный кеш страницы - в таком случае nginx может напрямую обращаться к полному кешу страницы (вы можете найти пример в этом руководстве: Как ускорить Drupal 7.7 с помощью Boost и nginx ( Выжимка Дебиана)).

4 ссылки

  • nginx: http://nginx.net/
  • Apache: http://httpd.apache.org/
  • Убунту: http://www.ubuntu.com/