How to install and run the nginx server on windows 10
Содержание:
- Define Custom Named Location Using @ (At Sign)
- Nginx location directive syntax explained
- Работа с сайтами разных пользователей на одном веб сервере
- Установка NGINX
- Обработка статики и ее кэширование
- Шаг 4. Создание скриптов запуска и остановки
- Exact Match Using = (Equalto Sign) Location Modifier
- Архитектура
- Настройка балансировщика нагрузки HAProxy
- Download the Nginx Server
- Немного теории о Nginx + php-fpm
- NGINX Beyond Web Serving
- Заключение
- Онлайн курс «Сетевой инженер»
Define Custom Named Location Using @ (At Sign)
You can also use @ (at symbol) in the location directive as shown in the example below.
The following are few things to keep in mind regarding this:
- Use @ to define a named location
- This location is configured as request redirection. This is not used for regular request processing.
- You cannot nest the @ location directives
The following is an example:
location / { try_files $uri $uri/ @custom; } location @custom { rewrite ^/(.+)$ /index.php?_route_=$1 last; }
In the above example:
- First, the @custom itself can be defined inside any other location block. As shown in the above example, this is defined in the 1st location block using try_files.
- Next, the “location @custom” refers to the @custom named location that was defined earlier in any other location block. This custom named location is used in the 2nd location block above.
- Please note that instead of @custom, you can call it anything you like. For example: @database, @myapp, @complexredirect, @misc, @thegeekstuff
Nginx location directive syntax explained
Below is the general structure of an Nginx block. The modifier is optional. The in the example below defines what will be checked against the request URI.
Regular expressions (RE) or literal strings can be used to define the modifier. If a modifier in present in the block, this will change the way that Nginx matches the block. The most important modifiers are:
- No modifier at all means that the location is interpreted as a prefix. To determine a match, the location will now be matched against the beginning of the URI.
- The equal sign can be used if the location needs to match the exact request URI. When this modifier is matched, the search stops right here.
- Tilde means that this location will be interpreted as a case-sensitive RE match.
- Tilde followed by an asterisk modifier means that the location will be processed as a case-insensitive RE match.
- Assuming this block is the best non-RE match, a carat followed by a tilde modifier means that RE matching will not take place.
Работа с сайтами разных пользователей на одном веб сервере
Самый простой способ решить проблему с правами доступа, это сделать владельцем папки с сайтом пользователя, который подключается по sftp. Тогда он сможет нормально работать с файлами, загружать и удалять их. Если доступ в качестве группы установить для nginx, то в целом все будет работать. Для каких-то сайтов такой вариант может оказаться подходящим. То есть сделать надо вот так:
# chown -R hl.zeroxzed.ru:nginx /web/sites/hl.zeroxzed.ru/ # chmod -R 0775 /web/sites/hl.zeroxzed.ru/
Но при такой схеме будут проблемы с движками сайтов, которые автоматом что-то к себе загружают. Какие-то галереи не будут работать. К примеру, wordpress не сможет автоматически загружать плагины, будет просить доступ к ftp. В общем, могут возникнуть некоторые неудобства. Сейчас мы их исправим.
Еще обращаю внимание на один нюанс. Chroot доступ для sftp не будет работать, если владельцем директории, куда чрутимся, будет не root
Только что мы сделали владельцем каталога с сайтом и всего, что внутри него пользователя hl.zeroxzed.ru. Теперь надо вернуть обратно владельцем исходного каталога рута, а все, что внутри него остается как мы и хотим — будет принадлежать hl.zeroxzed.ru.
# chown root:root /web/sites/hl.zeroxzed.ru/ # chmod 0755 /web/sites/hl.zeroxzed.ru/
# chown -R hl.zeroxzed.ru:hl.zeroxzed.ru /web/sites/hl.zeroxzed.ru/
Возвращаем обратно рута владельцем корня chroot.
# chown root:root /web/sites/hl.zeroxzed.ru/ # chmod 0755 /web/sites/hl.zeroxzed.ru/
Обращаю внимание, что сначала мы рекурсивно назначаем права на все содержимое директорий, а потом возвращаем владельца root только на корень. Добавляем пользователя nginx в группу hl.zeroxzed.ru
Добавляем пользователя nginx в группу hl.zeroxzed.ru.
# usermod -aG hl.zeroxzed.ru nginx
Создаем отдельный pool для php-fpm, который будет обслуживать сайт hl.zeroxzed.ru и будет запускаться от этого пользователя. Для этого копируем существующий конфиг /etc/php-fpm.d/www.conf и изменяем в нем несколько строк.
# cd /etc/php-fpm.d && cp www.conf hl.zeroxzed.ru.conf
user = hl.zeroxzed.ru group = hl.zeroxzed.ru listen = /var/run/php-fpm/hl.zeroxzed.ru.sock listen.owner = hl.zeroxzed.ru listen.group = hl.zeroxzed.ru
Мы поменяли название пула, запустили его от отдельного пользователя и назначили ему отдельный сокет. Теперь идем в настройки этого виртуального хоста в nginx — /etc/nginx/conf.d/hl.zeroxzed.ru.conf и везде меняем старое значение сокета
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
на новое
fastcgi_pass unix:/var/run/php-fpm/hl.zeroxzed.ru.sock;
Перезапускаем nginx и php-fpm и проверяем работу сайта от отдельного пользователя.
# systemctl restart nginx # systemctl restart php-fpm
Я рекомендую подключиться по sftp, закинуть исходники wordpress, установить его и добавить новую тему, чтобы проверить, что все корректно работает. По аналогии проделанные выше действия повторяются для всех остальных сайтов.
Установка 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
Запустим и добавим в автозагрузку:
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 умеет сам отдавать статические данные, не заставляя сервер backend этим заниматься. В настройке каждого сайта (секция server добавляем):
server {
…
location ~* ^.+\.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|docx|xls|xlsx|exe|pdf|ppt|tar|wav|bmp|rtf|js|svg|woff2|ttf)$ {
root /var/www/site
expires modified +1w;
}
}
* в данном примере для перечисленных статических файлов NGINX сам будет сам их отдавать. Сами файлы мы будем искать в каталоге /var/www/site, однако, опцию root можно и не задавать в location, если мы ее задали уровнем выше (в секции server). Также мы задали время кэширования для файлов, равное 1 недели от момента их модификации.
Шаг 4. Создание скриптов запуска и остановки
Для быстрого запуска набора Вам потребуется создать в каталоге c:\nginx\ 3 файла: start.cmd, shutdown.cmd и restart.cmd, предназначенные соответственно для запуска, остановки и перезапуска серверов.
Листинг файла start.cmd (запуск сервера):
@echo off echo Starting servers... set PHP_FCGI_MAX_REQUESTS=0 set SRVPATH=C:\nginx net start MySQL start /D%SRVPATH% nginx.exe %SRVPATH%\RunHiddenConsole.exe %SRVPATH%\php\php-cgi.exe -b 127.0.0.1:9000 -c %SRVPATH%/php/php.ini
Листинг файла shutdown.cmd (остановка сервера):
@echo off echo Shutting down servers... taskkill /IM nginx.exe /F taskkill /IM php-cgi.exe /F net stop MySQL
Листинг файла restart.cmd (перезапуск сервера):
@echo off echo Shutting down servers... taskkill /IM nginx.exe /F taskkill /IM php-cgi.exe /F net stop MySQL echo Starting servers... set PHP_FCGI_MAX_REQUESTS=0 set SRVPATH=C:\nginx net start MySQL start /D%SRVPATH% nginx.exe %SRVPATH%\RunHiddenConsole.exe %SRVPATH%\php\php-cgi.exe -b 127.0.0.1:9000 -c %SRVPATH%/php/php.ini
Если Вы изменили путь со стандартного C:\nginx\, на что-то другое, внесите соответствующие правки в скрипты.
Если требуется запускать сервер nginx+php+mysql при загрузке системы, то добавьте задание на автозапуск скрипта start.cmd с помощью оснастки Назначенные задания Windows.
Exact Match Using = (Equalto Sign) Location Modifier
Use the = (equal-to sign) as a modifier when you want to match the exact request URI.
To understand this, first, let us use the following simple configuration without the equal-to sign.
location /db { root /data; ... }
In the above, it will match the following URL. All of the following will work.
- URL/db – Will look for index.html file under /data/db
- URL/db/index.html – Will look for index.html file under /data/db
- URL/db/connect/index.html – Will look for index.html file under /data/db/connect
But, when we add the = (equalto sign) location modifier as shown below, the above behavior will change.
location = /db { root /data; }
In the above, it will match only the following EXACT URL. Nothing else will work.
- URL/db – Will work.
- URL/db/index.html – Will not work.
- URL/db/connect/index.html – Will not work.
Important: Also, in the above example, the root value will not be honored. This is because the /db will use the root from the “/” location that was defined earlier. So, when you go to the URL/db, it will really serve the index.html file from /var/www/html/db/ and not from /data/db/ as you would expected.
So, the above with the = (equal-to sign) will serve the following file when you call the URL as thegeekstuff.com/db
# ls -l /var/www/html/db/index.html -rw-r--r--. 1 root root 13 May 8 17:28 /var/www/html/db/index.html
Also, please note that when Nginx matches a particular location directive that has the = modifier, then will not look for any further location directives.
One popular configuration is to setup Nginx as a front-end to your existing Apache/PHP website. For this, you should use reverse proxy as per the instructions from here: How to Setup Nginx Reverse Proxy to Apache/PHP on Linux
Архитектура
В nginx рабочие процессы обслуживают одновременно множество соединений, мультиплексируя их вызовами операционной системы select, epoll (Linux) и kqueue (FreeBSD). Рабочие процессы выполняют цикл обработки событий от дескрипторов (см. Событийно-ориентированное программирование). Полученные от клиента данные разбираются с помощью конечного автомата. Разобранный запрос последовательно обрабатывается цепочкой модулей, задаваемой конфигурацией. Ответ клиенту формируется в буферах, которые хранят данные либо в памяти, либо указывают на отрезок файла. Буфера объединяются в цепочки, определяющие последовательность, в которой данные будут переданы клиенту. Если операционная система поддерживает эффективные операции ввода-вывода, такие, как writev и sendfile, то nginx применяет их по возможности.
Алгоритм работы HTTP-сервера выглядит следующим образом:
- получить очередной дескриптор из kevent(2);
- прочитать данные из файла и записать в socket, используя либо write(2)/read(2), например, так:
while ( ( cnt = read ( read_file_descriptor, buffer, block_size ), write ( socket_file_descriptor, buffer, count ) == cnt ) ) byte_count += count;
- либо используя системный вызов sendfile(2), выполняющий те же действия, что приведённый выше код, но в пространстве ядра;
- перейти к шагу 1.
Конфигурация HTTP-сервера nginx разделяется на виртуальные серверы (директива «server»). Виртуальные серверы разделяются на location’ы («location»). Для виртуального сервера возможно задать адреса и порты, на которых будут приниматься соединения, а также имена, которые могут включать «*» для обозначения произвольной последовательности в первой и последней части, либо задаваться регулярным выражением.
location’ы могут задаваться точным URI, частью URI либо регулярным выражением. location’ы могут быть сконфигурированы для обслуживания запросов из статического файла, проксирования на fastcgi/memcached сервер.
Для эффективного управления памятью nginx использует пулы. Пул — это последовательность предварительно выделенных блоков динамической памяти. Длина блока варьируется от 1 до 16 килобайт. Изначально под пул выделяется только один блок. Блок разделяется на занятую область и незанятую. Выделение мелких объектов выполняется путём продвижения указателя на незанятую область с учётом выравнивания. Если незанятой области во всех блоках не хватает для выделения нового объекта, то выделяется новый блок. Если размер выделяемого объекта превышает значение константы NGX_MAX_ALLOC_FROM_POOL либо длину блока, то он полностью выделяется из кучи.
Таким образом, мелкие объекты выделяются очень быстро и имеют накладные расходы только на выравнивание.
nginx содержит модуль географической классификации клиентов по IP-адресу. В его основу входит база данных соответствия IP-адресов географическому региону, представленная в виде radix tree (сжатое префиксное дерево или сжатый лес) в оперативной памяти. nginx предварительно распределяет первые несколько уровней дерева таким образом, чтобы они занимали ровно 1 страницу памяти. Это гарантирует, что при поиске IP-адреса для первых нескольких узлов при трансляции адреса всегда найдётся запись в TLB.
Настройка балансировщика нагрузки HAProxy
Приступим к установке и настройке HAProxy на сервере, который будет использоваться в качестве балансировщика нагрузки.
Установим HaProxy и выполним базовые настройки для работы балансировщика.
#yum install haproxy -y
Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile epel/x86_64/metalink ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Running transaction Installing : haproxy-1.5.18-9.el7.x86_64 1/1 Verifying : haproxy-1.5.18-9.el7.x86_64 1/1 Installed: haproxy.x86_64 0:1.5.18-9.el7 Complete!
Чтобы включить HaProxy, нужно добавить Enabled=1 в файл /etc/default/haproxy:
Теперь перейдем к самой настройке HaProxy. В нашей простейшей конфигурации сервер-балансировщик будет обрабатывать все http запросы и направлять их по очереди на backend-сервера.
log /dev/log local0 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon defaults mode http log global option httplog option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 frontend www bind IP_балансировщика:80 default_backend nginx_pool backend nginx_pool balance roundrobin mode http server web1 IP_первого_backend_сервера:80 check server web2 IP_второго_backend_сервера:80 check
После сохранения конфигурации, обязательно проверьте синтаксис командой:
Если все в порядке, вы получите подобный результат:
Configuration file is valid
После этого нужно перезапустить HaProxy и добавить его автозагрузку CentOS. А также открыть необходимые правила на файерволле.
#systemctl enable haproxy
#firewall-cmd —permanent –add-service=http
#firewall-cmd –reload
На этом настройка балансировщика закончена, проверим результат, открыв IP сервера с HaProxy в браузере:
Как видно, по очереди отдали контент оба сервера, балансировщик работает.
Download the Nginx Server
There are many Windows download versions of Nginx, and Nginx recommends using the “mainline version.” However, you will not find any issues if you download its most recent stable version for Windows.
Select the latest zip file and download it to a new folder.
As a first step, you need to extract the new folder. You can use 7-zip, WinRAR or any other popular compression software.
After extracting the file contents in the original folder, you have to move the entire folder that came with the built-in download copy. We will have to move this to “Program Files.”
Paste the folder in the program files. We will run Nginx from this location as a default web service program.
Немного теории о Nginx + php-fpm
В веб-сервере Apache php является подключаемым модулем, такая связка работает медленно и потребляет много ресурсов. Из-за этой неудачной архитектуры, Apache обычно не может обработать более 200-300 запросов в секунду даже на очень мощном сервере. В Nginx же применена другая архитектура — сам веб-сервер Nginx обрабатывает только запросы на статику (картинки, css и прочее), а выполнение php отдает другому программному серверу — php-fpm. Php-fpm (FastCGI Process Manager) — это полностью самостоятельное программное обеспечение, его можно установить на одном сервере с Nginx (для небольших проектов), либо вынести на отдельный сервер. Большие проекты обычно обслуживают по несколько серверов с Nginx, php-fpm и базами данных.
Заменяя сервер Apache на Nginx + php-fpm, вы сможете ускорить обработку запросов пользователей и сильно сэкономить на «железе». Веб проект с посещаемостью до 10000 уникальных посетителей в день вполне сможет жить на самом дешевом виртуальном сервере от DigitalOcean за 5$ в месяц. Кстати, если вы перейдете по этой ссылке — DigitalOcean, вы получите 10$ при регистрации, а это 2 месяца использования виртуального сервера. Никаких дополнительных условий при этом там нет.
Но перейдем к делу. Я буду описывать процесс установки и настройки на примере CentOS 6.x, но он не сильно будет отличаться и для других дистрибутивов Linux.
NGINX Beyond Web Serving
Though NGINX became famous as the fastest web server, the scalable underlying architecture has proved ideal for many web tasks beyond serving content. Because it can handle a high volume of connections, NGINX is commonly used as a reverse proxy and load balancer to manage incoming traffic and distribute it to slower upstream servers – anything from legacy database servers to microservices.
NGINX also is frequently placed between clients and a second web server, to serve as an SSL/TLS terminator or a web accelerator. Acting as an intermediary, NGINX efficiently handles tasks that might slow down your web server, such as negotiating SSL/TLS or compressing and caching content to improve performance. Dynamic sites, built using anything from Node.js to PHP, commonly deploy NGINX as a content cache and reverse proxy to reduce load on application servers and make the most effective use of the underlying hardware.
Заключение
На этом у меня все. Не рассмотрел еще один возможный вариант, когда вы проксируете https сайт и передаете инфу на бэкенд тоже по https. Нет под рукой готового примера, чтобы проверить, а заочно не стал рисовать конфиг. По идее, ничего сложного в этом нет, настраиваете nginx на обоих серверах с одним и тем же сертификатом. Но наверняка не скажу, что все заработает при этом. Возможно, есть какие-то нюансы с таким проксированием. Мне обычно не приходится так делать.
Как я уже писал в начале, в основном проксирую запросы с одного внешнего веб сервера на закрытый периметр сети, куда нет никому доступа. В этом случае у меня нет необходимости использовать https при передаче запросов на бэкенд. В качестве бэкенда не обязательно будет отдельный сервер. Это запросто может быть контейнер на этом же сервере.
Онлайн курс «Сетевой инженер»
Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные сети, рекомендую познакомиться с онлайн-курсом «Сетевой инженер» в OTUS. Это авторская программа в сочетании с удалённой практикой на реальном оборудовании и академическим сертификатом Cisco! Студенты получают практические навыки работы на оборудовании при помощи удалённой онлайн-лаборатории, работающей на базе партнёра по обучению — РТУ МИРЭА: маршрутизаторы Cisco 1921, Cisco 2801, Cisco 2811; коммутаторы Cisco 2950, Cisco 2960.
Особенности курса:
- Курс содержит две проектные работы.;
- Студенты зачисляются в официальную академию Cisco (OTUS, Cisco Academy, ID 400051208) и получают доступ ко всем частям курса «CCNA Routing and Switching»;
- Студенты могут сдать экзамен и получить вместе с сертификатом OTUS ещё сертификат курса «CCNA Routing and Switching: Scaling Networks»;
Проверьте себя на вступительном тесте и смотрите программу детальнее по .