
Сборка Nginx из исходников в Ubuntu
25.03.2021 16:33 | Другое
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
перед командой.
Работает! Что и требовалось.
На этом на сегодня всё. Успехов!