Nginx

Обновлено 7 мая 2021

Nginx

Установка и настройка Nginx

Выполните установку Nginx:

emerge -a www-servers/nginx

Настройка Nginx

Все настройки Nginx прописываются в файле /etc/nginx/nginx.conf. Параметры для сайтов хранятся в каталоге /etc/nginx/sites-enabled.

Запустите Nginx:

/etc/init.d/nginx start

Добавьте Nginx в автозагрузку:

rc-update add nginx

Пример настройки Nginx

Создайте файл настроек для localhost:

/etc/nginx/sites-enabled/local.conf
server {
    listen 80;
    server_name localhost;
    access_log /var/log/nginx/localhost.access_log main;
    error_log /var/log/nginx/localhost.error_log info;
    root /var/calculate/www/localhost/htdocs;
}

Создайте индексный файл для проверки работоспособности сервера:

mkdir -p /var/calculate/www/localhost/htdocs

echo 'Hello!' > /var/calculate/www/localhost/htdocs/index.html

Проверка настроек

Перед тем, как перезапускать службу Nginx, всегда выполняйте проверку правильности сделанных изменений командой nginx -t

Если всё верно, то будет выведено следующее:

nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

После успешной проверки перечитайте конфигурацию Nginx:

/etc/init.d/nginx reload

Чтобы проверить, что Nginx работает и есть доступ, воспользуйтесь консольным веб-клиентом curl:

curl http://localhost

Hello!

Настройка HTTPS для Nginx

Сгенерируйте ключ для протокола Диффи-Хеллмана:

openssl dhparam -out /etc/nginx/ssl-dhparams.pem 4096
Generating DH parameters, 4096 bit long safe prime, generator 2
This is going to take a long time

Создайте файл описания общих параметров SSL:

/etc/nginx/ssl.conf
# This file contains important security parameters. If you modify this file
# manually, Certbot will be unable to automatically provide future security
# updates. Instead, Certbot will print and log an error message with a path to
# the up-to-date file that you will need to refer to when manually updating
# this file.

ssl_session_cache shared:le_nginx_SSL:1m;
ssl_session_timeout 1440m;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;

ssl_ciphers "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS";

ssl_dhparam /etc/nginx/ssl-dhparams.pem;

Получение сертификата Let's Encrypt

Получите сертификат доменов www.example.org и example.org для Nginx, следуя руководству.

Пример настроки HTTPS

Добавьте настройки HTTPS для example.org:

/etc/nginx/sites-enabled/example.org.conf
server {
    listen 80;
    listen 443 ssl;
    server_name www.example.org example.org;

    include ssl.conf;
    ssl_certificate /etc/letsencrypt/live/example.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.org/privkey.pem;

    access_log /var/log/nginx/example.org.access_log main;
    error_log /var/log/nginx/example.org.error_log info;

    include acme.conf;

    root /var/calculate/www/example.org/htdocs;
}

Перенаправление с HTTP на HTTPS

Добавьте правило перенаправления запросов с http://example.org на https://example.org:

/etc/nginx/sites-enabled/example.org.conf
server {
    listen 80;
    listen 443 ssl;
    server_name www.example.org example.org;

    include ssl.conf;
    ssl_certificate /etc/letsencrypt/live/example.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.org/privkey.pem;

    access_log /var/log/nginx/example.org.access_log main;
    error_log /var/log/nginx/example.org.error_log info;

    include acme.conf;

    if ($scheme = http) {
        return 301 https://$server_name$request_uri;
    }

    root /var/calculate/www/example.org/htdocs;
}

Установка и настройка PHP-FPM

PHP-FPM (FastCGI Process Manager) - это высокопроизводительный и масштабируемый интерфейс для взаимодействия web-сервера и web-приложения, дальнейшее развитие технологии CGI. Основное преимущество FastCGI в изоляции между динамическим языком и web-сервером. Эта технология позволяет запускать web-сервера и CGI-процессы на различных хостах, что улучшает масштабируемость и безопасность без заметной потери производительности.

Для установки PHP-FPM выполните:

emerge -a dev-lang/php

После вывода всей информации для установки PHP необходимо согласиться с версией PHP по умолчанию. Отменить установку и указать необходимую версию PHP можно при следующей установке. Для вывода информации о всех имеющихся и работающих расширениях используйте команду php -m.

Использование UNIX-сокета для взаимодействия Nginx c PHP является предпочтительным и рекомендуемым вариантом!

Внесите необходимые изменения в файл настроек, указав временную зону:

/etc/php/fpm-php7.4/php.ini
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = "Europe/Moscow"

Заметка

В примерах указан путь для версии PHP 7.4. Отредактируйте путь, если используется другая версия PHP.

Запустите сервис PHP-FPM:

/etc/init.d/php-fpm start

Добавьте PHP-FPM в автозагрузку:

rc-update add php-fpm

Пример настройки Nginx с PHP кодом

Для поддержки PHP добавьте следующие настройки в конфигурацию сайта, работающего под Nginx. В примере ниже Nginx обменивается информацией с процессом PHP через UNIX-сокет. В блок server добавьте блок location, в котором и будут описаны правила работы с PHP.

Выполните настройки:

/etc/nginx/sites-enabled/example.org.conf
# localhost
server {
    listen 80;
    server_name www.example.org example.org;
    access_log /var/log/nginx/example.org.access_log main;
    error_log /var/log/nginx/example.org.error_log info;
    root /var/calculate/www/localhost/htdocs;
    location ~ \.php$ {
        # Проверка на несуществующие скрипты или ошибку 404
        # Без этой строки nginx будет сразу отправлять любые запросы, оканчивающиеся на .php, в php-fpm
        try_files $uri =404;
        include /etc/nginx/fastcgi.conf;
        fastcgi_pass unix:/run/php-fpm.socket;
        }
}

Создайте файл, указав в нем код для вывода информации о PHP:

echo '<?php phpinfo(); ?>' > /var/calculate/www/localhost/htdocs/info.php

Назначьте необходимые права для всех файлов в корневой папке сайта:

chown -R nginx:nginx /var/calculate/www/localhost/htdocs

Добавьте необходимую запись в DNS. В случае отсутствия DNS можно внести запись в статическую таблицу имен компьютера, с которого будет производится доступ к ресурсу.

Для систем на базе Linux отредактируем список доменных имён:

/etc/hosts
192.168.0.1  www.example.org example.org

Проверьте правильность настройки Nginx и перечитайте конфигурацию:

nginx -t && /etc/init.d/nginx reload

Запустите PHP-FPM:

/etc/init.d/php-fpm start

Укажите в веб браузере путь http://example.org/info.php. В случае успешной настройки вы увидите страницу с полной информацией о PHP.

Настройка обратного прокси на Nginx

Под обратным проксированием обычно понимается процесс, в котором сервер, получающий запрос от клиента, не обрабатывает его полностью самостоятельно, а частично или целиком отправляет этот запрос для обработки другим (upstream) серверам. Иными словами, он не перенаправляет клиента, а самостоятельно отправляет запрос и возвращает полученный ответ обратно клиенту.

Настройте обратный прокси example.org, взаимодействующий с внутренним HTTP-сервисом, использующим порт 8080:

/etc/nginx/sites-enables/example.org.conf
server {
  listen 80;
  server_name www.example.org example.org;
  access_log /var/log/nginx/proxy.log;

  location / {
    proxy_pass http://127.0.0.1:8080;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    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 https;
    proxy_set_header X-Nginx-Proxy true;

    proxy_redirect off;
  }
}

Запрет обработки неописанных сайтов

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

/etc/nginx/sites-enabled/_noname.conf
server {
    listen  80 default_server;
    server_name _;
    access_log /var/log/nginx/noname_80.access_log main;
    return      444;
}
server {
    listen 443 ssl default_server;
    ssl_ciphers aNULL;
    ssl_certificate /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;
    ssl_session_tickets off;
    server_name _;
    access_log /var/log/nginx/noname_443.access_log main;
    return      444;
}

Перезагрузите настройки Nginx:

/etc/init.d/nginx reload