Запуск, остановка и тестирование сервера.
nginx.exe - Запуск сервера
nginx -s stop - Остановка сервера
nginx -s reload - Перезапуск сервера
nginx -t - Проверка правильности файла конфига
nginx -v - Версия сервера
Настройка nginx.conf:
# - это комментарий.
# Все директивы обязательно оканчиваются знаком ( ; ).
#user nobody;
worker_processes 1; # Число процессов равно числу ядер в процессоре.
include other_settings.conf; # include вставлет в это место настройки из другого файла конфига.
( Комментарии.
Содержимое other_settings.conf:
error_log logs/error.log;
pid logs/nginx.pid;
Примеры подключаемых файлов конфигов.
nginx.conf - главный конфигурационный файл сервера
mime.types - список расширений файлов и их соотвествий MIME types
fastcgi.conf - файл конфиг для FastCGI
proxy.conf - файл конфиг для Proxy
sites.conf - файл конфиг для сайтов, обслуживаемых сервером Nginx, также известный как virtual hosts. Рекомендуется создавать отдельные файлы для каждого домена.
)
include sites/*.conf; # Подключать можно сразу все конфигурационные файлы из папки, используя символ ( * ), вместо имен файлов.
http {
server {
listen 80; # Слушать порт 80
server_name example.com; # Домен http://www.example.com/
access_log /var/log/nginx/example.com.log; # Лог для сайта записывать в файл example.com.log
location ^~ /admin/ { # По адресу http://www.example.com/admin/ открывать файл index.php
index index.php;
access_log off; # Лог для страницы по адресу http://www.example.com/admin/ не записывать
}
}
}
(
Комментарии.
Единицы измерения.
k или K: Kilobytes
m или M: Megabytes
Примеры:
client_max_body_size 2M;
client_max_body_size 2048k;
Единицы времени.
ms: Milliseconds
s: Seconds
m: Minutes
h: Hours
d: Days
w: Weeks
M: Months (30 days)
y: Years (365 days)
Примеры:
client_body_timeout 3m;
client_body_timeout 180s;
client_body_timeout 180;
)
location ^~ /admin/ {
access_log logs/main.log;
log_format main '$pid - $nginx_version - $remote_addr'; # $pid, $nginx_version, $remote_addr - это подставляемые значения переменных. Как в PHP переменные начинаются со знака ( $ ).
}
Пример конфигурации сервера по умолчанию.
user boris admins; # Означает, что данный процесс будет главным - корневым, для всех других процессов. Процесс управляется из под аккаунта пользователя boris, находящегося в группе пользователей admins.
worker_processes 1; # Установка числа процессов по принципу 1 процесс на 1 ядро процессора или более.
worker_priority 0; # Установка приоритета работы программы Nginx над другими программами, запущенными в операционной системе. Приоритет работы изменяется от -20 (высший приоритет) до 19 (низший приоритет). 0 - обычный приоритет. Не стоит устанавливать значение меньше -5, так как это приоритет работы самой операционной системы.
error_log logs/error.log error; # Установка файла, куда записывать логи в случае возникновения ошибок.
log_not_found on; # Записывать ли в лог-файл ошибки 404 - Страница (или файл) не найдена или нет? on - записывать, off - не записывать. Для конкретных сайтов следует перезаписать эту директиву log_not_found off. Но стоит оставить её в режиме on для базовой конфигурации всего сервера.
events {
accept_mutex on;
accept_mutex_delay 500ms;
multi_accept off;
worker_connections 1024; # Предельное число возможных установленных одновременных соединений с сервером. Если число worker_processes 4, то общее число возможных одновременныз соединений в этом случае будет 1024 * 4 = 4096. Чем больше значение RAM и CPU, тем большее число соединений вы можете поддерживать.
}
Примеры рекомендуемых значений для компьютеров разных мощностей.
Главное значение имеет число worker_processes и worker_connections.
worker_processes должно соответствовать числу ядер в процессоре.
worker_connections зависит от величины RAM. Если значение worker_connections мало, то некоторые запросы со стороны браузеров могут оказаться не обработаны сервером. Установка данного значения зависит от числа пользователей, посещающих ваш сайт.
Низкий трафик
CPU: Dual-core (2 ядра)
RAM: 2 GB
Requests: ~ 1/s
worker_processes 2;
worker_rlimit_nofile 1024;
worker_priority -5;
worker_cpu_affinity 01 10;
events {
multi_accept on;
worker_connections 128;
}
Средний трафик
CPU: Quad-core (4 ядра)
RAM: 4 GB
Requests: ~ 50/s
worker_processes 4;
worker_rlimit_nofile 8192;
worker_priority 0;
worker_cpu_affinity 0001 0010 0100 1000;
events {
multi_accept off;
worker_connections 1024;
}
Высокий трафик
CPU: 8-core (8 ядер)
RAM: 12 GB
Requests: ~1000/s
worker_processes 8;
worker_priority 0;
events {
multi_accept off;
worker_connections 8192;
}
Таким образом, в качестве настроек сперва:
1. Устанавливаем пользователя user, из-под которого работает сервер.
2. Устанавливаем число рабочих процессов и соединений в зависимости о CPU и RAM.
3. Устанавливаем приоритет процессов сервера в операционной системе.
4. Прописываем адрес лог-файла.
5. Создаем тестовый сервер.
Типичная структура сервера.
http {
server {
server_name localhost;
listen 80;
location /downloads/ {
}
}
}
Тестовый сервер.
http { # Для соединений через протокол http://
include mime.types; # включаем файл-конфиг для mime.types
default_type application/octet-stream; # устанавливаем тип передачи
sendfile on;
keepalive_timeout 65; # устанавливаем время поддержания соединения
server {
listen 80; # ожидаем соединения на порту 80
server_name localhost; # домен сайта localhost (соотвествует ip-адресу сайта 127.0.0.1)
location / { # по адресу localhost/ загружаем файлы
root html; # загружаем html, если адрес localhost/
index index.html index.htm; # загружаем index.html или index.htm, если адрес localhost/index.html или localhost/index.htm, перебираем все файлы по порядку пока не найдем тот, который можно будет загрузить.
}
error_page 500 502 503 504 /50x.html; # Страницы с ошибками 500, 502, 503, 504 загружаются из файла localhost/50x.html
location = /50x.html {# по адресу localhost/50x.html загружаем файлы
root html; # загружаем html, если адрес localhost/50x.html
}
}
}
Полный рабочий пример тестового сервера Nginx.
# user boris admins;
worker_processes 1;
worker_priority 0;
error_log logs/error.log error;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/cotet-stream;
sendfile on;
keepalive_timeout 65;
log_not_found on;
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;
}
}
}
Для проверки правильности конфигурации в консоли запускаем команду
nginx -t
Методология работы тут такая:
1. Изменить конфигурацию.
2. Запустить тест.
3. Перезапустить сервер.
Программы для тестирования нагрузки на сервер:
httperf
Autobench
OpenWebLoad
Каждая из программ генерирует большое количество HTTP-запросов на сервер и приводит статистику результатов тестирования.
Апгрейд работающего сервера Nginx.
1. Заменить старый бинарник Nginx (по умолчанию он располагается в папке по адресу /usr/local/nginx/sbin/nginx) на новый.
2. Найти идентификатор процесса pid сервера Nginx в операционной системе по команде ps x | grep nginx | grep master или найдя его значение в pid-файле.
3. Послать сигнал USR2 (12) главному процессу —kill –USR2 ***, заменив *** на номер найденного pid в шаге 2. Эта процедура запустит обновление через переименование сторого .pid файла и запустит новый бинарник Nginx.
4. Послать сигнал WINCH (28) старому главному процессу —kill –WINCH ***, заменив *** на номер найденного pid в шаге 2. Эта процедура отключит старый рабочий процесс сервера.
5. Убедитесь в том, что старый рабочий процесс сервера уничтожен и затем пошлите сигна QUIT старому главному процессу —kill –QUIT ***, заменив *** на номер найденного pid в шаге 2.
С этого момента ваш сервер Nginx считается обновленным без потерь соединения с браузерами пользователей.
Пример передачи серврером заархивированных данных в формате gzip.
http {
# Включаем сжатие данных в gzip на уровне http блока
gzip on;
server {
server_name localhost; # домен сайта localhost
listen 80; # прослушиваем порт 80
location /downloads/ {
gzip off; # Отключаем отдачу архивированных данных для адреса localhost/downloads/
}
}
}
Как видно из примера, директивы внутри блока могут перезаписывать директивы внешнего блока.
Пример прописывания адресов.
http {
server {
server_name localhost; # домен
listen 127.0.0.1:80; # вместо домена можно полностью прописать ip-адрес и порт
root /var/www/website.com/html; # корневой адрес сайта, при переходе по адресу http://localhost/ файлы будут загружены их папки /var/www/website.com/html
location /admin/ { # адрес страницы сайта, при переходе по адресу http://localhost/admin/ файлы будут загружены их папки /var/www/locked/
alias /var/www/locked/;
}
error_page 404 /not_found.html; # при возникновении ошибки 404 будет загружена страница not_found.html
error_page 500 501 502 503 504 /server_error.html; # при возникновении ошибок 500 501 502 503 504 будет загружена страница server_error.html
error_page 403 http://website.com/; # при возникновении ошибки 403 будет загружена страница по адресу http://website.com/
location / {
try_files $uri $uri.html $uri.php $uri.xml
@proxy;
}
# Следующий блок @proxy - это именованный блок, значения из которого будут подставлены в блок выше, через переменную @proxy
location @proxy {
proxy_pass 127.0.0.1:8080;
}
}
}
Установка Mime types.
http {
include mime.types;
location /downloads/ {
default_type application/octet-stream;
types {
text/html html;
image/gif gif;
image/jpeg jpg;
}
}
}
Установка ограничений на ip-адреса.
location /admin/ {
limit_except GET {
allow 192.168.1.0/24;
deny all;
}
}
Установка базовой авторизации.
location /admin/ {
allow 192.168.1.0/24;
deny all;
auth_basic "Authentication required";
auth_basic_user_file conf/htpasswd;
}
Регулярные выражения в location.
server {
server_name website.com;
location ~ ^/abcd$ { # соответсвует, например, адресу http://website.com/abcd?param1¶m2
}
}
Приоритет адресов в location.
Nginx выбирает адреса в следующей приоритетной последовательности:
1. Есть модификатор ( = ), то есть четко указан точный адрес.
Например
location = /files/ {...}
2. Нет модификатора ( = ).
Например
location /files/ {...}
3. Есть модификатор ( ^~ ), то есть строка адреса должна начинаться с некоторой последовательности символов.
Например
location ^~ /doc {...}
4. Есть модификатор ( ~ ) или модификатор ( ~* ), то есть строка адреса должна соотвествовать условию регулярного выражения.
Например
location ~* ^/document$ {...}
5. Нет никакого модификатора.
Например
location /doc {...}
Перезаписывание адресов модуль Rewrite.
rewrite hel{2,}o /hello.php; # invalid
rewrite "hel{2,}o" /hello.php; # valid
rewrite 'hel{2,}o' /hello.php; # valid
server {
server_name website.com;
location ~* ^/(downloads|files)/(.*)$ {
add_header Capture1 $1;
add_header Capture2 $2;
}
}
server {
server_name website.com;
root /var/www/vhosts/website.com/httpdocs/;
location /storage/ {
internal;
alias /var/www/storage/;
}
location /documents/ {
rewrite ^/documents/(.*)$ /storage/$1;
}
}
Часто используемые варианты перезаписи адресов через Rewrite.
Поиск данных на сайте.
URI в строке браузера
http://website.com/search/some-search-keywords
Переписанный на сервере URI
http://website.com/search.php?q=some-search-keywords
Правило для Rewrite
rewrite ^/search/(.*)$ /search.php?q=$1?;
Страница пользователя на сайте.
URI в строке браузера
http://website.com/user/31/James
Переписанный на сервере URI
http://website.com/user.php?id=31&name=James
Правило для Rewrite
rewrite ^/user/([0-9]+)/(.+)$ /user.php?id=$1&name=$2?;
Передача нескольких параметров в адресной строке.
URI в строке браузера
http://website.com/index.php/param1/param2/param3
Переписанный на сервере URI
http://website.com/index.php?p1=param1&p2=param2&p3=param3
Правило для Rewrite
rewrite ^/index.php/(.*)/(.*)/(.*)$ /index.php?p1=$1&p2=$2&p3=$3?;
Стиль Wikipedia.
URI в строке браузера
http:// website.com/wiki/Some_keyword
Переписанный на сервере URI
http://website.com/wiki/index.php?title=Some_keyword
Правило для Rewrite
rewrite ^/wiki/(.*)$ /wiki/index.php?title=$1?;
Стиль новостного сайта.
URI в строке браузера
http://website.com/33526/us-economy-strengthens
Переписанный на сервере URI
http://website.com/article.php?id=33526
Правило для Rewrite
rewrite ^/([0-9]+)/.*$ /article.php?id=$1?;
Стиль форума.
URI в строке браузера
http://website.com/topic-1234-50-some-keywords.html
Переписанный на сервере URI
http://website.com/viewtopic.php?topic=1234&start=50
Правило для Rewrite
rewrite ^/topic-([0-9]+)-([0-9]+)-(.*)\.html$ /viewtopic.php?topic=$1&start=$2?;
Условная переадресация.
server {
if ($request_method = GET) {
...
}
if ($request_method = POST) {
...
}
}
Server Side Includes (SSI)
server {
server_name website.com;
location ~* \.shtml$ {
ssi on;
}
}
<html>
<head>
<!--# include file="header.html" -->
</head>
<body>
<!--# include file="body.html" -->
<!--# include virtual="/footer.php?id=123" -->
</body>
</html>
Установка главного файла Index (если никакой из файлов не указан в адресе, например, localhost/).
index file1 [file2…] [absolute_file];
Пример 1.
index index.php index.html index.htm;
Пример 2.
index index.php index2.php /catchall.php;
Показ всех файлов на сервере Autoindex.
autoindex on;
Включение базовой авторизации Basic Aithorization.
location /admin/ {
auth_basic "Admin control panel";
auth_basic_user_file access/password_file;
}
Разрешение доступа к содержимому страницы Access.
location {
allow 127.0.0.1; # разрешить только ip-адрес 127.0.0.1
deny all; # запретить все другие ip-адреса
}
Empty GIF.
location = /empty.gif {
empty_gif;
}
FLV.
location ~* \.flv {
flv;
}
Кэширование Memcached.
server {
server_name example.com;
location / {
set $memcached_key $uri;
memcached_pass 127.0.0.1:11211;
error_page 404 @notcached;
}
location @notcached {
internal;
# Если файл не найден, то переадать запрос далее прокси-серверу
proxy_pass 127.0.0.1:8080;
}
}
Замена ip-адреса клиента на статичный ip-адрес Real IP.
Данный модуль просто заменяет ip-адрес клиента на адрес установленный в заголовке X-Real-IP HTTP header для клиентов посещающих сайт за прокси или для получения адресов с правильными заголовками, если Nginx используется, как backend server. Для использования этой опции необходимо вставить директиву real_ip_header X-Real-IP или real_ip_header X-Forwarded-For. Затем необходимо определить доверенные ip-адреса, другими словами клиентов, которым дозволено использовать эти заголовки.
real_ip_header X-Forwarded-For;
set_real_ip_from 192.168.0.0/16;
set_real_ip_from 127.0.0.1;
SSL.
server {
listen 443;
server_name secure.website.com;
ssl on;
ssl_certificate /path/to/combined.crt;
ssl_certificate_key /path/to/secure.website.com.key;
}
Страница с описанием текущего состояния сервера.
location = /nginx_status {
stub_status on;
allow 127.0.0.1; # вы возможно захотите ограничить доступ к данной странице
deny all;
}
Взаимодействие Nginx с Django и Python.
server {
server_name .website.com;
listen 80;
root /home/website/www;
index index.html;
location / {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
include fastcgi_params;
}
}
Nginx как Reverse Proxy.
proxy_pass http://localhost:8080;
proxy_pass http://127.0.0.1:8080;
proxy_pass http://unix:/tmp/nginx.sock;
proxy_pass https://192.168.0.1;
proxy_pass http://localhost:8080/uri/;
proxy_pass http://unix:/tmp/nginx.sock:/uri/;
proxy_pass http://$server_name:8080;
--------------------------------------------------------------------------------------------------
# Используя upstream блок
upstream backend {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
location ~* \.php$ {
proxy_pass http://backend;
}
--------------------------------------------------------------------------------------------------
server {
server_name .example.com;
root /home/example.com/www;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
--------------------------------------------------------------------------------------------------
upstream apache {
server 192.168.0.1:80;
server 192.168.0.2:80;
server 192.168.0.3:80 weight=2;
server 192.168.0.4:80 backup;
}
server {
server_name .example.com;
root /home/example.com/www;
location / {
proxy_pass http://apache;
}
}
Комментариев нет:
Отправить комментарий