Начало > Помощен център > Cloud сървъри > Администрация на сървър > CentOS 7 - инсталиране на Nginx уеб сървър

CentOS 7 - инсталиране на Nginx уеб сървър

Помощен център

CentOS 7 - инсталиране на Nginx уеб сървър

Nginx е популярен и широко използван уеб сървър с отворен код, известен с бързина, сигурност и малък разход на ресурси. Също намира успешна употреба като web reverse proxy и load-balancer.

В статията ще ви покажем как да инсталирате и управлявате Nginx на вашия CentOS 7 сървър. Освен това ще научите как да създавате виртуални хостове и да предоставяте достъп до множество сайтове чрез Nginx.

В Linux не може два различни процеса да слушат на един и същ порт едновременно. На нашия CentOS 7 сървър вече инсталирахме и конфигурирахме Apache (httpd) да предоставя достъп до няколко сайта от виртуални хостове на порт 80.

Сега ще инсталираме Nginx уеб сървър и ще създадем негови собствени виртуални хостове (в Nginx се наричат сървърни блокове). За да може да работят двете услуги едновременно и без конфликт, ще конфигурираме Nginx да слуша на друг порт (5800).

Install Nginx on CentOS 7

Ако опитате директно да инсталирате Nginx с пакетния мениджър yum (sudo yum install nginx) ще получите грешка: No package nginx available. Затова първо трябва да добавим в CentOS 7 хранилището EPEL.

EPEL (Extra Packages for Enterprise Linux) е хранилище с отворен код и се поддържа безплатно от Fedora общността, което доставя качествени софтуерни пакети за RHEL (Red Hat Enterprise Linux), CentOS и Scientific Linux.

Добавяме хранилището с командата:

sudo yum install epel-release

Тъй като Nginx по подразбиране слуша на порт 80, на който в момента слуша и Apache, за да избегнем конфликт и грешка при инсталацията, спираме httpd с командата:

sudo systemctl stop httpd

Сега вече може да инсталираме Nginx:

sudo yum install nginx

След инсталацията стартираме сървъра с:

sudo systemctl start nginx

[commonuser@centos7 ~]$ ps axf|grep nginx
  1745 pts/0    S+     0:00              \_ grep --color=auto nginx
  1661 ?        Ss     0:00 nginx: master process /usr/sbin/nginx
  1662 ?        S      0:00  \_ nginx: worker process
  1663 ?        S      0:00  \_ nginx: worker process
[commonuser@centos7 ~]$

За да може Nginx да стартира заедно с CentOS 7, изпълняваме следната команда:

sudo systemctl enable nginx

[commonuser@centos7 ~]$ sudo systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[commonuser@centos7 ~]$

При инсталирането на Apache, разрешихме трафика за HTTP през защитната стена firewalld с командите:

sudo firewall-cmd --permanent --zone=public --add-service=http

sudo firewall-cmd --reload

За да тестваме дали Nginx е инсталиран успешно, въвеждаме IP адреса на сървъра в браузър:

http://192.168.1.10/

Тестова страница на Nginx

IP адресът на вашия сървър може да видите с командата:

[commonuser@centos7 ~]$ hostname -I
192.168.1.10 fde4:fb5d:5c27:c800:39b1:ff7e:1d67:16d5
[commonuser@centos7 ~]$

Зареждане на официалната тестова страница на Nginx показва, че уеб сървърът е инсталиран успешно.

Конфигурация и управление на Nginx

Команди за управление

След като Nginx е стартиран, той може да бъде контролиран чрез извикване на изпълнимия файл с параметъра -s:

nginx -s command

Като command може да бъде едно от следните:

  • stop - бързо спиране;
  • quit - спиране с изчакване (graceful shutdown);
  • reload - презареждане на конфигурационния файл без прекъсване на процеси;
  • reopen - повторно отваряне на лог файловете;

Например, за да прекратите Nginx процеси с изчакване работните процеси да завършат показването на текущите заявки, може да изпълните следната команда:

nginx -s quit

Тази команда трябва да бъде изпълнена от същия потребител, който е стартирал Nginx.

Промените, направени в конфигурационния файл, няма да се приложат, докато командата за презареждане на конфигурацията не бъде изпълнена или Nginx не бъде рестартиран. За да презаредите конфигурацията, изпълнете:

nginx -s reload

Преди да подадете командата за презареждане, може да тествате конфигурацията на Nginx с:

nginx -t

Глобална конфигурация на Nginx

Основният конфигурационен файл на Nginx се намира на /etc/nginx/nginx.conf и в него може да променяте главните настройки на сървъра.

Главна (root) директория по подразбиране

Основната директория на сървъра по подразбиране е /usr/share/nginx/html. Файловете, които са поставени там, се зареждат от сървъра. Това местоположение е посочено в главния конфигурационния файл в /etc/nginx/nginx.conf.

Конфигурация на сървърни блокове

Допълнителни сървърни блокове (еквивалент на виртуалните хостове в Apache), може да се добавят чрез създаване на нови конфигурационни файлове в /etc/nginx/conf.d като файловете трябва да имат разширение .conf.

Промяна на Nginx порт

По подразбиране Nginx слуша за входяща връзка и се свързва към стандартния HTTP порт 80. TLS/SSL конфигурацията, която не е активирана по подразбиране в Nginx, слуша за защитени връзки на порт 443.

За да накараме Nginx да слуша за входящи уеб връзки на друг нестандартен порт, трябва да редактираме основния конфигурационен файл /etc/nginx/nginx.conf, което ще направим в този раздел от статията. Препоръчаме да направите копие на файла преди промените.

Отваряме с текстов редактор главният конфигурационен файл, намираме показания ред и променяме цифрата 80 с цифрата на новия порт (5800):

sudo nano /etc/nginx/nginx.conf

    server {
        listen       80 default_server;
...
    server {
        listen       5800 default_server;

Запазваме информацията с Ctrl+O и Enter и затваряме файла с Ctrl+X.

За да работи коректно Nginx на новия порт трябва да извършим промяна в конфигурацията на SELinux с командата semanage, която е част от пакета policycoreutils. При конфигурирането на Apache уеб сървър ние инсталирахме пакета policycoreutils и сега само ще изпълним необходимите команди:

sudo semanage port -a -t http_port_t -p tcp 5800

sudo semanage port -m -t http_port_t -p tcp 5800

Ако желаете да изтриете порт от конфигурацията, изпълнете:

semanage port --delete -t http_port_t -p tcp 5800

Вие може да инсталирате пакета policycoreutils с командата:

sudo yum install policycoreutils

Преди да рестартираме уеб сървърът не трябва да забравяме да отворим новия порт и в защитната стена firewalld с командите:

sudo firewall-cmd --permanent --zone=public --add-port=5800/tcp

sudo firewall-cmd --reload

[commonuser@centos7 ~]$ sudo firewall-cmd --permanent --zone=public --add-port=5800/tcp
success
[commonuser@centos7 ~]$ sudo firewall-cmd --reload
success
[commonuser@centos7 ~]$ sudo firewall-cmd --list-ports
51234/tcp 5800/tcp
[commonuser@centos7 ~]$

Сега рестартираме Nginx за да запазим промените:

sudo systemctl restart nginx.service

Със следната команда проверяваме дали новият порт е успешно конфигуриран:

sudo netstat -tlpn| grep nginx

[commonuser@centos7 ~]$ sudo netstat -tlpn| grep nginx
tcp        0      0 0.0.0.0:5800            0.0.0.0:*               LISTEN      2000/nginx: master

За да тестваме дали промяната е успешна, трябва да заредим в браузъра IP адреса на сървъра като добавим новия порт:

http://192.168.1.10:5800

Тестова страница на Nginx на нов порт

Конфигуриране на сървърни блокове в Nginx

Конфигуриране на домейни

Nginx използва сървърни блокове за управление на конфигурации на отделни сайтове/домейни. В примера ще създадем сървърни блокове за двата фиктивни поддомейна nginx1.vhost.home и nginx2.vhost.home, които добавихме във файла /etc/hosts/ със следните записи:

192.168.1.10 nginx1.vhost.home

192.168.1.10 nginx2.vhost.home

Същите записи създадохме и в hosts файлът на операционната система за да изпращаме HTTP заявките директно към IP адреса на CentOS 7 сървъра от компютри в локалната мрежа без участието на DNS системата.

Създаване структура от директории

Първо създаваме структура от директории, която да съхранява ресурсите (файловете) на сайта. Директорията от най-високо ниво за всеки отделен сайт/домейн, в която Nginx ще търси съдържание, ще бъде създадена в директорията /var/www. В нея ще създадем директория за всеки от сървърните блокове на нашите два сайта.

Във всяка директория на сървърен блок ще създадем html директория, която ще съдържа ресурсните файлове на съответния сайт, и директория log за регистрационните файлове, които са популярни с името логове.

Създаваме тези директории с командата mkdir (флагът -p ни позволява да вмъкваме папка в папка):

sudo mkdir -p /var/www/nginx1.vhost.home/html/ /var/www/nginx1.vhost.home/log/

Задаване на привилегии

Вече имаме структурата от директории за нашите файлове, но те са собственост на root потребителя. Ние искаме обикновен потребител да управлява файловете в уеб директорията html, затова променяме собствеността с chown:

sudo chown -R $USER:$USER /var/www/nginx1.vhost.home/html

Променливата $USER ще приеме за стойност името на потребителя, в чиито профил сме логнати в момента на изпълнение на командата. Сега нашият обикновен потребител притежава поддиректория html, където ще съхранява съдържанието на сайта.

Трябва да променим правата на главната уеб директория и нейните поддиректории (с флагът -R), за да сме сигурни, че достъпът за четене е разрешен и страниците на сайта се обслужват правилно:

sudo chmod -R 755 /var/www

Създаване на тестова страница за сайта

Създаваме index.html файл в директорията на сайта с командата:

nano /var/www/nginx1.vhost.home/html/index.html

като поставяме (paste) в него примерен HTML код:

<html>
  <head>
    <title>NGINX1.VHOST.HOME</title>
  </head>
  <body>
    <h3>NGINX1.VHOST.HOME Server Block is Working!</h3>
  </body>
</html>

Запазваме съдържанието и затваряме файлът.

Промяна на контекст в SELinux

SELinux е система за сигурност в Linux и е активирана по подразбиране в последните версии RedHat и CentOS. Доста експерти съветват да се деактивира SELinux за да работят други приложения. Препоръчаме да не правите компромис със сигурността на вашия сървър, а да се научите как да конфигурирате правилно SELinux.

Ние ще разгледаме SELinux в отделни статии, а тук само даваме наготово командите, с които правим възможна работата на уеб сървъра без да променяме настройките на SELinux - той е активен и работи в най-високото ниво на сигурност:

[commonuser@centos7 ~]$ getenforce
Enforcing
[commonuser@centos7 ~]$

Присвояваме правилният тип контекст *httpdlogt на допълнително създадената директория log* с командата:

sudo semanage fcontext -a -t httpd_log_t "/var/www/nginx1.vhost.home/log(/.*)?"

a със следната команда прилагаме промените и ги активираме при рестартиране:

sudo restorecon -R -v /var/www/nginx1.vhost.home/log

Създаване файловете на нов сървърен блок

В главните настройки на Nginx (/etc/nginx/nginx.conf) е дефинирана директория, в която уеб сървъра ще търси информация за сървърни блокове (сайтове) - секция http > include /etc/nginx/conf.d/*.conf;. Файловете трябва да завършват с разширение .conf и е препоръчително да съдържат името на домейна за по-голяма яснота.

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

sudo nano /etc/nginx/conf.d/nginx1.vhost.home.conf

Редактирайте кодът по-долу с актуалните данни за вашия сървър и го поставете (paste) във файла:

server {
    server_name nginx1.vhost.home;
    listen 5800;
    root /var/www/nginx1.vhost.home/html/;
    access_log /var/www/nginx1.vhost.home/log/nginx1.vhost.home-access.log;
    error_log  /var/www/nginx1.vhost.home/log/nginx1.vhost.home-error.log;
    index index.html;
 
    location / {
        try_files $uri $uri/ =404;
    }
}

Рестартираме Nginx с командата:

sudo systemctl restart nginx

и зареждаме в браузър домейна на първия виртуален сайт като не пропускаме да добавим новия порт:

http://nginx1.vhost.home:5800

Зареждане на първият виртуален сайт

Конфигуриране на втори сървърен блок

Ще повторим описаните стъпки за да създадем втори виртуален сайт като само ще припомним необходимите команди с кратко описание:

sudo mkdir -p /var/www/nginx2.vhost.home/html/ /var/www/nginx2.vhost.home/log/ - създаваме директориите html за сайта и log за лог файловете;

sudo chown -R $USER:$USER /var/www/nginx2.vhost.home/html - променяме собствеността на директорията html;

sudo chmod -R 755 /var/www - променяме рекурсивно правата на директорията /var/www/;

sudo semanage fcontext -a -t httpd_log_t "/var/www/nginx2.vhost.home/log(/.*)?" - променяма контекста на директория log за да може nginx да я използва за създаване на файлове (access.log и error.log) и да има право да пише в тях;

sudo restorecon -R -v /var/www/nginx2.vhost.home/log - запазваме и активираме промените при рестарт;

sudo nano /var/www/nginx2.vhost.home/html/index.html - създаваме index.html файл в директорията на сайта;

като поставяме (paste) в него примерен HTML код:

<html>
  <head>
    <title>NGINX2.VHOST.HOME</title>
  </head>
  <body>
    <h3>NGINX2.VHOST.HOME Server Block is Working!</h3>
  </body>
</html>

sudo nano /etc/nginx/conf.d/nginx2.vhost.home.conf - създаваме конфигурационния файл на новия сървърен блок;

Копираме следната информация във файла:

server {
    server_name nginx2.vhost.home;
    listen 5800;
    root /var/www/nginx2.vhost.home/html/;
    access_log /var/www/nginx2.vhost.home/log/nginx2.vhost.home-access.log;
    error_log  /var/www/nginx2.vhost.home/log/nginx2.vhost.home-error.log;
    index index.html;
 
    location / {
        try_files $uri $uri/ =404;
    }
}

sudo systemctl restart nginx - рестартираме Nginx;

http://nginx2.vhost.home:5800 - зареждаме втория сайт в браузъра:

Зареждане на вторият виртуален сайт

В статията показахме конфигуриране само на статичен HTML сайт тъй като все още не сме инсталирали сървър за бази данни, PHP, FTP, което ще направим в следващи статии.