Skip to content
 

Настройка nginx в качестве проксирующего web-сервера

В предыдущем посте «Установка nginx» я описывал как устанавливать nginx на linux сервер, но не описал настройку web-сервера. Nginx может быть настроен в нескольких вариантах работы, все будет зависеть от цели его использования. Чаше всего nginx используют как front-end cервер и настраивают его как проксирующий веб сервер. Ниже я привожу стандартный файл конфигурации, который я использую на проксирующих серверах. Отталкиваясь от него можно настроить работу nginx в зависимости от потребностей и поставленных задач клиента.

Файл /etc/nginx/nginx.conf:

#user  nobody;
error_log  /var/log/nginx/error.log;
#Number of worker you need
worker_processes 2;
worker_priority  -19;
# How many connections a worker can handle maximum.
events {
worker_connections  50000;
use epoll;
}
http {
server_tokens off;
include    mime.types;
default_type  application/octet-stream;
access_log /dev/null;
sendfile on;
server_names_hash_max_size 10000;
server_names_hash_bucket_size 1024;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout  7;

#Proxy
client_body_buffer_size     128K;
client_header_buffer_size   128K;
client_max_body_size          1M;
large_client_header_buffers 1 1k;
proxy_temp_path    /var/tmp/nginx/proxy/;
proxy_cache_path  /var/tmp/nginx/cache  levels=1:2   keys_zone=one:30m max_size=1g;
client_body_temp_path /var/tmp/nginx/client/;
fastcgi_temp_path /var/tmp/nginx/fcgi;
proxy_pass_header  Cookie;
proxy_pass_header  Set-Cookie;
proxy_cache_key    $scheme$proxy_host$request_uri$http_cookie$http_set-cookie;

#Gzip
gzip on;
gzip_comp_level  7;
gzip_min_length  1100;
gzip_buffers  16 32k;
gzip_types    text/plain text/xml text/css application/x-javascript application/xml application/xml+rss text/javascript application/atom+xml;
ignore_invalid_headers on;
client_header_timeout  3m;
client_body_timeout 3m;
send_timeout     3m;
server {
listen       80;
server_name  localhost;

location / {
root   html;
index  index.html index.htm;
}
error_page   500 502 503 504  /50x.html;
location = /50x.html {
root   html;
}
}
include "/etc/nginx/vhost/*.conf";
}

Как видите в этом файле я указал основные настройки nginx, а настройки хостов я вынес в отдельный файл (/etc/nginx/vhost/*.conf), чтобы было удобней следить за тем какие сайты настроены для проксирования и легко изменять их настройки. В папке vhost я создаю файлы с именем нужного мне домена, например domain.conf и если будет использоваться https протокол, то называю domain.ssl.conf. Ниже привожу примеры файлов.

domain.conf:

server {
access_log off;
error_log  /var/log/nginx/vhost-error_log warn;
listen    80;
server_name  domain.com www.domain.com;
#rewrite ^/(.*)$   https://$host/$1 permanent;
location ~ /\.ht {
deny all;
}

location / {
log_not_found  off;

client_max_body_size    512m;
client_body_buffer_size 512k;
proxy_send_timeout   360;
proxy_read_timeout   360;
proxy_buffer_size    32k;
proxy_buffers     64 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_connect_timeout 360s;

proxy_redirect  http://www.domain.com:80   http://www.domain.com;
proxy_redirect  http://domain.com:80   http://domain.com;
proxy_pass   http://10.0.0.1:80;
proxy_set_header   Host   $host;
proxy_set_header   X-Real-IP  $remote_addr;
proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ~* ^.+.(jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|iso|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|mp3|ogv|ogg|flv|swf|mpeg|mpg|mpeg4|mp4|avi|wmv|js|css|html|xml|html)$ {
expires 24h;
proxy_pass   http://10.0.0.1:80;
proxy_cache_valid  60m;
proxy_redirect     off;
proxy_set_header   Host   $host;
proxy_set_header   X-Real-IP  $remote_addr;
proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache_key    $scheme$proxy_host$request_uri$host;
proxy_cache one;
}
}

domain.ssl.conf:

server {
access_log off;
error_log  /var/log/nginx/vhost-error_log warn;
listen    10.0.1.5:443;
server_name  domain.com www.domain.com;
ssl                  on;
ssl_certificate      /etc/nginx/vhost/ssl/domain.com.crt;
ssl_certificate_key  /etc/nginx/vhost/ssl/domain.com.key;
ssl_session_timeout  5m;

ssl_protocols  SSLv2 SSLv3 TLSv1;
ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers   on;
location ~ /\.ht {
deny all;
}

location / {
log_not_found  off;

client_max_body_size    512m;
client_body_buffer_size 512k;
proxy_send_timeout   360;
proxy_read_timeout   360;
proxy_buffer_size    32k;
proxy_buffers     64 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_connect_timeout 360s;

proxy_redirect  https://www.domain.com:443   https://www.domain.com;
proxy_redirect  https://domain.com:443   https://domain.com;
proxy_pass   https://10.0.0.1:443;
proxy_set_header   Host   $host;
proxy_set_header   X-Real-IP  $remote_addr;
proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ~* ^.+.(jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|iso|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|mp3|ogv|ogg|flv|swf|mpeg|mpg|mpeg4|mp4|avi|wmv|js|css|html|xml|html)$ {
expires 24h;
proxy_pass   https://10.0.0.1:443;
proxy_cache_valid  60m;
proxy_redirect     off;
proxy_set_header   Host   $host;
proxy_set_header   X-Real-IP  $remote_addr;
proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache_key    $scheme$proxy_host$request_uri$host;
proxy_cache one;
}
}

Как видите, в файлах настройки нет ничего сложного, имея такие шаблоны настроек, можно легко и быстро подключать новые домены к nginx, достаточно изменить имя домена и ip адрес buck-end сервера.

Расскажу об основных параметрах настройки на которые (по моему мнению) стоит обратить внимание. Начнем с рассмотрения файла nginx.conf и первых двух опций worker_processes и worker_priority. Опция worker_processes задаёт число рабочих процессов web-сервера nginx, как правило значение этой опции выставляют равным количеству ядер в процессоре вашего сервера. Опция worker_priority задает приоритет работы процесса подобно тому, как это делается командой nice: отрицательное число означает более высокий приоритет. Рассмотрим несколько вариантов настроек этих двух параметров.

1. Nginx работает как проксирующий web — сервер и установлен на отдельном vds/сервере (кол-во ядер cpu равно 4), тогда значение опций можно выставить такие worker_processes 4; и worker_priority -19;. В данном примере процессор сервера имеет 4 ядра, поэтому параметру worker_processes присваиваем значение 4, на каждое ядро по процессу. На сервере кроме nginx никакие другие сервисы не запущены (служебные сервисы и программы для обеспечения нормальной работы ОС не берет в расчет), поэтому для nginx можно поставить наивысший приоритет работы процесса, это позволит быстрее обрабатывать пришедший запрос от пользователя и переходить к выполнению другого запроса, что в свою очередь позволит принимать больше запросов от пользователей.

2. Nginx работает как проксирующий web — сервер и установлен на vds/сервере (кол-во ядер cpu равно 4), где работают еще Apache, MySQL, Exim, Ftpd и др. сервисы. В таком случае значение параметров worker_processes и worker_priority будут зависеть от особенностей работы скрипта сайта и от кол-ва посетителей. Например комбинация worker_processes 4; и worker_priority -19; позволит отдать все ресурсы сервера работе nginx, но работа других сервисов будет на втором плане. Такая комбинация подходит, если скрипт сайта не часто обращается к MySQL и имеет легкий  php скрипт. Если скрипт сайта предусматривает интенсивную работу с MySQL и большое выполнение php скрпитов и также требуется быстрая отдача контента,то можно использовать такое сочетание worker_processes 2; и worker_priority -19;, таким образом два ядра процессора будут заняты процессом nginx с высшим приоритетом, а остальные два ядра возьмут на себя обработку MySQL и apache. Как видите в каждом конкретном случае нужно подбирать значения параметров экспериментально, но есть оптимальная комбинация, которая подойдет большинству серверов и от которой можно начинать эксперименты для улучшения производительности nginx, это сочетание worker_processes 4; и worker_priority -5 (-10);, при таком значении остальные сервисы смогут нормально работать, а следовательно и все функции сайта будут работать с оптимальной скоростью.

Рассмотрим параметр gzip_comp_level, он определяет степень сжатия http трафика. Если установить максимальное значение 9, то это будет сильно нагружать центральный процессор и контент будет отдаваться пользователю с задержкой, если на сервере не мощный процессор и большая посещаемость сайта. Я рекомендую устанавливать этот параметр от 4 до 7, в зависимости от мощности и загруженности вашего CPU сервера.

Значение и описание остальных параметров настройки вы можете найти на оффициальном сайте nginx.org.

В завершении моего поста расскажу вам про решение задачи постоянного https средствами nginx. Как вы могли заметить в файле конфигурации хоста domain.conf есть закомментированная строка #rewrite ^/(.*)$   https://$host/$1 permanent;. Её нужно раскомментировать, когда требуется чтобы пользователи работали с сайтом только через защищенный режим SSL, тогда всех посетителей сайта будет перадресовывать на URL https://domain.com.



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

(обязательно)


*