nginx

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page Nginx and the translation is 79% complete.
Outdated translations are marked like this.

nginx — это надежный, маленький и очень производительный веб-сервер и обратный прокси-сервер. Это хорошая альтернатива популярным веб серверам, таким как Apache и lighttpd.

Установка

Перед непосредственной установкой пакета www-servers/nginx, сначала будет неплохо взглянуть на USE-флаги Nginx.

Расширенные USE-флаги

Nginx использует модули для расширения своих возможностей. Для более простого сопровождения такого модульного подхода, ebuild для nginx поддерживает расширенные (USE_EXPAND) USE-флаги для обозначения какие модули должны быть установлены.

  • Модули HTTP включаются через переменную NGINX_MODULES_HTTP
  • Почтовые модули включаются через переменную NGINX_MODULES_MAIL
  • Дополнительные модули включаются через переменную NGINX_ADD_MODULES

Эти переменные необходимо настроить в /etc/portage/make.conf. Их описание можно найти в /var/db/repos/gentoo/profiles/desc/nginx_modules_http.desc и /var/db/repos/gentoo/profiles/desc/nginx_modules_mail.desc.

Например, для включения модуля fastcgi:

ФАЙЛ /etc/portage/make.conf
NGINX_MODULES_HTTP="fastcgi"

Вышеописанное переопределяет стандартное значение NGINX_MODULES_HTTP значением fastcgi. Для включения модуля fastcgi без переопределения NGINX_MODULES_HTTP можно указать следующую запись в /etc/portage/package.use:

ФАЙЛ /etc/portage/package.use
www-servers/nginx NGINX_MODULES_HTTP: fastcgi

USE-флаги

USE flags for www-servers/nginx Robust, small and high performance http and reverse proxy server

aio Enables file AIO support
debug Enable extra debug codepaths, like asserts and extra output. If you want to get meaningful backtraces see https://wiki.gentoo.org/wiki/Project:Quality_Assurance/Backtraces
http Enable HTTP core support
http-cache Enable HTTP cache support
http2 Enable HTTP2 module support
http3 Enable HTTP3 module support
ktls Enable Kernel TLS offload (kTLS)
libatomic Use libatomic instead of builtin atomic operations
pcre Add support for Perl Compatible Regular Expressions
pcre-jit Enable JIT for pcre
pcre2 Enable support for pcre2
rtmp NGINX-based Media Streaming Server
selinux !!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur
ssl Enable HTTPS module for http. Enable SSL/TLS support for POP3/IMAP/SMTP for mail.
test Enable dependencies and/or preparations necessary to run tests (usually controlled by FEATURES=test but can be toggled independently)
threads Add threads support for various packages. Usually pthreads
vim-syntax Pulls in related vim syntax scripts

Установка

После настройки USE-флагов установите www-servers/nginx:

root #emerge --ask www-servers/nginx

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

Стандартная конфигурация nginx определяет виртуальный сервер с корневым каталогом в /var/www/localhost/htdocs. Однако в связи с bug #449136, ebuild nginx'а создает только каталог /var/www/localhost, без индексного файла. Для получения рабочей стандартной конфигурации создайте каталог /var/www/localhost/htdocs и простой индексный файл:

root #mkdir /var/www/localhost/htdocs
root #echo 'Hello, world!' > /var/www/localhost/htdocs/index.html

Пакет nginx включает в себя init-скрипт, позволяющий останавливать, запуска и перезапускать службу веб-сервера. Для запуска службы nginx запустите следующую команду:

root #/etc/init.d/nginx start

Чтобы проверить, что nginx запущен должным образом, перейдите в своем веб-браузере на адрес http://localhost, либо используйте один из веб-клиентов для командной строки (например, curl):

user $curl http://localhost

Конфигурация

Конфигурация nginx находится в файле /etc/nginx/nginx.conf.

Доступ к одному сайту

Следующий пример показывает конфигурацию для доступа к одному сайту без динамических возможностей (таких как PHP).

ФАЙЛ /etc/nginx/nginx.confКонфигурация Gentoo по умолчанию
user nginx nginx;
worker_processes 1;
 
error_log /var/log/nginx/error_log info;
 
events {
	worker_connections 1024;
	use epoll;
}
 
http {
	include /etc/nginx/mime.types;
	default_type application/octet-stream;
 
	log_format main
		'$remote_addr - $remote_user [$time_local] '
		'"$request" $status $bytes_sent '
		'"$http_referer" "$http_user_agent" '
		'"$gzip_ratio"';
 
	client_header_timeout 10m;
	client_body_timeout 10m;
	send_timeout 10m;
 
	connection_pool_size 256;
	client_header_buffer_size 1k;
	large_client_header_buffers 4 2k;
	request_pool_size 4k;
 
	gzip off;
 
	output_buffers 1 32k;
	postpone_output 1460;
 
	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
 
	keepalive_timeout 75 20;
 
	ignore_invalid_headers on;
 
	index index.html;
 
	server {
		listen 127.0.0.1;
		server_name localhost;
 
		access_log /var/log/nginx/localhost.access_log main;
		error_log /var/log/nginx/localhost.error_log info;
 
		root /var/www/localhost/htdocs;
	}
}

Доступ к нескольким сайтам

Через директиву include возможно использовать конфигурации из разных файлов:

ФАЙЛ /etc/nginx/nginx.confКонфигурация для нескольких сайтов
user nginx nginx;
worker_processes 1;
 
error_log /var/log/nginx/error_log info;
 
events {
	worker_connections 1024;
	use epoll;
}
 
http {
	include /etc/nginx/mime.types;
	default_type application/octet-stream;
 
	log_format main
		'$remote_addr - $remote_user [$time_local] '
		'"$request" $status $bytes_sent '
		'"$http_referer" "$http_user_agent" '
		'"$gzip_ratio"';
 
	client_header_timeout 10m;
	client_body_timeout 10m;
	send_timeout 10m;
 
	connection_pool_size 256;
	client_header_buffer_size 1k;
	large_client_header_buffers 4 2k;
	request_pool_size 4k;
 
	gzip off;
 
	output_buffers 1 32k;
	postpone_output 1460;
 
	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
 
	keepalive_timeout 75 20;
 
	ignore_invalid_headers on;
 
	index index.html;
 
	include /etc/nginx/conf.d/*.conf;
}
ФАЙЛ /etc/nginx/conf.d/local.confПростой хост
server {
        listen 127.0.0.1;
        server_name localhost;
  
        access_log /var/log/nginx/localhost.access_log main;
        error_log /var/log/nginx/localhost.error_log info;
  
        root /var/www/localhost/htdocs;
}
ФАЙЛ /etc/nginx/conf.d/local-ssl.confПростой SSL хост
server {
    listen 443 ssl;
    server_name host.tld;
    ssl_certificate /etc/ssl/nginx/host.tld.pem;
    ssl_certificate_key /etc/ssl/nginx/host.tld.key;
}

Поддержка PHP

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

ФАЙЛ /etc/nginx/nginx.confПоддержка PHP
...
http {
...
    server { 
    ...
            location ~ \.php$ {
                       # Проверка на несуществующие скрипты или ошибку 404
                       # Без этой строки nginx будет сразу отправлять любые запросы, оканчивающиеся на .php, в php-frm
                       try_files $uri =404;
                       include /etc/nginx/fastcgi.conf;
                       fastcgi_pass unix:/run/php-fpm.socket;
           }
    }
}

Для такой конфигурации необходимо собрать PHP с поддержкой менеджера процессов FastCGI (dev-lang/php), включив USE-флаг fpm:

root #echo "dev-lang/php fpm" >> /etc/portage/package.use

Пересоберите PHP с включенным fpm USE-флагом:

root #emerge --ask dev-lang/php
Заметка
Использование UNIX-сокета для взаимодействия является предпочтительной и рекомендуемой конфигурацией
Заметка
Using UNIX socket communication is the preferred and recommended configuration

Для PHP 7.0 и более новых версий конфигурационные файлы выглядят немного иначе:

ФАЙЛ /etc/php/fpm-php7.1/fpm.d/www.confЗапуск PHP поддержкой UNIX-сокета
listen = /run/php-fpm.socket
listen.owner = nginx

Установите часовой пояс в php-frm (файл php.ini). Замените <PUT_TIMEZONE_HERE> на подходящее значение:

ФАЙЛ /etc/php/fpm-php5.5/php.iniНастройка часового пояса в php.ini
date.timezone = <введите часовой пояс здесь>

Запуск демона php-fpm:

root #/etc/init.d/php-fpm start

Добавьте php-fpm в уровень запуска default:

root #rc-update add php-fpm default

Перезагрузите nginx с измененной конфигурацией:

root #/etc/init.d/nginx reload

Другой вариант, для systemd:

root #systemctl enable php-fpm@7.1
root #systemctl start php-fpm@7.1

Список доступа по IP-адресам

Следующий пример демонстрирует получение доступа по конкретному URL (в данном случае /nginx_status):

  • конкретные хосты (например 192.0.2.1 127.0.0.1)
  • и IP-сети (например 198.51.100.0/24)
ФАЙЛ /etc/nginx/nginx.confВключение и настройка списков доступа по IP-адресу для страницы /nginx_status
http {
    server { 
            location /nginx_status {
                     stub_status on;
                     allow 127.0.0.1/32;
                     allow 192.0.2.1/32;
                     allow 198.51.100.0/24;
                     deny all;
             }
     }
}

Базовая аутентификация

nginx может ограничить доступ к ресурсам с помощью проверки имя пользователя и пароля:

ФАЙЛ /etc/nginx/nginx.confВключение и настройка аутентификации пользователя для /
http {
    server { 
            location / {
                   auth_basic           "Authentication failed";
                   auth_basic_user_file conf/htpasswd;
             }
     }
}

Файл htpasswd может быть сгенерирован следующим образом:

The htpasswd file can be generated using:

user $openssl passwd

Geolocation using GeoIP2

The GeoIP2 module makes use of GeoIP2 databases by Maxmind or similar. Using Maxmind is already supported in Gentoo through net-misc/geoipupdate. However, registration of an account is required in order to obtain a free license key and download the free database.

Downloading Maxmind GeoIP2 databases

Once an account is created, install and configure geoipupdate:

root #emerge --ask net-misc/geoipupdate

Enter the account and license key:

ФАЙЛ /etc/GeoIP.confAdd your account info
AccountID YOURID
LicenseKey YOURKEY
EditionIDs GeoLite2-ASN GeoLite2-City GeoLite2-Country

After that, you'll need to download the databases:

root #geoipupdate

In order receive updates automatically in the future, add this command to a weekly cronjob or systemd timer.

Add GeoIP2 support to Nginx

To enable to modules and rebuild Nginx:

ФАЙЛ /etc/portage/package.use/nginxAdd the modules to Nginx
www-servers/nginx NGINX_MODULES_HTTP: geo geoip2
Заметка
The geoip module only supports the GeoIP legacy database.

Rebuild nginx with the third party modules enabled:

root #emerge --ask www-servers/nginx

Once Nginx has been rebuild, point Nginx to the databases and the GeoIP2 variables:

ФАЙЛ /etc/nginx/nginx.confPointing to the GeoIP2 databases and its values
http {
...
    geoip2 /usr/share/GeoIP/GeoLite2-City.mmdb {
        auto_reload 5m;
        $geoip2_metadata_city_build metadata build_epoch;
        $geoip2_data_city_name city names en;
        $geoip2_data_city_geonameid city geoname_id;
        $geoip2_data_continent_code continent code;
        $geoip2_data_continent_geonameid continent geoname_id;
        $geoip2_data_continent_name continent names en;
        $geoip2_data_country_geonameid country geoname_id;
        $geoip2_data_country_code iso_code;
        $geoip2_data_country_name names en;
        $geoip2_data_country_is_eu is_in_european_union;
        $geoip2_data_location_accuracyradius location accuracy_radius;
        $geoip2_data_location_latitude location latitude;
        $geoip2_data_location_longitude location longitude;
        $geoip2_data_location_metrocode location metro_code;
        $geoip2_data_location_timezone location time_zone;
        $geoip2_data_postal_code postal code;
        $geoip2_data_rcountry_geonameid registered_country geoname_id;
        $geoip2_data_rcountry_iso registered_country iso_code;
        $geoip2_data_rcountry_name registered_country names en;
        $geoip2_data_rcountry_is_eu registered_country is_in_european_union;
        $geoip2_data_region_geonameid subdivisions 0 geoname_id;
        $geoip2_data_region_iso subdivisions 0 iso_code;
        $geoip2_data_region_name subdivisions 0 names en;
    }

    geoip2 /usr/share/GeoIP/GeoLite2-ASN.mmdb {
        auto_reload 5m;
        $geoip2_data_autonomous_system_number autonomous_system_number;
        $geoip2_data_autonomous_system_organization autonomous_system_organization;
    }
...
}

The auto_reload option will allow updating the database without restarting Nginx.

For the GeoIP2 values to show up in a PHP application, assign them as fastcgi_param values:

ФАЙЛ /etc/nginx/fastcgi.confAdd GeoIP2 support to PHP
...
fastcgi_param GEOIP2_CITY_BUILD_DATE $geoip2_metadata_city_build;
fastcgi_param GEOIP2_CITY $geoip2_data_city_name;
fastcgi_param GEOIP2_CITY_GEONAMEID $geoip2_data_city_geonameid;
fastcgi_param GEOIP2_CONTINENT_CODE $geoip2_data_continent_code;
fastcgi_param GEOIP2_CONTINENT_GEONAMEID $geoip2_data_continent_geonameid;
fastcgi_param GEOIP2_CONTINENT_NAME $geoip2_data_continent_name;
fastcgi_param GEOIP2_COUNTRY_GEONAMEID $geoip2_data_country_geonameid;
fastcgi_param GEOIP2_COUNTRY_CODE $geoip2_data_country_code;
fastcgi_param GEOIP2_COUNTRY_NAME $geoip2_data_country_name;
fastcgi_param GEOIP2_COUNTRY_IN_EU $geoip2_data_country_is_eu;
fastcgi_param GEOIP2_LOCATION_ACCURACY_RADIUS $geoip2_data_location_accuracyradius;
fastcgi_param GEOIP2_LATITUDE $geoip2_data_location_latitude;
fastcgi_param GEOIP2_LONGITUDE $geoip2_data_location_longitude;
fastcgi_param GEOIP2_LOCATION_METROCODE $geoip2_data_location_metrocode;
fastcgi_param GEOIP2_LOCATION_TIMEZONE $geoip2_data_location_timezone;
fastcgi_param GEOIP2_POSTAL_CODE $geoip2_data_postal_code;
fastcgi_param GEOIP2_REGISTERED_COUNTRY_GEONAMEID $geoip2_data_rcountry_geonameid;
fastcgi_param GEOIP2_REGISTERED_COUNTRY_ISO $geoip2_data_rcountry_iso;
fastcgi_param GEOIP2_REGISTERED_COUNTRY_NAME $geoip2_data_rcountry_name;
fastcgi_param GEOIP2_REGISTERED_COUNTRY_IN_EU $geoip2_data_rcountry_is_eu;
fastcgi_param GEOIP2_REGION_GEONAMEID $geoip2_data_region_geonameid;
fastcgi_param GEOIP2_REGION $geoip2_data_region_iso;
fastcgi_param GEOIP2_REGION_NAME $geoip2_data_region_name;

fastcgi_param GEOIP2_ASN $geoip2_data_autonomous_system_number;
fastcgi_param GEOIP2_ASN_ORG $geoip2_data_autonomous_system_organization;

Сторонние модули

Скачайте исходные тексты сторонних модулей и поместите их в каталог /usr/src. Вручную скомпилируйте выбранный модуль Nginx, после чего добавьте соответствующие строки в /etc/portage/make.conf:

ФАЙЛ /etc/portage/make.confДобавление сторонних модулей
NGINX_ADD_MODULES="/usr/src/nginxmodule"

Пересоберите nginx с поддержкой сторонних модулей:

root #emerge --ask www-servers/nginx

Использование

Управление службой

OpenRC

Запуск nginx веб-сервера:

root #rc-service nginx start

Остановка nginx веб-сервера:

root #rc-service nginx stop

Добавление nginx в уровень запуска default, что позволит запускать сервис автоматически при загрузки системы:

root #rc-update add nginx default

Перезагрузка конфигурационных файлов nginx без сброса соединений:

root #rc-service nginx reload

Перезапуск nginx сервиса:

root #rc-service nginx restart

systemd

Запуск веб-сервера nginx:

root #systemctl start nginx

Остановка nginx веб-сервера:

root #systemctl stop nginx

Проверка статуса сервиса:

root #systemctl status nginx

Включение сервиса для автоматического запуска во время загрузки системы:

root #systemctl enable nginx

Перезагрузка конфигурационных файлов nginx без сброса соединений:

root #systemctl reload nginx

Перезапуск nginx сервиса:

root #systemctl restart nginx

Устранение проблем

В случае проблем следующие команды помогут найти ошибки.

Проверка конфигурации

Проверьте, что запущенная конфигурация nginx не содержит ошибок.

root #/usr/sbin/nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

При запуске nginx с параметром -t будет произведена проверка синтаксиса файла конфигурации без запуска самого демона nginx. Используйте параметр -c и полный путь до файла, чтобы протестировать файлы находящиеся по нестандартному пути.

Проверка запущенных процессов

Проверьте, запущены ли процессы nginx:

user $ps aux | egrep 'nginx|PID'
  PID TTY      STAT   TIME COMMAND
26092 ?        Ss     0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
26093 ?        S      0:00 nginx: worker proces

Проверка адреса привязки и портов

Проверьте, что демон nginx прослушивает правильный TCP-порт (например, 80 для HTTP или 443 для HTTPS):

root #netstat -tulpen | grep :80
tcp        0      0 127.0.0.1:80            0.0.0.0:*               LISTEN      0          12336835   -26092/nginx: master

См. также

Внешние ресурсы