Расскажу как устанавливать и настраивать Nginx на системе CentOS 7. Рассмотрим какие могут быть варианты использования этого сервиса. Использование Nginx для web проектов работающих на бюджетных хостингах или железе — лучший вариант.

Введение

Из этой статьи вы узнаете про основные моменты работы с Nginx. Более подробно о работе с Nginx можно узнать на сайте разработчика в разделе документации. Долгое время лидирующие позиции занимал Apach, но новый продукт кардинально изменил подход к обработке команд и позволяет обслуживать высоко нагруженные сайты на бюджетном железе. Более детально узнать про автора Игоря Сысоева и ознакомится с принципами работы вы можете на просторах сети интернет. От себя лишь скажу что теперь это моя основная и любимая связка при организации веб сервера по причине быстроты и удобства работы.

Установка NGINX

Для установки будем использовать репозиторий разработчика NGINX.

Для установки самой свежей стабильной версии Nginx на СentOS подключим родной репозиторий выполнив команду:

rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

Установим выполнив команду:

yum install nginx

Перед установкой убеждаемся что установка идет с репозитория nginx.

Запустим и добавим в автозагрузку:

systemctl start nginx
systemctl enable nginx

Для проверки выполним команду в консоли:

curl http://localhost
= вывод команды =
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Видим код страницы. NGINX работает.

Например, мне не удобно видеть такую страницу по умолчанию и я привожу её к следующему виду:

vim /usr/share/nginx/html/index.html
= необходимый код =
<!DOCTYPE html>
<html>
<head>
<title>Welcome!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working.</p>

<p><em>lemp.sevo44.loc</em></p>
</body>
</html>

Используя такую страницу я всегда понимаю на какой сервер я попадаю.

nginx страница по умолчанию

Настройка NGINX

Вся прелесть настройки сводится к тому что вы всегда можете проверить правильность своих настроек выполнив команду:

nginx -t

Варианты конфигурации для сайтов

Дальше надо определится как будем работать с настройкой сайтов.
Существует два пути:

  • редактирование всё в одном файле;
  • для каждого сайта сделать свой файл настроек.

Например, лично мне нравится для каждого сайта создавать свой конфигурационный файл. В статье будет описан именно этот способ.

Главный конфигурационный файл

Скопируем оригинальный конфигурационный фал Nginx и приведем файл к следующему виду:

cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf_orig
vim /etc/nginx/nginx.conf
= необходимый код c пояснениями=
# Пользователь и группа, от имени которых будет запущен процесс
user nginx nginx;

# Число воркеров в новых версиях рекомендовано устанавливать параметр auto
worker_processes auto;

# Уровни лога debug, info, notice, warn, error, crit, alert или emerg
# перечислены в порядке возрастания важности. При установке определённого уровня
# в лог попадают все сообщения указанного уровня и уровней большей важности. 
# Например, при стандартном уровне error в лог попадают сообщения уровней error, crit, alert и emerg. 
# Если параметр не задан, используется error. 
error_log /var/log/nginx/error.log warn;

# Файл в котором будет храниться идентификатор основного процесса
pid /var/run/nginx.pid;

events {
# Максимальное количество соединений одного воркера
worker_connections 1024;
# Метод выбора соединений (для FreeBSD будет kqueue)
use epoll;
# Принимать максимально возможное количество соединений
multi_accept on;
}

http {
# Отключить вывод версии nginx в ответе
server_tokens off;

# Указываем файл с mime-типами и указываем тип данных по-умолчанию
include /etc/nginx/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"';
access_log /var/log/nginx/access.log main;

# Метод отправки данных sendfile эффективнее чем read+write
sendfile on;

# Ограничивает объём данных, который может передан за один вызов sendfile(). 
# Нужно для исключения ситуации когда одно соединение может целиком захватить воркер
sendfile_max_chunk 128k;

# Отправлять заголовки и начало файла в одном пакете
tcp_nopush on;
tcp_nodelay on;

# Параметр задаёт таймаут, в течение которого keep-alive соединение с клиентом не будет закрыто со стороны сервера
keepalive_timeout 65;

# Сбрасывать соединение если клиент перестал читать ответ
reset_timedout_connection on;

# Разрывать соединение по истечению таймаута при получении заголовка и тела запроса
client_header_timeout 3;
client_body_timeout 5;

# Разрывать соединение, если клиент не отвечает в течение 3 секунд
send_timeout 3;

# Задание буфера для заголовка и тела запроса
client_header_buffer_size 2k;
client_body_buffer_size 256k;

# Ограничение на размер тела запроса
client_max_body_size 12m;

# Подключение дополнительных конфигов
include /etc/nginx/conf.d/*.conf;
}

Конфигурации Nginx для сайтов

Связка c PHP осуществляется с использованием php-fpm. Узнать более подробно можно из статьи «PHP от Remi для CentOS 7«.

Рассмотрим на примере конфигурации для сайта на котором работает phpMyAdmin. Конфигурационный файл выглядит следующим образом:

#pma.sevo44.loc
server {
listen 80;
server_name pma.sevo44.loc www.pma.sevo44.loc;

access_log /var/www/pma.sevo44.loc/log/pma.sevo44.loc-access_log main;
error_log /var/www/pma.sevo44.loc/log/pma.sevo44.loc-error_log info;

root /var/www/pma.sevo44.loc/www/;
index index.php;

location ~ \.php$ {
fastcgi_pass unix:/var/run/php-fpm/php-fpm.socket;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_intercept_errors on;
fastcgi_ignore_client_abort off;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
}
}

Запросы на ресурс будут осуществятся с проксирующего сервира Nginx. О том как перевести ресурс на работу по https вы узнаете ниже.

Команды управления

nginx -s reload
systemctl restart nginx
systemctl reload nginx

Проксирования запросов на удаленный сервер

В локальной сети может работать множество сайтов. Самый лучший способ это настроить одну точку входа и оттуда переправлять запросы на ресурсы в локальной сети. Nginx прекрасно с этим справляется используя модуль ngx_http_proxy_module. Более подробно о том как можно настраивать проксирование запросов вы можете в документации разработчика.

Мне нравится использовать эту технологию так как она позволяет:

  • Работа всех ресурсов по https. На проксирующем сервере мы получаем сертификаты для всех ресурсов а перенапровление запросов идет по http. Контролировать получение сертификатов SSL в одном месте для всех сайтов локальной сети очень удобно;
  • Смена мест размещения ресурсов. Перевозить сервер на новое место не вызывает проблем. Достаточно настроить сайт на новом месте а потом просто поменять ip адресс на проксирующем Nginx.
  • Проксирование папок или фалов. Для оптимизации работы ресурса можно распределять нагрузку на разные ресурсы. Например, перенести загрузку определенных фалов (фотографии) или папок на другие сервера.

Для примера, так же будем использовать проксирование запросов для phpMyAdmin.

Параметры в используемом примере следующие:

  • pma.sevo44.ru — домен ресурса;
  • 10.10.0.1 — ip адрес ресурса с которого пересылается запрос. Проксирующий сервер работает на сервера в котором проксирование проходит на контейнеры LXC которые работают в своей сети 10.10.0.0/24;
  • 10.10.0.4 — ip ресурса на который происходит проксирование сигналов.

Настройка на проксирующем Nginx

Прежде всего, обычно я создаю конфигурационный файл в котором присутствует весь код, но секции отвечающие за работу ресурса на https комментированы. После получения сертификата ssl

Из приведенного примера ниже вы узнаете:

  • Как осуществлять редирект с http на https;
  • Включение сжатия GZIP для ресурса;
  • Настройки для работы https. Узнать более подробно о том как получать сертификат SSl можно из статьи «SSL бесплатный для сайта Nginx«;
  • Работа ресурса по http2;
  • Команды переправляющие ip адрес для правильного отображения в логах;
  • Настройка размера файлов которые можно загружать на проксируемый ресурс;
  • Папка которая будет использована для получения сертификата ssl.
### ssl pma.sevo44.ru
### Перенаправление с http на https
#server {
#listen 80;
#server_name pma.sevo44.ru www.pma.sevo44.ru;
#rewrite ^ https://$server_name$request_uri? permanent;
#}
server {
### Перевод работы ресурса на https c http2
#listen 443 ssl http2;
listen 80;
server_name pma.sevo44.ru www.pma.sevo44.ru;
### Включение сжатия GZIP
### Если используется NGINX proxy надо настраивать на нём!!!
#gzip on;
#gzip_static on;
#gzip_types text/plain text/css application/json application/x-#javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/x-icon image/svg+xml application/x-font-ttf;
#gzip_comp_level 6;
#gzip_proxied any;
#gzip_min_length 1000;
#gzip_disable "msie6";
#gzip_vary on;
### ssl
#ssl on;
#ssl_certificate /etc/letsencrypt/live/pma.sevo44.ru/fullchain.pem;
#ssl_certificate_key /etc/letsencrypt/live/pma.sevo44.ru/privkey.pem;
#ssl_session_timeout 5m;
#ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#ssl_dhparam /etc/letsencrypt/dhparam.pem;
#ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
#ssl_prefer_server_ciphers on;
#ssl_session_cache shared:SSL:10m;
### Папка используемая для получения сертификата ssl
location /.well-known/acme-challenge/ {
root /var/www/ssl/pma.sevo44.ru/;
}
location / {
### Ip адрес проксируемого ресурса
proxy_pass http://10.10.0.4:80;
### Настройки для передачи в логи проксируемых ресурсов реальных ip
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
### Код для указания размера максимальной зугрузки файлов 10 M
### так же нужна строчка в файле настройки сайта
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 6000;
proxy_read_timeout 6000;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}

Настройка на проксируемом ресурсе

Исходя из настроек на проксируещем сервере конфурационный файл проксируемого ресурса имеет следующий вид:

### pma.sevo44.ru
server {
listen 80;
server_name pma.sevo44.ru www.pma.sevo44.ru;

access_log /usr/share/phpMyAdmin/log/pma.sevo44.ru-access_log main;
error_log /usr/share/phpMyAdmin/log/pma.sevo44.ru-error_log info;

root /usr/share/phpMyAdmin/;
index index.php;

### Для записи в log реальных ip
set_real_ip_from 10.10.0.1;
real_ip_header X-Real-IP;

location ~ \.php$ {
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param HTTPS on;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_intercept_errors on;
fastcgi_ignore_client_abort off;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
} 
}

Проксирование директории или файлов

Секции должны входить в блок server.

Например, проксируем папку foto находящуюся на другом ресурсе:

location /foto/ {
proxy_pass http://192.168.0.200:80; 
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_redirect default;
}

Для проксирования файлов с форматом gif,jpg,png код будет иметь следующий вид:

location / {
proxy_pass http://192.168.0.200:80; 
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}

location ~ \.(gif|jpg|png)$ { 
root /web/sites/blog.zeroxzed.ru/www/images; 
}

Вывод

Каждый ресурс индивидуален. В статье приведены только самые основы и для того чтобы настроить работу ресурса максимально оптимально для работы вам придется используя документацию разработчика. Особое внимание следует уделить директивам кэширования proxy_cache так как они очень сильно могут влиять на скорость работы ресурса.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Понравилась статья? Поделитесь ей с друзьями!

Похожие по теме записи

Пожалуйста, оставляйте свои комментарии

Мне это важно, так как получая обратную связь я получаю информацию которая позволяет мне улучшить качество написания статей. Кроме того, оставляя комментарии вы помогаете сайту получить более высокий рейтинг у поисковых систем.

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

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