Настройка веб-сервера Nginx

Here is the complete guide on how to host any tech stack on an Ubuntu machine. Here, I’ve covered all the aspects like front-end hosting, back-end hosting with reverse proxy along with image serving route. This article would be your one stop for the complete deployment at production or development environment. So, let’s get started…

The article will cover nginx runnable examples from basic web servers, HTTPS termination, reverse proxy, load balancing and content cache.

Nginx is a web server which can also be used as a reverse proxy, load balancer, mail proxy and HTTP cache. The software was created by Igor Sysoev and first publicly released in 2004.

I got a chance to work with a project using nginx intensively. On the way, I spend some time experimenting with it. Here I record down my exploration of nginx.

  • Как установить Nginx на Ubuntu: пошаговая инструкция

Nginx — это один из самых востребованных веб-серверов с открытым исходным кодом. Зачастую он используется как веб-сервер, обратный или почтовый прокси-сервер.

В данной статье мы подробно расскажем, как установить Nginx на Ubuntu и произвести его базовую настройку.

установки сервера Nginx понадобится локальная машина либо с установленной операционной системой Ubuntu. Программа доступна в официальных репозиториях Ubuntu по умолчанию. Установить её можно непосредственно из них, используя систему управления пакетами apt

  1. Для начала нужно обновить списки пакетов из репозиториев:
sudo apt update
  1. После окончания процесса обновления пакетов можно установить Nginx
sudo apt install nginx
  1. Дождемся окончания установки, а после добавим программу в автозагрузку:
sudo systemctl enable nginx
  1. Теперь нужно проверить, что веб-сервер успешно установлен и работает, а также добавлен в автозагрузку. Проверим статус работы веб-сервера:
sudo service nginx status

Image3

  1. Теперь проверим его наличие в автозагрузке:
sudo systemctl is-enabled nginx

Если в ответ на выполненную команду получаем «enabled», значит веб-сервер добавлен в автозагрузки.

Для работы с установленным веб-сервером пригодятся базовые команды управления. Они приведены в таблице ниже. 

Веб-сервер Nginx — это один из самых популярных веб-серверов с очень высокой производительностью и быстрой обработкой статических запросов от пользователей. При правильной настройке можно добиться очень высокой производительности от этого веб-сервера. Nginx очень быстро справляется со статическими файлами, будь то html страницы или другие виды ресурсов.

В одной из предыдущих статей мы уже рассматривали установку Nginx в Ubuntu и настройку его основных параметров, в этой же статье я хочу больше остановиться на производительности и подготовке веб-сервера к использованию в боевых условиях. Что касается дистрибутива Linux, то сегодня мы будем рассматривать CentOS, эта система часто используется на серверах и с настройкой Nginx тут могут возникнуть некоторые сложности. Дальше будет рассмотрена настройка Nginx CentOS, поговорим как включить полную поддержку http2, google pagespeed, и настроить основной конфигурационный файл.

В официальных репозиториях CentOS есть Nginx и он, скорее всего, уже установлен в вашей системе. Но мы хотим чтобы сайт работал по протоколу http2, который позволяет передавать все данные одним подключением, а это увеличивает производительность. Для работы по http2 вам понадобиться настроить SSL сертификат, но об этом уже написано в статье получение сертификата Lets Encrypt Nginx. Но это еще не все. для переключения с обычного SSL на HTTP2.0 в большинстве браузеров сейчас используется протокол ALPN, а он поддерживается начиная с OpenSSL 1.02. В то время, как в репозиториях есть только OpenSSL 1.01. Поэтому нам нужно установить версию Nginx, собранную с OpenSSL 1.02. Для этого можно использовать Broken Repo:

sudo yum -y install yum-utils
# sudo yum-config-manager --add-repo https://brouken.com/brouken.repo

Если вы используете репозиторий EPEL, то нужно указать что не надо из него брать Nginx:

 sudo yum-config-manager --save --setopt=epel.exclude=nginx*;

Теперь для установки правильной версии Nginx достаточно набрать:

sudo yum install nginx

Будет установлена самая последняя версия Nginx 1.13.2, с полной поддержкой ALPN. Дальше перейдем к настройке.

In this article I will tell you where Nginx server is installed and how to find out it’s configuration file after installation. It is very useful when you jump into an existing Nginx server and just want to find and modify it’s configuration files.

1. How To Find Nginx Install Path And Configuration Files.

There are several commands that you can use to find Nginx installation path and it’s configuration files path.

  1. Open a terminal and run whereis nginx command to return where the Nginx binary file is. But the Nginx bin directory path should exist in PATH system environment.
    $ whereis nginx
    nginx: /usr/bin/nginx /usr/local/nginx
    
    $ echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
  2. If there are multiple Nginx binary file path records in above command result, you can run which nginx to show the currently used Nginx binary file path.
    $ which nginx
    /usr/bin/nginx
  3. You can run command ls -al /usr/bin/nginx to get the Nginx binary file linked real Nginx server binary file as below.
    $ ls -al /usr/bin/nginx 
    lrwxrwxrwx. 1 root root 28 Dec 21 08:30 /usr/bin/nginx -> /www/server/nginx/sbin/nginx
  4. If the Nginx binary file path do not exist in environment variable PATH value, you can run ps -ef | grep nginx command to list currently running Nginx process information.
    $ ps -ef|grep nginx
    root      1412     1  0 Dec21 ?        00:00:00 nginx: master process /www/server/nginx/sbin/nginx -c /www/server/nginx/conf/nginx.conf
  5. From above ps -ef|grep nginx command, we can see Nginx binary file is  located at /www/server/nginx/sbin/nginx, and Nginx configuration file is located at /www/server/nginx/conf/nginx.conf.
  6. If the Nginx server is running now, you can also run command nginx -t to get and test the Nginx server configuration file.
    $ nginx -t
    nginx: the configuration file /www/server/nginx/conf/nginx.conf syntax is ok
    nginx: configuration file /www/server/nginx/conf/nginx.conf test is successful

2. Some Nginx Useful Commands.

  1. Command nginx -V/v can get current executing Nginx server version. The -V will return more detail version information.
    $ nginx -V
    nginx version: nginx/1.18.0
    built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
    built with OpenSSL 1.1.1i  8 Dec 2020
    ..............
    
    $ nginx -v
    nginx version: nginx/1.18.0
  2. Start / stop / restart / reload Nginx server.
    $ sudo systemctl start nginx
    
    $ sudo systemctl stop nginx
    
    $ sudo systemctl restart nginx
    
    $ sudo systemctl reload nginx
    
  3. Get Nginx running status.
    $ sudo systemctl status nginx
  4. Enable / Disable launch Nginx server when Linux server is started.
    $ sudo systemctl enable nginx
    
    $ sudo systemctl disable nginx
  5. Display Nginx command line help information.
    $ sudo systemctl -h nginx
    systemctl [OPTIONS...] {COMMAND} ...
    
    Query or send control commands to the systemd manager.
    
      -h --help           Show this help
         --version        Show package version
         --system         Connect to system manager
      -H --host=[[email protected]]HOST
                          Operate on remote host
      -M --machine=CONTAINER
                          Operate on local container
      -t --type=TYPE      List units of a particular type
         --state=STATE    List units with particular LOAD or SUB or ACTIVE state
    .........
    .........

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

PHP-FPM может получать скрипты, которые надо выполнить, с помощью TCP или Unix сокетов. Именно такой способ выполнения скриптов используется в Nginx. В этой статье мы рассмотрим как выполняется установка Nginx с PHP-FPM в Ubuntu.

Установить Nginx можно двумя способами. Первый способ заключается в установки пакета из официального репозитория Ubuntu. На момент написания статьи (1 августа 2021 года) актуальной версией Nginx присутствующей в репозитории Ubuntu была версия 1.18.0. Данная версия считается устаревшей. Актуальной же версией считается 1.20.1 (по состоянию на 1 августа 2021 года).

1. Официальные репозитории Ubuntu

Если вы хотите установить версию Nginx из репозиториев Ubuntu необходимо выполнить следующие действия. Для начала обновляем списки пакетов при помощи команды:

sudo apt update

Для того, чтобы установить Nginx, достаточно выполнить команду:

sudo apt -y install nginx

H6AxliGLm+DAAAAAAElFTkSuQmCC

После этого программу можно использовать. Проверка и настройка программы будет описана в разделах ниже.

2. Официальные репозитории Nginx

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

sudo apt update

Установите необходимые пакеты:

sudo apt -y install curl gnupg2 ca-certificates lsb-release

xD3plpLQbMoAAAAASUVORK5CYII=

Далее у вас на выбор есть два пути – подключить репозиторий со стабильной версией nginx или подключить репозиторий с основной версией. Стабильная версия является более проверенной и работоспособной. Эту версию можно использовать, как и в тестовых средах так и на производственных. Основная версия не такая стабильная и может содержать ошибки. Данную версию не рекомендуется использовать в производственных средах.

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

Для подключения репозитория с основной версией nginx, выполните следующую команду:

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

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

curl -o /tmp/nginx_signing.key https://nginx.org/keys/nginx_signing.key

f+vwD6Zz6Okg6KFAAAAABJRU5ErkJggg==

Проверьте, верный ли ключ был загружен:

gpg --dry-run --quiet --import --import-options import-show /tmp/nginx_signing.key

Вывод команды должен содержать полный отпечаток ключа 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62:

u4hGuUeZYzcCT6UUoZTmyfgDUTLZvOwL3TwAAAABJRU5ErkJggg==

Переместите ключ в каталог доверенных ключей apt:

sudo mv /tmp/nginx_signing.key /etc/apt/trusted.gpg.d/nginx_signing.asc

Чтобы установить nginx, выполните следующие команды:

sudo apt update

sudo apt -y install nginx

Версия Nginx от разработчиков немного отличается от версии из официальных репозиториев. Все дополнительные конфигурационные файлы здесь находятся в папке /etc/nginx/conf.d. Если вы хотите использовать папки sites-available и sites-enabled, то необходимо их создать:

sudo mkdir /etc/nginx/sites-available
sudo mkdir /etc/nginx/sites-enabled

Затем добавьте следующую строчку в конец секции http файла /etc/nginx.conf для того чтобы из папки /etc/nginx/sites-enabled загружалась конфигурация сайтов:

sudo vi /etc/nginx/nginx.conf

Затем перезапустите Nginx:

sudo nginx -s reload

3. Запуск Nginx

После установки пакета, проверяем что Nginx успешно запустился при помощи команды:

sudo systemctl status nginx

XvohZ4mPkk61tGeoX4Sw31vVI9lOlztfmiIba0O0QJ9ZkmUf07f5v7dbEtSWx+eyAAAAAElFTkSuQmCC

Если в статусе вместо active будет inactive (dead), то сервис необходимо запустить вручную при помощи команды:

sudo systemctl start nginx

Так же обратите внимание, что вы не можете запускать Apache и Nginx на одном порту. В таком случае вы получите ошибку nginx address already in use 80. Для корректной работы Nginx, необходимо будет отключить веб-сервер Apache (если он у вас используется) или изменить его порт с 80 (который используется по умолчанию) на другой свободный порт.

4. Настройка брандмауэра

По умолчанию брандмауэр закрывает все неразрешённые входящие подключения. Поэтому, чтобы к вашему веб-серверу можно было получить доступ извне, необходимо добавить его порт в исключения:

sudo ufw allow in 80/tcp

5. Проверка работы Nginx

После того, как Nginx будет запущен, он будет доступен по адресу сервера, на который он устанавливался. Вы можете проверить, всё ли работает, просто перейдя по адресу сервера, введя его в браузере. Для примера Nginx был установлен на localhost:

QGrObwHIDw4AAAAASUVORK5CYII=

Если вы увидите приветственное сообщение как на скриншоте выше это означает что Nginx успешно установлен и запущен.

Настройка Nginx

Администрирование веб-сервера представляет из себя изменение и поддержку конфигурационных файлов. Среди них 1 файл конфигурации и 2 каталога. Это nginx.conf, sites-available и sites-enabled соответственно. Все они лежат в директории /etc/nginx.

Рассмотрим более детально главный файл конфигурации. Для этого откроем его для просмотра, используя редактор:

sudo nano /etc/nginx/nginx.conf

После выполнения команды откроется файл, разделенный на модули. По умолчанию он выглядит так, как показано на рисунке ниже:

Image4

Каждый отдельный модуль — это директива, которая отвечает за определенные настройки веб-сервера. Они бывают простыми и блочными. Блочные директивы, помимо имени и параметров, хранят набор дополнительных инструкций, размещенных внутри фигурных скобок. 

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

  • worker_processes — число рабочих процессов сервера. Оно должно быть не больше, чем количество ядер процессора. Параметр auto установит число автоматически.
  • pid — файл с номером главного процесса.
  • include — отвечает за подключение иных файлов конфигурации, удовлетворяющих заданной маске.
  • events — контекст, состоящий из директив, влияющих на работу сетевого соединения.
    • worker_connections — максимальное число одновременно работающих соединений одного рабочего процесса.
    • multi_accept — флаг, который может быть как включен (on), так и выключен (off). Если он включен, то рабочий процесс будет принимать все новые соединения, иначе только одно.
    • use — указывает метод обработки соединений. По умолчанию сервер выбирает наиболее подходящий и эффективный.
  • http — контекст, состоящий из директив, отвечающих за работу HTTP-сервера.
    • sendfile — включает (on) или отключает (off) метод отправки данных sendfile().
    • tcp_nopush, tcp_nodelay — параметры, влияющие на производительность. Первый заставляет сервер отправлять заголовки HTTP-ответов одним пакетом, а второй позволяет не буферизировать данные и отправлять их короткими очередями.
    • keepalive_timeout — параметр, отвечающий за время ожидания keep-alive соединения до его разрыва со стороны сервера.
    • keepalive_requests — максимальное число запросов по одному keep-alive соединению.
    • error_log — лог ошибок веб-сервера. Для сбора ошибок в определенной секции (http, server и т.д.) необходимо разместить директиву внутри нее.
    • gzip — сжатие контента. 

Настройка Nginx

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

Сначала идут глобальные опции, которые задают основные параметры программы, например, от какого пользователя она будет запущена и количество процессов. Дальше есть секция events, в которой описано как Nginx будет реагировать на входящие подключения, затем идет секция http, которая объединяет все настройки касаемо работы протокола http. В ней находится секция server, каждая такая секция отвечает за отдельный домен, в секции server размещаются секции location, каждая из которых отвечает за определенный URL запроса, обратите внимание, что не файл на сервере, как в Apache, а именно URL запроса.

Основные глобальные настройки мы будем делать в файле /etc/nginx/nginx.conf. Дальше рассмотрим что именно будем менять и какие значения желательно установить. Начнем с глобальных опций:

  • user — пользователь, от имени которого будет запущен сервер, должен быть владельцем каталога с файлами сайта, и от имени его же нужно запускать php-fpm;
  • worker_processes — количество процессов Nginx, которые будут запущены, нужно установить ровно столько, сколько у вас есть ядер, например, у меня — 4;
  • worker_cpu_affinity — этот параметр позволяет закрепить каждый процесс за отдельным ядром процессора, установите значение auto, чтобы программа сама выбрала что и к чему крепить;
  • worker_rlimit_nofile — максимальное количество файлов, которые может открыть программа, на каждое соединение нужно как минимум два файла и каждый процесс будет иметь указанное вами количество соединений, поэтому формула такая: worker_processes * worker_connections* 2, параметр worker_connections разберем чуть ниже;
  • pcre_jit — включите этот параметр для ускорения обработки регулярных выражений с помощью JIT компиляции;

В секции events стоит настроить два параметра:

  • worker_connections — количество соединений для одного процесса, должно быть достаточным для обработки входящих соединений. Сначала нам нужно знать сколько этих входящих соединений есть, для этого смотрим статистику по адресу ip_сервера/nginx_status. Как включить рассмотрим ниже. В строке Active Connections видим количество активных соединений с сервером, также нужно учесть что соединения с php-fpm тоже считаются. Дальше обратите внимание на поля accepted и handled, первое отображает обработанных подключений, второе — количество принятых. Из значения должны быть одинаковыми. Если отличаются значит соединений не хватает. Смотрите примеры, первый снимок проблема, второй — порядок. Для моей конфигурации оптимальной может быть цифра в 200 соединений (всего 800, учитывая 4 процесса):

Настройка веб-сервера Nginx
Настройка веб-сервера Nginx

  • multi_accept — позволяет программе принимать несколько соединений одновременно, тоже ускоряет работу, при большом количестве соединений;
  • accept_mutex — установите значение этого параметра в off, чтобы сразу все процессы получали уведомление про новые соединения;

Также в секции events рекомендуется использовать директиву use epoll, так как этот самый эффективный метод обработки входящих соединений для Linux, но этот метод применяется по умолчанию, поэтому не вижу смысла добавлять его вручную. Рассмотрим еще несколько параметров из секции http:

  • sendfile — использовать метод отправки данных sendfile. Самый эффективный метод для Linux.
  • tcp_nodelay, tcp_nopush — отправляет заголовки и тело запроса одним пакетом, работает немного быстрее;
  • keepalive_timeout — таймаут поддержания соединения с клиентом, если у вас нет очень медленных скриптов, то будет достаточно будет 10 секунд, устанавливаем значение сколько нужно чтобы пользователь мог быть подключен к серверу;
  • reset_timedout_connection — разрывать соединения после таймаута.
  • open_file_cache — кэшировать информацию об открытых файлах. Например, open_file_cache max=200000 inactive=120s; max — максимальное количество файлов в кэше, время кэширования.
  • open_file_cache_valid — когда нужно проверить актуальность файлов. Например: open_file_cache_valid 120s;
  • open_file_cache_min_uses — кэшировать только файлы, которые были открыты указанное количество раз;
  • open_file_cache_errors — запоминать ошибки открытия файлов.
  • if_modified_since — устанавливает каким образом будут обрабатываться заголовки if-modified-since. С помощью этого заголовка браузер может получить ответ 304 если страница не изменилась с момента последнего просмотра. Возможны варианты — не отправлять — off, отправлять при точном совпадении времени — exact, отправлять если время совпадает точно или больше — before;

Вот как-то так будет выглядеть настройка nginx conf:

Настройка виртуальных хостов

Создадим папку для сайта:

sudo mkdir -p /var/www/testsite.dev/html

После добавим индексный файл:

sudo nano /var/www/testsite.dev/html/index.html

Заполним его минимальными данными для отображения сайта:

После создадим конфигурационный файл сайта в папке sites-available:

sudo nano /etc/nginx/sites-available/testsite.dev.conf

Заполним его простейшей конфигурацией:

Последнее, что осталось сделать, — это создать ссылку в директории sites-enabled на конфигурацию сайта testsite.dev, чтобы добавить его из доступных во включенные:

sudo ln -s /etc/nginx/sites-available/

После создания виртуального хоста проведем тестирование конфигурации:

sudo nginx -t

Отключим сайт по умолчанию, удалив запись о дефолтном виртуальном хосте:

sudo rm /etc/nginx/sites-enabled/default
sudo systemctl restart nginx

Image1

Другой вариант — воспользоваться командой curl:

Image2

Install nginx

Nginx is available in Ubuntu’s default repositories, so the installation is rather straightforward.

This would be our first interaction with the apt packaging system in this session. We would update our local package index; so that, we have access to the most recent package listings.

sudo apt-get update
sudo apt-get install nginx

After accepting the procedure, apt-get will install Nginx and any required dependencies to your server.

Step 2 — A Simple File Server

By default, nginx’s main configuration is /etc/nginx/nginx.conf. From the configuration file nginx.conf, we shall notice some lines like this which is used to include sub configuration files

The nginx image comes with a default configuration file /etc/nginx/conf.d/default.conf. It shall have some content like this.

Now we can access the files in the folder. Depending on the file type, the browser might just open it, or download it.

docker exec -it nginx cat /etc/nginx/nginx.conf
docker exec -it nginx cat /etc/nginx/conf.d/default.conf

Step 4 — Some Random Web Server

We need a web server for next two examples Reverse Proxy and Load Balancer.

Node.js is one of the most popular web server. We will use it to create two random web servers. It will just listening

const http = require('http')
const os = require('os')
const port = 3000
const server = http.createServer(requestHandler)
const http = require('http')
const os = require('os')
const port = 3000
const server = http.createServer(requestHandler)

The two files, serving.js and searching.js are almost identical with only small different to the response message. They are just listening on port 3000 and return back a message. The response message also include the hostname, so that we know which server was processing the request.

docker run -it --rm --name serving \
-p 3000:3000 \
-v $(pwd)/serving.js:/bin/serving.js \
node:11.12 node /bin/serving.js
docker run -it --rm --name searching \
-p 3001:3000 \
-v $(pwd)/searching.js:/bin/searching.js \
node:11.12 node /bin/searching.js

Access http://localhost:3000 for the model seving application.

Читайте также:  Zabbix JSONpath LLD

Access http://localhost:3001 for the model searching application.

Step 5 — Reverse Proxy

version: '3'
services:
nginx:
image: nginx:1.15
ports:
- "8080:80"
- "8443:443"
volumes:
- ./http.conf:/etc/nginx/conf.d/default.conf
- ./https.conf:/etc/nginx/conf.d/https.conf
- ./example.key:/etc/nginx/ssl/example.key
- ./example.crt:/etc/nginx/ssl/example.crt
depends_on:
- serving
- searching
serving:
image: node:11.12
hostname: serving
ports:
- "3000:3000"
volumes:
- ./serving.js:/bin/serving.js
command: bash -c "node /bin/serving.js"
searching:
image: node:11.12
hostname: searching
ports:
- "3001:3001"
volumes:
- ./searching.js:/bin/searching.js
command: bash -c "node /bin/searching.js"
    ssl_certificate /etc/nginx/ssl/example.crt;
ssl_certificate_key /etc/nginx/ssl/example.key;

We can now access, which works as pure reverse proxy

We can now access, which works as HTTPS termination, and reverse proxy at the same time.

Step 6 — Load Balancer

Load Balancers are very similar with reverse proxy. Reverse Proxy will direct traffic to different services based on the URL or ports.

While Load Balancer will direct traffic to the same services. It can be used for purpose like

  • Increase total capacity
  • Reduce response time
  • Achieve high availability
  • Rolling upgrade

The main configure item to have load balancer is upstream in nginx. Here comes a sample configuration.

    ssl_certificate /etc/nginx/ssl/example.crt;
ssl_certificate_key /etc/nginx/ssl/example.key;

One upstream servings is defined in the example. It includes two servers, serving1:3000 and serving2:3000. The upstream servings can then be used like a normal server like in the example.

  serving1:
image: node:11.12
hostname: serving1
ports:
- "3000:3000"
volumes:
- ./serving.js:/bin/serving.js
command: bash -c "node /bin/serving.js"
serving2:
image: node:11.12
hostname: serving2
ports:
- "3000:3000"
volumes:
- ./serving.js:/bin/serving.js
command: bash -c "node /bin/serving.js"
nginx:
image: nginx:1.15
ports:
- "8080:80"
- "8443:443"
volumes:
- ./http.conf:/etc/nginx/conf.d/default.conf
- ./https.conf:/etc/nginx/conf.d/https.conf
- ./example.key:/etc/nginx/ssl/example.key
- ./example.crt:/etc/nginx/ssl/example.crt
depends_on:
- serving1
- serving2

We can now access, which works as load balancer. The response message include the node to process it. Try to refresh couple times, the message shall change randomly.

Configure NGINX to serve your website

You’ll need to tell NGINX about your website and how to serve it.

cd into /etc/nginx/. This is where the NGINX configuration files are located.

The two directories we are interested in are sites-available and sites-enabled.

  • sites-available contains individual configuration files for all of your possible static websites.
  • sites-enabled contains links to the configuration files that NGINX will actually read and run.

The above code is for:

  • Deliver files from the folder /var/www/html or this can be path to your index.html.
  • The main index page is called index.html.
  • Requests that are requesting should be served by this server block.

Now, if you are about to restart NGINX you should see your site!

sudo systemctl restart nginx

Настройка брандмауэра

Установка и настройка брандмауэра позволит закрыть все порты, кроме необходимых нам — 22 (SSH), 80 (HTTP), 443 (HTTPS). Первый протокол необходим для подключения к удаленному серверу. Второй и третий необходим для связи между клиентом и сайтом. Главное их отличие в том, что HTTPS — это зашифрованный HTTP. Шифрование данных происходит благодаря SSL-сертификату.

Установим утилиту UFW:

sudo apt install ufw

После успешной установки добавим веб-сервер в список доступных приложений брандмауэра:

sudo nano /etc/ufw/applications.d/nginx.ini

Заполним файл следующим образом:

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

sudo ufw app list

Если среди них есть веб-сервер, значит всё сделано верно. Теперь нужно запустить брандмауэр и разрешить передачу трафика по вышеуказанным портам:

sudo ufw enable
sudo ufw allow 'Nginx Full'
sudo ufw allow 'OpenSSH'

Чтобы проверить изменения, вводим команду:

sudo ufw status

Если всё сделано правильно, то в статусе будут перечислены все порты, которые нам необходимы.

Удаление Nginx и PHP-FPM с Ubuntu

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

sudo apt -y purge nginx php7.4 php7.4-cli php7.4-fpm php7.4-json php7.4-pdo php7.4-mysql php7.4-zip php7.4-gd php7.4-mbstring php7.4-curl php7.4-xml php-pear php7.4-bcmath

Команда purge позволяет удалить не только пакеты, но и их конфигурационные файлы. Если вы хотите оставить конфигурационные файлы, используйте команду remove.

Step 3 — HTTPS

Data is not encrypted on transit when we using HTTP. It means any machine along the way will be able to see the data you send and received. For example, all machine connected to the same WIFI hotspot as you will be able to see your content.

HTTPS provide encryption for data on transit. Machines along the way will only see the encrypted data.

For HTTPS to work, we need to generate a keypair and obtain a certificate for the public key. There are various alternative for obtaining a certificate.

  • Using self signed certificate
  • Obtain a free public key certificate through https://letsencrypt.org/
  • Obtain public key certificate through a third party certificate authority.

For simplicity, we will just be using a self signed certificate.

openssl req -x509 -nodes \
-days 365 \
-newkey rsa:2048 \
-keyout example.key \
-out example.crt
    ssl_certificate /etc/nginx/ssl/example.crt;
ssl_certificate_key /etc/nginx/ssl/example.key;
docker run -it --rm --name nginx -p 8443:443 \
-v $(pwd)/https.conf:/etc/nginx/conf.d/https.conf \
-v $(pwd)/example.key:/etc/nginx/ssl/example.key \
-v $(pwd)/example.crt:/etc/nginx/ssl/example.crt nginx:1.15

Open a browser with link https://localhost:8443. We will just be warned by the browser that you connection is not private. Something like this.

Just click Advanced, and Proceed to localhost (unsafe).

Step 7 Content Cache

The performance of applications and web sites is a critical factor in their success. People are not patient enough to wait half minutes just wanna to see a web page.

We will use mostly same as previous example on Load Balancer. The first difference is add a 3 seconds to delay the reponse.

The other change is add cache configuration, like this.

proxy_cache_path /tmp/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;    ssl_certificate /etc/nginx/ssl/example.crt;
ssl_certificate_key /etc/nginx/ssl/example.key;

The most important part is proxy_cache_path which the cache will be stored.

Access https://localhost:8443/serving. And try to refresh. You shall notice, the response will return in 3 seconds. While for the later access with reflesh it, you will get the the response immediately since it is cached by nginx.

We can check the cache content inside the nginx server. Attach to docker container with command docker exec -it step7-cache_nginx_1 bash. All the cache content are under /tmp/cache

Hello, This is machine learning model serving application! from serving1

Configure NGINX to serve your Image folder

What does above code means

  • On /images route images can be accessed which is link to instance folder uploads/images. It will point to all images in images folder.

Настройка http2

Я не буду подробно описывать настройку секции server, потому что делал это уже в статье установка Nginx в Ubuntu и здесь мне нечего добавить, настройка SSL это достаточно обширная тема и тоже будет рассмотрена в отдельной статье. Но чтобы настроить http2 вам нужно иметь уже SSL. Далее, просто подправьте директиву listen в вашей секции server:

listen 194.67.215.125:443 default_server;

listen 194.67.215.125:443 http2 default_server;

Настройка веб-сервера Nginx

Вот таким простым способом можно включить http2 если перед этим была установлена правильная версия Nginx.

Подключение Nginx к PHP-FPM

Чтобы принимать запросы FastCGI от Nginx, PHP-FPM может прослушивать сокет TCP/IP или UNIX сокет. Сокеты UNIX являются средством межпроцессного взаимодействия, которое обеспечивает эффективный обмен данными между процессами, работающими в одной и той же операционной системе, в то время как сокеты TCP/IP позволяют процессам обмениваться данными по сети.

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

Таким образом, сокет UNIX является безопасным, поскольку его могут использовать только процессы на локальном хосте. Сокет TCP/IP может быть доступен из Интернета, и это может представлять угрозу безопасности, если не будут приняты дополнительные меры безопасности, такие как настройка брандмауэра.

Настройка PHP-FPM для прослушивания на сокете UNIX

Чтобы настроить PHP-FPM на прослушивание сокета UNIX, откройте файл конфигурации пула PHP-FPM по умолчанию, используя свой любимый текстовый редактор при помощи команды:

sudo nano /etc/php/7.4/fpm/pool.d/www.conf

Затем найдите директиву listen и задайте для нее путь к файлу сокета UNIX следующим образом — listen = /run/php/php7.4-fpm.sock

AT54R1KQtyVRAAAAAElFTkSuQmCC

Если вы используете сокет UNIX, вам также необходимо установить соответствующие разрешения на чтение/запись для файла, чтобы разрешить подключения с веб-сервера NGINX. По умолчанию Nginx работает как пользователь www-data в Ubuntu.

Найдите параметры listen.owner и listen.group и задайте им значение www-data. Также установите режим на 0660, для параметра listen.mode.

AMeHmlCV5NG0AAAAAElFTkSuQmCC

Настройка PHP-FPM для прослушивания через сокет TCP/IP

Хотя сокет UNIX быстрее сокета TCP/IP, он менее масштабируем, поскольку он может поддерживать межпроцессное взаимодействие только в одной и той же ОС. Если Nginx и внутренний сервер приложений (PHP-FPM) работают в разных системах, вам придется настроить php-fpm для прослушивания сокетов TCP/IP для удаленного подключения.

В файле конфигурации пула php-fpm установите адрес прослушивания, например: 127.0.0.1:9000. Убедитесь, что выбранный вами порт не используется другим процессом или службой в той же системе.

sudo nano /etc/php/7.4/fpm/pool.d/www.conf

Найдите параметр listen и пропишите адрес — 127.0.0.1:9000:

3r2fP55BJ5H4HkEnkfgeQSeR+B5BJ5H4Fc+Av8Fi17RJN3EipsAAAAASUVORK5CYII=

Сохраните изменения и закройте файл. Установка Nginx php fpm практически завершена.

Настройка Nginx для работы php-fpm

После того, как вы настроили адрес, который прослушивает PHP-FPM, вам нужно настроить Nginx для запроса прокси к нему через этот адрес, используя параметр конфигурации fastcgi_pass, который располагается в файле конфигурации блока виртуального хоста.

Читайте также:  Раскройте возможности прокси-сервера с FreeBSD: защитите просмотр веб-страниц!

Для примера, возьмем файл конфигурации стандартной странички сайта nginx которая открывается при первом запуске nginx, расположенный по следующему пути — /etc/nginx/conf.d/default.conf, откроем его для редактирования:

sudo nano /etc/nginx/conf.d/default.conf

Если вы настроили PHP-FPM для прослушивания на сокете UNIX, найдите блок местоположения для обработки файлов .php и установите следующие параметры для fastcgi:

PPm8T9sFCqphhXPYAAAAABJRU5ErkJggg==

77uuHX+3wdga8j8HUEvo7A1xH4OgJfR+DrCHwdgS+PwL8F+DKOof+b0GoAAAAASUVORK5CYII=

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

sudo nginx -t

AL7jOSWckFOtAAAAAElFTkSuQmCC

Далее вам необходимо перезапустить службы, чтобы применить изменения, используя для этого команды:

sudo systemctl restart nginx
sudo systemctl restart php7.4-fpm

После перезапуска служб, подключение считается выполненным успешно. Можно создать файл index.php со следующим содержимым:

sudo vi /var/www/html

<?php phpinfo() ?>

Затем можно попытаться открыть эту страницу в браузере. Для этого в адресную строку надо ввести http://localhost/index.php. Если всё было настроено верно, перед вами откроется такая страница:

Настройка веб-сервера Nginx

Для дальнейшей настройки PHP-FPM воспользуйтесь статьей по настройке PHP-FPM на Ubuntu 20.04 – Настройка PHP-FPM

Get Familiar with Important NGINX Files and Directories

So once you get to know how to manage the service itself, you should take a few minutes to familiarize yourself with a few important directories and files.

  • /var/www/html: The actual web content, which by default only consists of the default Nginx page you saw earlier, is served out of the /var/www/html directory. This can be changed by altering NGINX configuration files.
  • /etc/nginx: The NGINX configuration directory. All of the Nginx configuration files reside here.
  • /etc/nginx/nginx.conf: The main NGINX configuration file. This can be modified to make changes to the NGINX global configuration.
  • /etc/nginx/sites-available/: The directory where per-site “server blocks” can be stored. NGINX will not use the configuration files found in this directory unless they are linked to the sites-enabled directory (see below). Typically, all server block configuration is done in this directory, and then enabled by linking to the other directory.
  • /etc/nginx/sites-enabled/: The directory where enabled per-site “server blocks” are stored. Typically, these are created by linking to configuration files found in the sites-available directory.
  • /etc/nginx/snippets: This directory contains configuration fragments that can be included elsewhere in the NGINX configuration. Potentially repeatable configuration segments are good candidates for refactoring into snippets.
  • /var/log/nginx/access.log: Every request to your web server is recorded in this log fil unless and until NGINX is configured to do otherwise.
  • /var/log/nginx/error.log: Every NGINX error will be recorded in this log only.

Step 0 — Environment Preparation

We can install nginx in a physical machine, a virtual machine, a docker container.

  • Docker Installed
  • Have Internet Connection, might need turn off VPN, firewall if you are with some company network.

Fow Mac and Window, we can use docker desktop. Just download from the link, and install it.

For Linux, download a docker image with your preferred distribution using one of the links below.

Настройка PageSpeed

Google Pagespeed — это модуль Nginx, который выполняет различные оптимизации для того, чтобы страницы грузились быстрее, веб-сервер работал эффективнее, а пользователи не чувствовали дискомфорта. Сюда входит кэширование, оптимизация html кода, оптимизация картинок, объединение javascript и css кода и многое другое. Все это выполняется на уровне Nginx, поэтому эффективнее, чем если бы вы это делали в php. Но тут есть один недостаток, модуль удаляет заголовок Last Modified.

Дело в том, что PageSpeed устанавливает очень долгий строк кэширования для всех файлов, а в имя файла добавляет его хэш. Так скорость загрузки ресурсов выходит намного выше, поскольку браузер будет запрашивать файлы только с новым хэшем, а LastModified удаляется чтобы пользователи смогли увидеть изменения в случае если какой-либо файл будет изменен. А теперь рассмотрим как установить модуль. Нам придется собрать его из исходных кодов.

Сначала установите инструменты для сборки, очень важно, если не установите, потом получите ошибку и не будете знать что делать:

yum install wget gcc cmake unzip gcc-c++ pcre-devel zlib-devel

wget -c https://nginx.org/download/nginx-1.13.3.tar.gz
# tar -xzvf nginx-1.13.3.tar.gz

wget -c https://github.com/pagespeed/ngx_pagespeed/archive/v1.12.34.2-stable.zip
# unzip v1.12.34.2-stable.zip

cd ngx_pagespeed-1.12.34.2-stable/
# wget -c https://dl.google.com/dl/page-speed/psol/1.12.34.2-x64.tar.gz
# tar -xvzf 1.12.34.2-x64.tar.gz

wget -c https://www.openssl.org/source/openssl-1.0.2k.tar.gz -O /opt/lib/$OPENSSL.tar.gz
# tar xvpzf openssl-1.0.2k.tar.gz

Теперь нам нужно собрать модуль. Сначала смотрим опции, с которыми собран текущий Nginx:

А теперь переходим в папку с Nginx, подставляем все полученные опции, опцию —add-dynamic-module для PageSpeed, OpenSSL и пробуем собрать:

Если все было сделано правильно, то на выходе вы получите модуль ngx_pagespeed.so в папке obj, его нужно скопировать в папку /etc/nginx/modules:

Создаем папку для кэша:

mkdir -p /var/ngx_pagespeed_cache
# chown -R nginx:nginx /var/ngx_pagespeed_cache

Теперь добавьте такую строчку для включения модуля в /etc/nginx/nginx.conf:

Настройка веб-сервера Nginx

Затем, в секцию сервер достаточно добавить:

Настройка веб-сервера Nginx

Теперь вам достаточно перезапустить nginx чтобы изменения вступили в силу:

nginx -t
# systemctl restart nginx

Step 1 — A Simple HTTP Server

We will use the official nginx docker image in the article. The version tested is 1.15. Other version shall working as well.

docker run -it --name nginx --rm -p 8080:80 nginx:1.15

We can now open this link http://localhost:8080/ with a web browser. Something like this shall appear.

What we have learn so far …

Now that you have your web server installed, you have many options for the type of content to serve and the technologies you want to use to create a richer experience. To verify hit your public address on the browser and screen should look like this.

Установка PHP-FPM в Ubuntu

Следующим шагом будет установка интерпретатора языка программирования PHP и всех необходимых модулей для работы с PHP-FPM. Для установки всех необходимых модулей выполните команду:

sudo apt -y install php7.4 php7.4-cli php7.4-fpm php7.4-json php7.4-pdo php7.4-mysql php7.4-zip php7.4-gd php7.4-mbstring php7.4-curl php7.4-xml php-pear php7.4-bcmath

wN+GHKJ7xn5MAAAAABJRU5ErkJggg==

На момент написания статьи (1 августа 2021) актуальной версией PHP в официальных репозиториях Ubuntu считалась версия 7.4. Самая же последняя официальная версия PHP от разработчиков 8.0.9 (по состоянию на 29 июля 2021 года). После установки всех необходимых пакетов проверяем статус PHP-FPM:

systemctl status php7.4-fpm.service

Q2PdwAAAABJRU5ErkJggg==

Если в статусе вместо active будет inactive (dead), то сервис необходимо запустить вручную при помощи команды:

sudo systemctl start php7.4-fpm.service

После того, как сервис запустился, установка будет считаться выполненной.

Manage the NGINX Process

Now that you have your web server up and running, we can go over some basic management commands.

To stop your web server

sudo systemctl stop nginx

To start the web server when it is stopped

sudo systemctl start nginx

To stop and then start the service again

sudo systemctl restart nginx

If you are simply making configuration changes, NGINX can often reload without dropping connections. To do this, this command can be used

sudo systemctl reload nginx

By default, NGINX is configured to start automatically when the server boots. If this is not what you want, you can disable this behavior by typing:

sudo systemctl disable nginx

To re-enable the service to start up at boot

sudo systemctl enable nginx

To test your config file

sudo nginx -t

Configure NGINX to serve your backend

You’ll need to tell NGINX about your website and how to serve it.

cd into /etc/nginx/. This is where the NGINX configuration files are located.

The two directories we are interested in are sites-available and sites-enabled.

  • sites-available contains individual configuration files for all of your possible static websites.
  • sites-enabled contains links to the configuration files that NGINX will actually read and run.

What does above code means

  • On /api route back-end can be accessed which is link to out local-host process in port 8080

If you have gone through the entire blog, you might have understood everything on how to install nginx and configure it for your usage. The blog has also given you information about creating reverse proxy and creating redirects.

You can also visit nginx.org to know more about how to install and use the same.

Заключение

В данной статье мы разобрали процесс установки Nginx на Linux, а именно на дистрибутив Ubuntu. С помощью этой инструкции можно провести базовую настройку веб-сервера и развернуть на нем свой первый сайт. Кроме этого, сервер подготовлен к переходу на зашифрованный протокол данных. Для этого нужно получить SSL-сертификат и настроить переадресацию с HTTP-протокола на HTTPS. Для настройки защищенного соединения вам будет необходимо сертификат SSL — заказать его можно в панели управления в разделе «

Выводы

Настройка Nginx завершена, возможно, остались еще и другие оптимизации, которые помогут ускорить Nginx, но они не войдут в эту статью. А какие оптимизации используете вы? Напишите обязательно в комментариях! Надеюсь, эта информация была полезной вам.

Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.

Выводы

В этой статье мы разобрали, как выполняется установка Nginx PHP-FPM в Ubuntu 20.04. Как видите, это не очень сложно и с такой задачей может справиться даже новичок. Если у вас остались вопросы, оставляйте их в комментариях!

Conclusion

If you have gone through the entire blog, you might have understood everything on how to install nginx and configure it for your usage. The blog has also given you information about creating reverse proxy and creating redirects.

You can also visit nginx.org to know more about how to install and use the same. Connect with Adrixus to know more.

References

Nginx is a powerful application. There are many things can be realized with nginx. I bared scratch the surface of a big iceberg.

All the code can be found on https://github.com/rockie-yang/explore-nginx

Here is a list of doc, I refered.

Thanks Marc and Chenjun for editing.

Оцените статью
Хостинги