Установка Nginx на Ubuntu 24.04.1

Установка Nginx на Ubuntu 24.04.1
Photo by Carl Heyerdahl / Unsplash

Установка

Обновляем информацию о пакетах репозитория:

sudo apt-get update

Устанавливаем Nginx:

sudo apt install nginx

Обычно все устанавливается без вопросов, но бывает иное. Чтобы проверить, как работает сервис, выполняем:

sudo systemctl status nginx

В моем случае что-то пошло не по плану:

× nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: enabled)
     Active: failed (Result: exit-code) since Thu 2024-11-07 21:09:47 +07; 53s ago
       Docs: man:nginx(8)
    Process: 4159 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 4161 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=1/FAILURE)
        CPU: 24ms

ноя 07 21:09:45 home nginx[4161]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
ноя 07 21:09:45 home nginx[4161]: nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
ноя 07 21:09:46 home nginx[4161]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
ноя 07 21:09:46 home nginx[4161]: nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
ноя 07 21:09:46 home nginx[4161]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
ноя 07 21:09:46 home nginx[4161]: nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
ноя 07 21:09:47 home nginx[4161]: nginx: [emerg] still could not bind()
ноя 07 21:09:47 home systemd[1]: nginx.service: Control process exited, code=exited, status=1/FAILURE
ноя 07 21:09:47 home systemd[1]: nginx.service: Failed with result 'exit-code'.
ноя 07 21:09:47 home systemd[1]: Failed to start nginx.service - A high performance web server and a reverse proxy server.

80 порт занят, из-за этого NGinx не смог запуститься.

Not attempting to start NGINX, port 80 is already in use.

Это сообщение, если возникла проблемы может быть ещё в момент установки Nginx. Обычно порт держит Apache2, но всегда нужно проверить это. Для этого выполняем:

sudo netstat -tulpn | grep :80

У меня ответ был очевидным, порт 80 слушается Apache2 (хотя я его не ставил...):

tcp6       0      0 :::80                   :::*                    LISTEN      1246/apache2

Так как в моем случае мне нужна связка NGinx + Apache, Apache удалять не будем, но порт освободить нужно. Для этого идём в настройку портов Apache:

sudo nano /etc/apache2/ports.conf

Приводим файл к следующему виду:

# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf

Listen 8080

#<IfModule ssl_module>
#       Listen 443
#</IfModule>
#
#<IfModule mod_gnutls.c>
#       Listen 443
#</IfModule>

Здесь мы указали слушать Apache порт 8080, и отключили прослушивание дополнительных портов (в нашем случае 443), если установлены модули ssl_module и mod_gnutls.c. Сохраняем, выходим, перезапускаем Apache2, убеждаемся, что он работает:

sudo systemctl restart apache2

sudo systemctl status apache2

● apache2.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/apache2.service; enabled; preset: enabled)
     Active: active (running) since Thu 2024-11-07 21:24:55 +07; 5s ago
       Docs: https://httpd.apache.org/docs/2.4/
    Process: 4339 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
   Main PID: 4343 (apache2)
      Tasks: 6 (limit: 9346)
     Memory: 10.5M (peak: 10.9M)
        CPU: 83ms
     CGroup: /system.slice/apache2.service
             ├─4343 /usr/sbin/apache2 -k start
             ├─4345 /usr/sbin/apache2 -k start
             ├─4346 /usr/sbin/apache2 -k start
             ├─4347 /usr/sbin/apache2 -k start
             ├─4348 /usr/sbin/apache2 -k start
             └─4349 /usr/sbin/apache2 -k start

Запускаем Nginx, убеждаемся, что сервис работает:

sudo systemctl start nginx

sudo systemctl status nginx

● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: enabled)
     Active: active (running) since Thu 2024-11-07 21:26:16 +07; 4s ago
       Docs: man:nginx(8)
    Process: 4363 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 4365 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
   Main PID: 4366 (nginx)
      Tasks: 5 (limit: 9346)
     Memory: 3.6M (peak: 4.1M)
        CPU: 33ms
     CGroup: /system.slice/nginx.service
             ├─4366 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
             ├─4367 "nginx: worker process"
             ├─4368 "nginx: worker process"
             ├─4369 "nginx: worker process"
             └─4370 "nginx: worker process"

Проблема решена.

Настройки

Включаем автозапуск Nginx:

sudo systemctl enable nginx

Если используем UFW, проверяем, открыты ли 80 и 443 порты:

sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere

Отредактируем основной конфигурационный файл:

sudo nano /etc/nginx/nginx.conf

В блоке http находим и изменяем или создаем директиву client_max_body_size 20M; - значение устанавливаем максимальный лимит на размер загружаемого файла, в данном случае 20 мегабайт.

После сохранения проверяем конфигурацию sudo nginx -t, и конечно, перезагружаем сервер.

Файлы хостов

Создаем файл с настройками хоста, your_domain_name заменить на свой хост:

sudo nano /etc/nginx/sites-available/your_domain_name.conf

Скелет создания файла хоста для проксирования трафика на сервер Apache. your_domain_name и your_www_user заменить:

server {
        listen 80;
        server_name your_domain_name;

        access_log /home/your_www_user/data/logs/nginx.cloud.access.log;
        error_log /home/your_www_user/data/logs/nginx.cloud.error.log;

        #if ( $scheme = "http" ) {
        #       rewrite ^/(.*)$ https://$host/$1 permanent; #301 redirect
        #}

        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

        index index.php index.html index.htm;
        root /var/www/html;

        client_max_body_size 256M;

        location / {
                proxy_pass http://127.0.0.1:8080;
                include proxy_params;
        }

        location @backend {
                proxy_pass http://127.0.0.1:8080;
                include proxy_params;
        }

        location ~* \.(html|htm|css|xml|rss|gif|jpeg|jpg|js|atom|mml|jad|wml|htc|png|tif|tiff|wbmp|ico|jng|bmp|jar|war|ear|hqx|doc|pdf|ps|eps|ai|rtf|xls|ppt|wmlc|xhtml|cco|jardiff|jnlp|run|>
                try_files $uri @backend;
                expires max;
                log_not_found off;
        }

        location ~ /\.ht {
                deny all;
        }
}

Проверяем конфигурацию:

sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Создаём симлинк, делая конфигурацию доступной для применения your_domain_name заменить:

sudo ln -s /etc/nginx/sites-available/your_domain_name.conf /etc/nginx/sites-enabled/

Перезапускаем Nginx и проверяем его работу:

sudo systemctl restart nginx