Сборка Nginx из исходников в Ubuntu

Сборка Nginx из исходников в Ubuntu

OS: Ubuntu 18.04

Фактически, установить nginx можно с помощью двух строк:

sudo apt update
sudo apt install nginx

 

что, собственно, я когда-то и сделал на своём десктопе. А вот на лэптопе решил поэкспериментировать.

Сборка и установка

Для начала обновим списки пакетов и репозиториев:

sudo apt-get update

 

Следующий шаг - загрузка исходников nginx. Для этого заходим на сайт nginx в секцию download, поскольку я буду устанавливать сервер на ноутбук (читайте, локальную машину), я скачаю Mainline version, в других случаях предпочёл бы Stable). Кликаем со ссылке правой клавишей мыши, копируем линк, скачиваем в любую директорию (в Вашем случае версия может отличаться):

wget http://nginx.org/download/nginx-1.19.8.tar.gz

 

и распаковываем (в эту же директорию):

tar -zxvf nginx-1.19.8.tar.gz

 

После мы должны увидеть директорию с исходниками:

$ ll
drwxr-xr-x  8 serhii75 serhii75     4096 бер  9 17:27 nginx-1.19.8/
-rw-rw-r--  1 serhii75 serhii75  1060155 бер  9 17:32 nginx-1.19.8.tar.gz

 

Команды будем запускать от имени root, поэтому выполним:

sudo su

 

Переходим в nginx-1.19.8 (опять-таки, у Вас может быть другая версия) и попробуем сконфигурировать исходники для сборки:

# cd nginx-1.19.8/
nginx-1.19.8# ./configure

 

Если после выполнения этой команды получили ошибку об отсутствии компилятора C:

./configure: error: C compiler cc is not found

 

...запустите команду:

# sudo apt-get install build-essential

 

Хотя c проблемой выше в этот раз не сталкивался, но получил другую ошибку:

./configure: error: the HTTP rewrite module requires the PCRE library.

 

Т.е. отсутствует библиотека для регулярных выражений (Perl Compatible Regular Expressions). На самом деле, запуская  ./configure, мы увидели чего не хватает. Что ж, установим необходимую библиотеку:

sudo apt-get install libpcre3 libpcre3-dev

 

а также библиотеки для компрессии и ssl:

sudo ap-get zlib1g zlib1g-dev libssl-dev

 

Снова запускаем ./configure и на этот раз никаких ошибок быть не должно. Посмотреть все возможные флаги конфигурации можно запустив:

# ./configure --help

 

что касается подробной информации, её найдёте здесь. Мы добавим несколько флагов:

  • --sbin-path=путь - задаёт имя исполняемого файла nginx, который используется для запуска/остановки сервиса nginx
  • --conf-path=путь - задаёт имя конфигурационного файла nginx.conf
  • --error-log-path=путь - задаёт имя основного файла ошибок, предупреждений и диагностики
  • --http-log-path=путь - задаёт имя основного файла регистрации запросов HTTP-сервера
  • --with-pcre - разрешает использование библиотеки PCRE
  • --pid-path=путь - задаёт имя файла nginx.pid, в котором будет храниться номер главного процесса
  • --with-http_ssl_module - разрешает сборку модуля для работы HTTP-сервера по протоколу HTTPS

В конечном итоге команда будет выглядеть так:

# ./configure --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-pcre --pid-path=/var/run/nginx.pid --with-http_ssl_module

 

Запускаем, и после звершения можем компилировать:

# make

 

После того, как компиляция будет завершена, инсталлируем:

# make install

 

Проверяем, прошла ли успешно установка (после выполнения команды увидим примерно следующее):

# nginx -V
nginx version: nginx/1.19.8
built by gcc 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04) 
built with OpenSSL 1.1.1  11 Sep 2018
TLS SNI support enabled
configure arguments: --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-pcre --pid-path=/var/run/nginx.pid --with-http_ssl_module

 

Запускаем nginx:

# nginx

 

Проверяем, запущен ли процесс:

# ps aux | grep nginx
root      8186  0.0  0.0  32960   808 ?        Ss   21:45   0:00 nginx: master process nginx
nobody    8187  0.0  0.0  37780  3572 ?        S    21:45   0:00 nginx: worker process
root      8198  0.0  0.0  15936  1016 pts/0    S+   21:45   0:00 grep --color=auto nginx

 

И, если проверим в браузере, набрав localhost, то увидим "Welcom to nginx!".

 

Создаём системный сервис

Сервис позволит не только запускать и останавливать nginx, но так же стартовать nginx при загрузке/перезагрузке системы. Идём сюда, и переходим по ссылке NGINX Systemd service file в секции Systemd. Как и сказано в инструкции, создаём файл:

nano /lib/systemd/system/nginx.service

 

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

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

 

Запускаем nginx:

systemctl start nginx

 

И проверяем есть ли процесс:

# ps aux | grep nginx
root      9564  0.0  0.0  32960   804 ?        Ss   22:07   0:00 nginx: master process /usr/sbin/nginx
nobody    9565  0.0  0.0  37780  3556 ?        S    22:07   0:00 nginx: worker process
root      9568  0.0  0.0  15936   992 pts/0    S+   22:07   0:00 grep --color=auto nginx

 

Судя по ответу всё в порядке. Поскольку теперь у нас есть сервис, мы можем посмотреть статус nginx используя команду:

# systemctl status nginx

 

что даст нам больше информации:

# systemctl status nginx
● nginx.service - The NGINX HTTP and reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; disabled; vendor preset: enabled)
   Active: active (running) since Thu 2021-03-25 22:07:33 EET; 11min ago
  Process: 9563 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 9562 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
 Main PID: 9564 (nginx)
    Tasks: 2 (limit: 4915)
   CGroup: /system.slice/nginx.service
           ├─9564 nginx: master process /usr/sbin/nginx
           └─9565 nginx: worker process

бер 25 22:07:33 serhii75-laptop systemd[1]: Starting The NGINX HTTP and reverse proxy server...
бер 25 22:07:33 serhii75-laptop nginx[9562]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
бер 25 22:07:33 serhii75-laptop nginx[9562]: nginx: configuration file /etc/nginx/nginx.conf test is successful
бер 25 22:07:33 serhii75-laptop systemd[1]: Started The NGINX HTTP and reverse proxy server.

 

На данный момент, после перезагрузки машины, nginx не будет запущен, что, очевидно, плохо для веб-сервера. Поэтому сделаем так, чтобы nginx "заводился" после ребута. 

 

Остановим сервис:

# systemctl stop nginx

 

И выполним:

systemctl enable nginx

 

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

Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /lib/systemd/system/nginx.service.

 

Перезагружаем лэптоп, открываем консоль и проверяем запущен ли nginx:

$ sudo systemctl status nginx
[sudo] password for serhii75: 
● nginx.service - The NGINX HTTP and reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2021-03-25 22:37:50 EET; 35s ago
  Process: 2006 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 1991 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
 Main PID: 2010 (nginx)
    Tasks: 2 (limit: 4915)
   CGroup: /system.slice/nginx.service
           ├─2010 nginx: master process /usr/sbin/nginx
           └─2011 nginx: worker process

бер 25 22:37:50 serhii75-laptop systemd[1]: Starting The NGINX HTTP and reverse proxy server...
бер 25 22:37:50 serhii75-laptop nginx[1991]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
бер 25 22:37:50 serhii75-laptop nginx[1991]: nginx: configuration file /etc/nginx/nginx.conf test is successful
бер 25 22:37:50 serhii75-laptop systemd[1]: Started The NGINX HTTP and reverse proxy server.

 

Примечание: поскольку мы теперь не под root-ом, понадобится добавлять sudo перед командой.

 

Работает! Что и требовалось.

На этом на сегодня всё. Успехов!