Настройка web сервера nginx, php-fpm, php7 на CentOS 8

В связи с выходом нового релиза популярной операционной системы пришло время актуализировать некоторые статьи. Сегодня я настрою производительный веб сервер CentOS 8 на свежих версиях nginx, php-fpm, где сам php версии 7.2. Сейчас пока нет необходимости использовать сторонние репозитории для php, так как в стандартных присутствует свежая и актуальная версия.

Углубленный онлайн-курс по MikroTik

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.

Цели статьи

  1. Описать общий принцип настройки web сервера на базе nginx.
  2. Показать, как установить актуальные версии nginx, php-fpm и mariadb.
  3. Привести примеры своих конфигов для перечисленных сервисов.
  4. Настроить бесплатные ssl сертификаты let's encrypt для сайтов.
  5. Показать, как настроить selinux для web сервера nginx.
  6. Записать и показать видео настройки веб сервера.

Данная статья является частью единого цикла статьей про сервер Centos.

Введение

В этой статье я расскажу, как настроить производительный web сервер на базе популярного стека технологий - nginx и php-fpm. В связи с выходом нового релиза Centos 8, многие статьи на эту тему стали не актуальны, так как версии софта в базовых репозиториях обновились и тот же php нет смысла ставить из стороннего репозитория.

Работать будем на сервере под управлением CentOS 8. Если у вас его еще нет, то читайте мои статьи на тему установки и базовой настройки centos. Не забудьте уделить внимание теме настройки iptables. В данной статье я ее не буду касаться, хотя тема важная для web сервера.

В самом конце я покажу, как настроить SELinux применительно к данному веб серверу. Приведу список правил, которые нужно будет применить конкретно к моей статье. Правила не универсальные. В зависимости от настройки web сервера, они будут отличаться. Если вам не хочется тратить на это свое время, или вам он не нужен, то просто отключите selinux. Если же нужен, то пока только добавляйте конфиги, но ничего не запускайте, пока не дойдете до самого конца. С включенным и не настроенным SELinux все равно ничего не заработает.

В своей тестовой среде я буду использовать следующие сущности.

z.serveradmin.ru имя тестового виртуального хоста и сайта
/web/sites директория для размещения виртуальных хостов
75.37.225.138 внешний ip адрес сервера
pma.serveradmin.ru имя виртуального хоста для phpmyadmin

Подопытным сервером будет выступать виртуальная машина от ihor, характеристики следующие:

Процессор 4 ядра
Память 4 Gb
Диск 80 Gb SSD

Это кастомная настройка параметров. Они не оптимальны по цене, но мне были нужны именно такие.

Установка nginx на CentOS 8

Для установки самой свежей стабильной версии nginx на centos подключим официальный репозиторий. Я использую именно родной репозиторий по следующей причине. Мне больше нравится начальное расположение и формат конфигурационных файлов. Устанавливая софт из официальных репозиториев ты помимо того, что имеешь самую свежую и актуальную версию nginx, так и расположение и формат конфигурационных файлов будет одинаковый во всех системах.

Банальный пример. Если ставить nginx из официального репозитория centos 8, настройка дефолтного виртуального хоста будет прямо в основном конфиге nginx.conf. Мне лично это не удобно, так как в этом файле я храню набор настроек без привязки к виртуальным хостам. Если установить nginx из официального репозитория, конфигурация дефолтного хоста будет в отдельном конфиге default.conf.

Подключаем репозиторий nginx в centos 8. Я обычно использую mainline версию. Она имеет все нововведения на борту и достаточно стабильна. По крайней мере у меня никогда проблем с ней не было. Если вы хотите стабильную версию, то используйте репозиторий stable. Рисуем конфиг репозитория /etc/yum.repos.d/nginx.repo.

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

Устанавливаем nginx на сервер.

# dnf install nginx

Установка nginx на centos 8

Запускаем nginx и добавляем в автозагрузку.

# systemctl start nginx
# systemctl enable nginx

Проверяем, запустился ли web сервер. Для этого идем по ссылке http://75.37.225.138/. Вы должны увидеть стандартную страницу заглушку.

Стартовая страница nginx

Если ее не видите, скорее всего у вас включен и не настроен firewalld. В начале статьи я приводил ссылку на статью с настройкой сервера и настройкой iptables. Если вы с ними познакомились, значит либо уже открыли нужные порты, либо сейчас это сделаете. Для тех, кто не хочет со всем этим разбираться, я просто покажу, как открыть порты 80 и 443 на firewalld, который используется в centos 8 по-умолчанию.

# firewall-cmd --permanent --zone=public --add-service=http
# firewall-cmd --permanent --zone=public --add-service=https
# firewall-cmd --reload

Проверить, открылись ли порты можно командой.

# firewall-cmd --list-all

Настройка firewalld для веб сервера nginx

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

user  nginx;
worker_processes auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 30000;
pid /var/run/nginx.pid;
pcre_jit on;

events {
    worker_connections 8192;
    multi_accept on;
}

http {

    # Basic #######################
    
    sendfile			on;
    tcp_nopush			on;
    tcp_nodelay			on;
    reset_timedout_connection 	on;
    keepalive_timeout 		120;
    keepalive_requests		1000;
    types_hash_max_size		2048;
    server_tokens		off;
    send_timeout		30;
    client_body_timeout		30;
    client_header_timeout	30;
    server_names_hash_max_size	4096;

    # Limits ######################
    
    client_max_body_size	10m;
    client_body_buffer_size	128k;
    client_body_temp_path	/var/cache/nginx/client_temp;

    proxy_connect_timeout	60;
    proxy_send_timeout		60;
    proxy_read_timeout		60;
    proxy_buffer_size		4k;
    proxy_buffers		8 16k;
    proxy_busy_buffers_size	64k;
    proxy_temp_file_write_size	64k;
    proxy_temp_path		/var/cache/nginx/proxy_temp;

    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
 
    # Logs ########################

    log_format  main	'$remote_addr - $host [$time_local] "$request" '
        '$status $body_bytes_sent "$http_referer" '
        '"$http_user_agent" "$http_x_forwarded_for"'
        'rt=$request_time ut=$upstream_response_time '
        'cs=$upstream_cache_status';
    log_format full	'$remote_addr - $host [$time_local] "$request" '
               'request_length=$request_length '
               'status=$status bytes_sent=$bytes_sent '
               'body_bytes_sent=$body_bytes_sent '
               'referer=$http_referer '
               'user_agent="$http_user_agent" '
               'upstream_status=$upstream_status '
               'request_time=$request_time '
               'upstream_response_time=$upstream_response_time '
               'upstream_connect_time=$upstream_connect_time '
               'upstream_header_time=$upstream_header_time';

    access_log  /var/log/nginx/access.log  main;
    error_log  /var/log/nginx/error.log;

    # Gzip ########################

    gzip on; 
    gzip_static on; 
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/x-icon image/svg+xml application/x-font-ttf;
    gzip_comp_level 9;
    gzip_proxied any;
    gzip_min_length 1000;
    gzip_disable "msie6";
    gzip_vary on;

    etag off;

    # Cache #######################

    #proxy_cache_valid 1m;
    #proxy_cache_key $scheme$proxy_host$request_uri$cookie_US;
    #proxy_cache_path /web/sites/nginx_cache levels=1:2 keys_zone=main:1000m;

    # Zone limits ################

    limit_conn_zone $binary_remote_addr zone=perip:10m;
    limit_req_zone $binary_remote_addr zone=lim_5r:10m rate=5r/s; # lim for dynamic page
    limit_req_zone $binary_remote_addr zone=lim_1r:10m rate=1r/s; # lim for search page
    limit_req_zone $binary_remote_addr zone=lim_10r:10m rate=10r/s;

    # SSL #########################

    ssl_session_cache shared:SSL:50m;
    ssl_session_timeout 1d;
    ssl_session_tickets on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers 'TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-256-GCM-SHA384:ECDHE:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
    ssl_prefer_server_ciphers on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    ssl_stapling on;
    ssl_stapling_verify on;
    add_header Strict-Transport-Security max-age=15768000;
    resolver 8.8.8.8;

    include /etc/nginx/conf.d/*.conf;

    # For monitoring ###########
    
    server {
    listen 127.0.0.1:80;
    server_name status.localhost;
    keepalive_timeout	0;
    allow	127.0.0.1;
    deny	all;
    access_log	off;

        location /server-status {
    stub_status	on;
        }

        location /status {
    access_log off;
    allow 127.0.0.1;
    deny all;
    include fastcgi_params;
    fastcgi_pass   unix:/run/php-fpm/www.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
    }
}

Сохраните конфиг и проверьте его корректность командой:

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

Если ошибок нет, то можно применить.

# nginx -s reload

Теперь создадим структуру каталогов для сайтов. Я обычно все сайты размещаю отдельно, например в /web/sites. Создадим там два сайта - основной и панель phpmyadmin для него. Привожу просто для примера, вешать на отдельный виртуальный хост phpmyadmin не обязательно, хотя в некоторых случаях это бывает удобно.

# mkdir -p /web/sites/z.serveradmin.ru/{www,log}
# mkdir -p /web/sites/pma.serveradmin.ru/{www,log}
# chown -R nginx. /web/sites/

Создадим конфиги nginx для этих виртуальных хостов. Я сразу буду делать их с учетом https, который мы настроим позже. Так что после создания не надо перезапускать веб сервер и проверять работу - будут ошибки. Виртуальный хост сайта показан на примере wordpress. Конфигурация собрана на основе рекомендаций из официальной документации конкретно для веб сервера nginx.

Конфиг для основного сайта - /etc/nginx/conf.d/z.serveradmin.ru.conf

server {
    listen 443 ssl http2;
    server_name z.serveradmin.ru;
    root /web/sites/z.serveradmin.ru/www/;
    index index.php index.html index.htm;
    access_log /web/sites/z.serveradmin.ru/log/access.log main;
    error_log /web/sites/z.serveradmin.ru/log/error.log;

    ssl_certificate		/etc/letsencrypt/live/z.serveradmin.ru/fullchain.pem;
    ssl_certificate_key		/etc/letsencrypt/live/z.serveradmin.ru/privkey.pem;

    location / {
    try_files $uri $uri/ /index.php?$args;
    }

    location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ {
    access_log off;
    expires max;
    }

    location ~ \.php$ {
    try_files  $uri =404;
    fastcgi_pass   unix:/run/php-fpm/www.sock;
    fastcgi_index index.php;
    fastcgi_param DOCUMENT_ROOT /web/sites/z.serveradmin.ru/www/;
    fastcgi_param SCRIPT_FILENAME /web/sites/z.serveradmin.ru/www$fastcgi_script_name;
    fastcgi_param PATH_TRANSLATED /web/sites/z.serveradmin.ru/www$fastcgi_script_name;
    include fastcgi_params;
    fastcgi_param QUERY_STRING $query_string;
    fastcgi_param REQUEST_METHOD $request_method;
    fastcgi_param CONTENT_TYPE $content_type;
    fastcgi_param CONTENT_LENGTH $content_length;
    fastcgi_param HTTPS on;
    fastcgi_intercept_errors on;
    fastcgi_ignore_client_abort off;
    fastcgi_connect_timeout 60;
    fastcgi_send_timeout 180;
    fastcgi_read_timeout 180;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 4 256k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
    }

    location = /favicon.ico {
    log_not_found off;
    access_log off;
    }

    location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
    }

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

server {
     listen  443 ssl http2;
     server_name  www.z.serveradmin.ru;
     return 301 https://z.serveradmin.ru$request_uri;
}

server {
    listen 80;
    server_name z.serveradmin.ru;
    root /web/sites/z.serveradmin.ru/www/;
    index index.php index.html index.htm;
    access_log /web/sites/z.serveradmin.ru/log/access.log main;
    error_log /web/sites/z.serveradmin.ru/log/error.log;

    location / {
    return 301 https://z.serveradmin.ru$request_uri;
    }
}

server {
     listen  80;
     server_name  www.z.serveradmin.ru;
     return 301 http://z.serveradmin.ru$request_uri;
}

В данной конфигурации настроены все необходимые редиректы, при этом отключен редирект файла robots.txt. Он отдельно отдается по http и https. Для phpmyadmin рисуем конфиг попроще. Я сразу его закрываю отдельным паролем с помощью basic auth.

# mcedit /etc/nginx/conf.d/pma.serveradmin.ru.conf
server {
    listen 443 ssl http2;
    server_name pma.serveradmin.ru;
    root /web/sites/pma.serveradmin.ru/www/;
    index index.php index.html index.htm;
    access_log /web/sites/pma.serveradmin.ru/log/access.log main;
    error_log /web/sites/pma.serveradmin.ru/log/error.log;

    auth_basic "Restricted Content";
    auth_basic_user_file /etc/nginx/.htpasswd;

    ssl_certificate		/etc/letsencrypt/live/pma.serveradmin.ru/fullchain.pem;
    ssl_certificate_key		/etc/letsencrypt/live/pma.serveradmin.ru/privkey.pem;

    location ~ \.php$ {
    fastcgi_pass   unix:/run/php-fpm/www.sock;
    fastcgi_index index.php;
    fastcgi_param DOCUMENT_ROOT /web/sites/pma.serveradmin.ru/www/;
    fastcgi_param SCRIPT_FILENAME /web/sites/pma.serveradmin.ru/www$fastcgi_script_name;
    fastcgi_param PATH_TRANSLATED /web/sites/pma.serveradmin.ru/www$fastcgi_script_name;
    include fastcgi_params;
    fastcgi_param QUERY_STRING $query_string;
    fastcgi_param REQUEST_METHOD $request_method;
    fastcgi_param CONTENT_TYPE $content_type;
    fastcgi_param CONTENT_LENGTH $content_length;
    fastcgi_intercept_errors on;
    fastcgi_ignore_client_abort off;
    fastcgi_connect_timeout 60;
    fastcgi_send_timeout 180;
    fastcgi_read_timeout 180;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 4 256k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
    }
}

server {
    listen 80;
    server_name pma.serveradmin.ru;
    root /web/sites/pma.serveradmin.ru/www/;
    index index.php index.html index.htm;
    access_log /web/sites/pma.serveradmin.ru/log/access.log main;
    error_log /web/sites/pma.serveradmin.ru/log/error.log;

    location / {
    return 301 https://pma.serveradmin.ru$request_uri;
    }
}

Создаем файл с логином и паролем для доступа.

# sh -c "echo -n 'pma:' >> /etc/nginx/.htpasswd"
# sh -c "openssl passwd -apr1 >> /etc/nginx/.htpasswd"

В данном случае pma - имя пользователя, а пароль будет задан в консоли при выполнении второй команды.

Сохраняем конфиги хостов и движемся дальше. Пока nginx перезапускать не надо. Некоторые сущности, которые упоминются в конфиге, еще не настроены. Одну из них сразу добавим, чтобы не забыть. Нам надо сформировать файл dhparam.pem. Процесс длится долго, до получаса на слабых виртуалках. Этот файл нужен для повышения безопасности и получения максимального рейтинга ssl. Насколько этот параметр критичен в реальности, не берусь судить. Если тороплюсь, то настраиваю без него.

# openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096

Установка php-fpm

Установка php-fpm в Centos 8 сильно упростилась по сравнению с предыдущей версией, потому что в базовом репозитории хранится актуальная версия php 7.2, которой можно пользоваться. Пока нет необходимости подключать сторонние репозитории, так как версия 7.2 вполне свежа и актуальна. Если у вас нет необходимости использовать что-то новее, то можно остановиться на этой версии.

Устанавливаем php и php-fpm в CentOS 8, а так же некоторые популярные модули.

# dnf install php-fpm php-cli php-mysqlnd php-json php-gd php-ldap php-odbc php-pdo php-opcache php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap php-zip

Установка php 7.2

Проверим конфигурацию php-fpm, которая располагается в файле /etc/php-fpm.d/www.conf. Изменим пользователя, под которым будет работать php-fpm с apache на nginx.

user = nginx
group = nginx

Перезапускаем php-fpm и проверяем, запущен ли сокет.

# systemctl restart php-fpm
# ll /run/php-fpm/www.sock
srw-rw----+ 1 root root 0 Oct  7 16:59 /run/php-fpm/www.sock

Все в порядке, php-fpm запущен и готов к работе. Cделаем еще одну важную настройку. Назначим nginx владельцем директории для хранения сессий php.

# chown -R nginx. /var/lib/php/session

Более безопасно было бы для каждого сайта делать отдельную директорию для сессий и определять ее в настройках php. Но это уже частный случай. В общем случае, можно оставить так.

Возможно, вам захочется поставить более свежу версию php. Как это сделать, читайте в отдельной статье - обновление php-7.2 до 7.4 в CentOS 8.

Для того, чтобы проверить работу нашего веб сервера, нужно установить ssl сертификаты. Без них nginx с текущим конфигом не запустится. Исправляем это.

Настройка бесплатного ssl сертификата Lets Encrypt

Устанавливаем пакет certbot для получения бесплатного ssl сертификата от let’s encrypt. Он находится в репозитории epel, поэтому подключаем его, если еще этого не сделали ранее.

# dnf install epel-release
# dnf install certbot

Настройка бесплатного ssl сертификата

Наша следующая задача - получить бесплатные сертификаты. Для этого временно остановим nginx, если он вдруг оказался запущен и подтвердим владение доменами с помощью temporary webserver, который certbot поднимет сам на время верификации доменов.

# systemctl stop nginx
# certbot certonly
How would you like to authenticate with the ACME CA?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Spin up a temporary webserver (standalone)
2: Place files in webroot directory (webroot)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1
Plugins selected: Authenticator standalone, Installer None
Please enter in your domain name(s) (comma and/or space separated)  (Enter 'c'
to cancel): z.serveradmin.ru
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for z.serveradmin.ru
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/z.serveradmin.ru/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/z.serveradmin.ru/privkey.pem
   Your cert will expire on 2020-01-05. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot-auto
   again. To non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

То же самое делаем для второго домена - pma.serveradmin.ru.

После того, как получили сертификаты, можно проверить конфиг nginx и запустить его. Ошибок быть не должно. Если они есть, то разбирайтесь с ними, возможно где-то ошиблись.

# nginx -t
# systemctl start nginx

Настройка nginx на этом завершена. Он должен корректно запуститься и работать в рабочем режиме.

Теперь сделаем так, чтобы сертификаты автоматически обновлялись перед истечением срока действия. Для этого необходимо изменить конфигурации доменов. Они располагаются в директории /etc/letsencrypt/renewal. Так как мы генерировали сертификаты с помощью временного веб сервера, наш текущий конфиг z.serveradmin.ru.conf выглядит вот так:

# renew_before_expiry = 30 days
version = 0.39.0
archive_dir = /etc/letsencrypt/archive/z.serveradmin.ru
cert = /etc/letsencrypt/live/z.serveradmin.ru/cert.pem
privkey = /etc/letsencrypt/live/z.serveradmin.ru/privkey.pem
chain = /etc/letsencrypt/live/z.serveradmin.ru/chain.pem
fullchain = /etc/letsencrypt/live/z.serveradmin.ru/fullchain.pem

# Options used in the renewal process
[renewalparams]
account = a9e5d37f80dafd9f0a2f9a2b019cbc3e
authenticator = standalone
server = https://acme-v02.api.letsencrypt.org/directory

Приводим его к следующему виду:

# renew_before_expiry = 30 days
version = 0.39.0
archive_dir = /etc/letsencrypt/archive/z.serveradmin.ru
cert = /etc/letsencrypt/live/z.serveradmin.ru/cert.pem
privkey = /etc/letsencrypt/live/z.serveradmin.ru/privkey.pem
chain = /etc/letsencrypt/live/z.serveradmin.ru/chain.pem
fullchain = /etc/letsencrypt/live/z.serveradmin.ru/fullchain.pem

# Options used in the renewal process
[renewalparams]
account = a9e5d37f80dafd9f0a2f9a2b019cbc3e
authenticator = webroot
server = https://acme-v02.api.letsencrypt.org/directory
post_hook = nginx -s reload
[[webroot_map]]
z.serveradmin.ru = /web/sites/z.serveradmin.ru/www

По аналогии делаете с остальными виртуальными хостами, для которых используете бесплатные сертификаты let’s encrypt. Осталось дело за малым — настроить автоматический выпуск новых ssl сертификатов, взамен просроченным. Для этого добавляем в /etc/crontab следующую строку:

# Cert Renewal
30 2 * * * root /usr/bin/certbot renew --post-hook "nginx -s reload" >> /var/log/le-renew.log

Все, с сертификатами закончили. Двигаемся дальше в настройке web сервера.

Установка mariadb на CentOS 8

Дошла очередь до установки сервера баз данных mysql для web сервера на CentOS 8 — MariaDB. Я буду устанавливать последнюю стабильную версию на момент написания статьи — 10.5 из официального репозитория с сайта mariadb.

Для того, чтобы подключить репозиторий MariaDB, можно воспользоваться специальной страницей на официальном сайте, где можно задать параметры системы и получить конфиг репозитория.

В моем случае конфиг получился следующий.

# cat /etc/yum.repos.d/mariadb.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.5/centos8-amd64
module_hotfixes=1
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

Устанавливаем последнюю версию mariadb на centos.

# dnf install boost-program-options
# dnf install MariaDB-server MariaDB-client --disablerepo=AppStream

Установка и настройка mariadb

Запускаем mariadb и добавляем в автозагрузку.

# systemctl start mariadb
# systemctl enable mariadb

Запускаем скрипт начальной конфигурации mysql и задаем пароль для root. Все остальное можно оставить по умолчанию. Авторизацию через сокет отключаем.

# /usr/bin/mysql_secure_installation

Сервер баз данных mysql для нашего web сервера готов. Продолжаем настройку. Установим панель управления mysql — phpmyadmin.

Установка phpmyadmin

Для того, чтобы установить phpmyadmin на наш web сервер, достаточно просто распаковать в директроию с виртуальным хостом исходники панели. Все остальные настройки у нас уже готовы, в том числе виртуальный хост с tls сертификатом.

Идем на сайт https://www.phpmyadmin.net и копируем ссылку на последнюю версию панели. Затем загружаем ее через консоль.

# cd ~
# wget https://files.phpmyadmin.net/phpMyAdmin/4.9.1/phpMyAdmin-4.9.1-all-languages.zip

Архив упакован в zip. Если у вас нет на сервере пакета unzip, установите его.

# dnf install unzip

Распаковываем исходники в директорию виртуального хоста.

# unzip phpMyAdmin-4.9.1-all-languages.zip
# cp -R phpMyAdmin-4.9.1-all-languages/* /web/sites/pma.serveradmin.ru/www
# chown -R nginx. /web/sites/pma.serveradmin.ru/www

Можно заходить и проверять работу phpmyadmin, пройдя по адресу pma.serveradmin.ru. Ее установка закончена.

Установка phpmyadmin

Более подробно вопрос установки и настройки phpmyadmin я рассматривал отдельно. Можете зайти в панель и создать базу mysql для тестового сайта, например, wordpress. Затем через консоль загрузить исходники cms и распаковать их.

# cd ~
# wget https://ru.wordpress.org/latest-ru_RU.tar.gz
# tar xzvf latest-ru_RU.tar.gz
# cp -R wordpress/* /web/sites/z.serveradmin.ru/www
# chown -R nginx. /web/sites/z.serveradmin.ru/www

После этого открывайте в браузере страницу z.serveradmin.ru и увидите приветсвие установщика wordpress.

Установка wordpress

На этом основная настройка web сервера завершена. Он уже полностью работоспособен. Если вам достаочно этого функционала, то можете сразу переходить к настройке ротации логов.

Доступ к сайту по sftp

Если вы администратор и единственный пользователь, то больше можно ничего не делать. Вы и так сможете загрузить на сервер все что нужно тем или иным способом. Если же вы будете передавать управление сайтами другим людям, им нужен доступ к директории с исходниками сайта. Раньше для этих целей повсеместно использовали ftp. Если вы хотите так сделать, у меня есть статья по настройке ftp сервера vsftpd.

Я же предлагаю использовать sftp по нескольким причинам:

  1. Он безопаснее.
  2. Его быстрее настроить.
  3. Не надо отдельно настраивать firewall.

Статью по настройке sftp доступа я уже тоже писал, все подробности там. Здесь без комментариев выполним необходимые действия.

Создаем пользователя для подключения к сайту и добавляем его в группу sftp. Я обычно использую имя пользователя пересекающееся с названием сайта. Так удобнее управлять.

# useradd -s /sbin/nologin -d /web/sites/z.serveradmin.ru z.serveradmin.ru
# passwd z.serveradmin.ru
# groupadd sftp
# usermod -a -G sftp z.serveradmin.ru

Открываем конфиг ssh по пути /etc/ssh/sshd_config и комментируем там одну строку, добавляя далее несколько новых.

#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp -u 022
Match Group sftp
ChrootDirectory %h
ForceCommand internal-sftp -u 022

Перезапускаем службу sshd.

# systemctl restart sshd

Теперь нужно сделать владельцем каталогов /web/sites и /web/sites/z.serveradmin.ru пользователя root и убрать у остальных права на запись в эти каталоги. Без этого параметр ChrootDirectory работать не будет и при подключении получите ошибку.

# chown root /web/sites && chown root /web/sites/z.serveradmin.ru
# chmod 0755 /web/sites && chmod 0755 /web/sites/z.serveradmin.ru

Этого уже достаточно, чтобы вы могли подключиться к сайту, к примеру, с помощью программы winscp. Если что-то пойдет не так и будут какие-то ошибки, то смотреть подробности нужно в логе /var/log/secure. С помощью такого подключения вы можете загрузить к себе исходники сайта, но не править их. У вас доступ только на чтение. В таком подходе возникает много нюансов с правами к файлам и директориям. Дальше я расскажу, как их аккуратно и грамотно разрулить, чтобы у нас не было проблем с дальнейшей работой сайтов от разных пользователей и были все необходимые права.

Работа с сайтами разных пользователей на одном веб сервере

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

# chown -R z.serveradmin.ru:nginx /web/sites/z.serveradmin.ru/
# chmod -R 0775 /web/sites/z.serveradmin.ru/

И не забываем обратно вернуть владельца на наш chroot каталог, иначе не подключимся по sftp.

# chown root /web/sites/z.serveradmin.ru/
# chmod 0755 /web/sites/z.serveradmin.ru/

Но при такой схеме будут проблемы с движками сайтов, которые автоматом что-то к себе загружают, потому что php-fpm работает от пользователя nginx, а у нас права nginx только на группу стоят, где нет прав на запись. К примеру, wordpress не сможет автоматически загружать плагины, будет просить доступ к ftp. Это можно исправить просто выставив права 0775 на все каталоги, но это путь костылей. В общем, могут возникнуть некоторые неудобства. Сейчас мы их исправим.

А теперь сделаем все красиво. Назначаем владельцем содержимого нашего сайта только отдельного пользователя.

# chown -R z.serveradmin.ru:z.serveradmin.ru /web/sites/z.serveradmin.ru/

Еще раз обращаю внимание на важный нюанс. Chroot доступ для sftp не будет работать, если владельцем директории, куда чрутимся, будет не root. Будете получать ошибку.

fatal: bad ownership or modes for chroot directory "/web/sites/z.serveradmin.ru" [postauth]

Возвращаем обратно рута владельцем корня chroot.

# chown root /web/sites/z.serveradmin.ru/
# chmod 0755 /web/sites/z.serveradmin.ru/

Обращаю внимание, что сначала мы рекурсивно назначаем права на все содержимое директорий, а потом возвращаем владельца root только на корень домашнего каталога пользователя z.serveradmin.ru.

Добавляем пользователя nginx в группу z.serveradmin.ru, чтобы web сервер имел доступ на чтение всех файлов виртуального хоста.

# usermod -aG z.serveradmin.ru nginx

Создаем отдельный pool для php-fpm, который будет обслуживать сайт z.serveradmin.ru и будет запускаться от этого пользователя. Для этого копируем существующий конфиг /etc/php-fpm.d/www.conf и изменяем в нем несколько строк.

# cd /etc/php-fpm.d && cp www.conf z.serveradmin.ru.conf
[z.serveradmin.ru]
user = z.serveradmin.ru
group = z.serveradmin.ru
listen = /run/php-fpm/z.serveradmin.ru.sock
listen.owner = z.serveradmin.ru
listen.group = z.serveradmin.ru
listen.mode = 0660
;listen.acl_users = apache,nginx # эту строку комментируем

Мы поменяли название пула, запустили его от отдельного пользователя и назначили ему отдельный сокет. Теперь идем в настройки этого виртуального хоста в nginx — /etc/nginx/conf.d/z.serveradmin.ru.conf и везде меняем старое значение сокета

fastcgi_pass unix:/run/php-fpm/www.sock;

на новое

fastcgi_pass unix:/run/php-fpm/z.serveradmin.ru.sock;

Перезапускаем nginx и php-fpm и проверяем работу сайта от отдельного пользователя.

# systemctl restart nginx
# systemctl restart php-fpm

Я рекомендую подключиться по sftp, закинуть еще раз исходники wordpress уже по sftp, установить его и добавить новую тему, чтобы проверить, что все корректно работает.  По аналогии проделанные выше действия повторяются для всех остальных сайтов.

Настройка SELinux для web сервера

Раздел для тех, кто хочет настроить SELinux на своем web сервере. Сначала ставим пакет policycoreutils-python-utils если он еще не установлен. Он нам нужен для утилиты semanage.

# dnf install policycoreutils-python-utils

Дальше нам нужно подготовить набор правил для selinux при нашей текущей конфигурации web сервера. Общий смысл их следующий:

  1. У нас нестандартная директория для сайтов - /web/sites, по-умолчанию запросы будут блокироваться.
  2. Надо разрешить nginx взаимодействовать с сокетом.
  3. Позволить nginx управлять параметром rlimit_nofile.
  4. И еще некоторое количество запретов, которые сможете сами проверить.

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

Я для этого пользуюсь следующими командами. Просмотр сработавших блокировок selinux для nginx.

# grep nginx /var/log/audit/audit.log | audit2why

Можете внимательно посмотреть суть блокировок. На первый взгляд выглядит не понятно, но в целом все гуглится. Можно разобраться, если есть желание. Подробно этот процесс описан в статье на сайте nginx.com.

Сформировать список правил для selinux.

# grep nginx /var/log/audit/audit.log | audit2allow -m nginx > ~/nginx.te

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

# checkmodule -M -m -o nginx.mod nginx.te
# semodule_package -m nginx.mod -o nginx.pp

В конце загружаю этот модуль в selinx.

# semodule -i nginx.pp

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

# grep nginx /var/log/audit/audit.log | audit2allow -M nginx
# semodule -i nginx.pp

Потом повторите все то же самое для php-fpm и можно проверять работу web сервера. Если в процессе проверки окажется, что что-то еще не работает, опять смотрите audit.log и добавляйте новые правила, пересобирайте и загружайте модуль. Так, через несколько итераций, получится рабочий набор правил для selinux.

Убедиться, что модуль загружен, можно командой.

# semodule -l | grep nginx

В целом, по selinux все. Мы просто разрешили все, что веб сервер просил. По идее, надо вдумчиво во всех правилах разбираться и разрешать только то, что считаешь нужным. Я честно скажу, что selinux знаю не очень хорошо. Дальше загрузки готовых модулей и автоматического создания модулей с помощью audit2allow я не двигался. Руками модули никогда не писал. Если есть какой-то более осмысленный и правильный способ настройки selinux на кастомной конфигурации веб сервера, буду рад полезной информации.

Хорошая практическая статья по ручной настройке selinux для web сервера - https://habr.com/ru/post/322904/. Там же есть ссылки на другие статьи автора на тему selinux. Написано содержательно и наглядно, рекомендую для тех, кто будет знакомиться с технологией.

Ротация логов веб сервера nginx

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

У нас уже будет файл конфигурации logrotate для nginx, который был создан во время установки — /etc/logrotate.d/nginx. Приведем его к следующему виду:

/var/log/nginx/*log
/web/sites/pma.serveradmin.ru/log/*log {

    create 0644 nginx nginx
    size=10M
    rotate 10
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
        /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
    endscript
}

/web/sites/z.serveradmin.ru/log/*log {

    create 0644 z.serveradmin.ru z.serveradmin.ru
    size=10M
    rotate 10
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
        /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
    endscript
}

Я предлагаю ротировать файлы логов по достижению ими размера в 10Мб, сжимать после ротации и хранить 10 архивов с логом. Для виртуальных хостов, работающих от отдельного пользователя, новые логи создаются сразу с соответствующими правами, чтобы у пользователя был доступ к ним. Для всех остальных хостов можно использовать самое первое правило, просто добавляя туда новые пути для логов.

Обращаю внимание на важный нюанс при ротации логов по размеру. Скорее всего в общем случае она будет работать не так, как вы ожидаете. Подробности читайте по ссылке. Я привел пример простой конфигурации. Все параметры вы можете поменять по своему усмотрению. Примеров конфигурации logrotate в интернете много.

На этом все. Я рассмотрел все основные моменты, которые необходимы для установки и настройки производительного web сервера на основе nginx и php-fpm последних версий. При этом рассказал о некоторых вещах, которые повышают удобство и гибкость эксплуатации сервера.

Видео

В завершении полное видео настройки web сервера на основе приведенной статьи. Если у кого-то что-то не получается, посмотрите, как это сделал я.

Заключение

Не понравилась статья и хочешь научить меня администрировать? Пожалуйста, я люблю учиться. Комментарии в твоем распоряжении. Расскажи, как сделать правильно!

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

Если еще что-то полезное вспомню, добавлю ссылки. Пока вроде все. Статья получилось большой и насыщенной. Было не просто все собрать воедино, проверить, связать между собой и оформить в последовательное повестование. Мог где-то ошибиться. Жду комментариев и отзывов. Написал все по своему опыту, как я обычно настраиваю веб сервера. Предполагаю что-то можно сделать более удобно и правильно. Буду рад научиться.

Напоминаю, что данная статья является частью единого цикла статьей про сервер Centos.

Углубленный онлайн-курс по MikroTik.

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

116 комментариев

  1. Вы хоть обновляйте - КОГДА НИБУДЬ половина уже не работает

    • Возьмите и обновите сами, а тут ссылку оставьте. Странно звучит требование в обновлении на сайте со свободным доступом. Когда посчитаю нужным и найду свободное время, тогда и обновлю. Возможно никогда.

  2. Добрый день!
    У вас в статье расписаны поддомены.
    А если я хочу сайт без домена сделать?

    Я создал папку, конфиг site.ru, аналогично как pma

    Но при переходе на site.ru - он почему то редиректит на pma.

    Как так?

    • Домен или поддомен никакой разницы нет. Просто отредактируйте все конфигурационные файлы и команды, заменив имя домена. Вы просто где-то ошиблись.

      • Андрей

        Я сейчас вот с 0 всё поднял.

        Да, была моя ошибка.
        Но почему когда я пытаюсь выпустить сертификат letscrypt для именно домена (не поддомена) он говорит

        Certbot failed to authenticate some domains (authenticator: standalone). The Certificate Authority reported these problems:
        Domain: site1
        Type: unauthorized
        Detail: 2a03:6f00:1::5c35:60f3: Invalid response from https://vh372.timeweb.ru/parking/?ref=site1: "\n\n\n \n <meta name=\"viewport\" content=\"width=device-width, initia"

        Hint: The Certificate Authority failed to download the challenge files from the temporary standalone webserver started by Certbot on port 80. Ensure that the listed domains point to this machine and that it can accept inbound connections from the internet.

        Хотя для под-домена - всё ок выпустил.
        У хостера в настройказ ДНС что у домена что у поддомена указан один и тот же А адрес

        Спасибо

  3. Скрипт безопасной настройки MariaDB изменился на /usr/bin/mariadb-secure-installation

  4. Доброго времени суток!
    Возник вот какой вопрос:
    "z.serveradmin.ru" - имя тестового виртуального хоста и сайта
    "pma.serveradmin.ru" - имя виртуального хоста для phpmyadmin
    Эти имена нужно где-то приобретать или как? Мы к ним потом будем обращаться в адресной строке или к ip адресу сервера на прямую?
    Сразу прошу прощения за совсем глупый вопрос.

    • Да, нужно покупать. У меня куплен домен serveradmin.ru, а поддомены, типа z или pma я могу создавать какие угодно и сколько угодно. Покупается только доменное имя второго уровня.

      • А без покупки имени это провернуть как-то можно? Только при помощи внешнего ip.

        • Что именно провернуть?

          • Ну поскольку я пока это все тестирую, то доменное имя пока покупать не хочу, да и идей по его виду нет. Так вот - можно ли использовать поддоменные имена в виде "pma.xxx.x.xxx.xxx"? Где xxx.x.xxx.xxx - внешний ip.

            • Поддомены нет. Можете просто всё настроить на ip адресе. Он и будет вашим единственным доменом.

              • Хорошо, тогда еще пару вопросов:
                Я правильно понимаю, что в случае с ip мне в /etc/nginx/config.d/ можно скопировать файл default.conf переименовать его в xxx.x.xxx.xxx.conf? И указать
                listen 80;
                server_name xxx.x.xxx.xxx;

                Второй вопрос - я так понимаю, что в случае с ip адресом получить сертификаты ssl не выйдет.
                Еще вопрос по поводу nginx.conf - его можно настраивать по вашему примеру или в нем нужно будет закомментировать часть про ssl?
                P.S.: полную статью про установку и настройку nginx также штудирую паралельно с этой, но вопросы все равно появляються =)

                • Имена конфигурационных файлов могут быть любые. К ним не обязательно привязываться. Главное, чтобы окончание было .conf. Если используете ip в качестве доменного имени, можно прямо конфиг default и использовать. Он изначально для работы по ip адресу и рассчитан. Server_name можно вообще не указывать.

                  TLS сертификат получить на ip адрес не получится. Хотя может и можно как-то, я никогда этого не делал и не проверял.

  5. Сергей

    Добрый день,

    если много сайтов есть смысл сделать несколько виртуалок на гипервизоре? памяти и место достаточно? И как лучше защитить их? Или в какую сторону лучше смотреть насчет защиты виртуальных машин. Как можно лучше "за-контейренить" каждый сайт, ну в смысле если один упал и за плохого кода, то остальных это не коснулось. Докер для этого наверное не стоит, как насчет LXC контейнеров, каждый контейнер содержит все что нужно для сайта.

    Владимир у вас пару статей на LXC контейнеры в 2018/2019. Они ( LXC контейнеры ) уже не актуальны? Или лучше на proxmox-е делать лучше все контейнеры для каждого сайта?

    Спасибо вам!

    • Так трудно сказать однозначно. Все зависит от различных условий. Каждому сайту по вируталке - идеальный вариант с точки зрения изоляции и безопасности, но понятное дело, что большой расход ресурсов сервера идет, плюс сильно усложняется управление. Для хостинга типовых сайтов на едином стеке технологий (например php+mysql) проще использовать один сервер, обеспечивая безопасность разделением доступа к файлам и запуском служб от разных пользователей. Именно это я и показываю в статье. Все виртуальные хостинги строятся плюс-минус именно так.

      Контейнеры - тема скорее для удобства разработки и разворачивания кода, а не эксплуатации.

  6. Добрый день! А если у меня в конфиге /etc/letsencrypt/renewal написано вот так:

    [renewalparams]
    account = da611fab863b2b116f0d6da6ca5e6775
    pref_challs = dns-01,
    server = https://acme-v02.api.letsencrypt.org/directory
    authenticator = manual
    manual_public_ip_logging_ok = None

    Обновление сертификатов происходило не по http01 а по DNS, то как нужно его подправить чтобы автоматически был перевыпуск сертификатов?

    • Я точно не знаю. Можете просто погонять тестовые запуски certbot без выпуска сертификата. Для этого ключ dry-run добавьте к запуску. Если будут ошибки в конфиге, вы их увидите.

  7. Приветствую , после настройки не запускается ни один домен пишет ошибку , что больше 20 редиректов, подскажите , как исправить

  8. Сергей

    Здравствуйте.
    Certbot-Auto больше не поддерживается Electronic Frontier Foundation (EFF).
    We used to have a shell script named certbot-auto to help people install Certbot on UNIX operating systems, however, this script is no longer supported. If you want to uninstall certbot-auto, you can follow our instructions here.

    https://certbot.eff.org/docs/install.html#certbot-auto

    • Спасибо за информацию. Сейчас поправлю статью.

    • Сергей

      Здравствуйте.

      # chown -R nginx. /var/lib/php/session

      Точка после "nginx" не лишняя? С данной командой возникает ошибка "session_start(): open(SESSION_FILE, O_RDWR) failed: Permission denied (13)"

      • Нет, точно не лишняя. Это аналог записи nginx:nginx С точкой просто писать меньше. Указанную ошибку вообще не понимаю. Ни разу не видел.

  9. # /usr/local/bin/certbot-auto
    Skipping bootstrap because certbot-auto is deprecated on this system.
    Your system is not supported by certbot-auto anymore.
    Certbot cannot be installed.
    Please visit https://certbot.eff.org/ to check for other alternatives.

    Что делать?

    • Просто установить certbot через dnf. Думаю, его уже завезли в стандартные репы:
      # dnf install certbot

  10. Андрей
    2020/12/21 07:12:35 [error] 6256#6256: *7 directory index of "/web/sites/сайт.su/www/" is forbidden, client: 5.79.226.134, server: сайт.su, request: "GET / HTTP/2.0", host: "сайт.su"
    2020/12/21 07:29:47 [crit] 1239#1239: *4 stat() "/web/sites/сайт.su/www/bitrixsetup.php" failed (13: Permission denied), client: 5.79.226.134, server: сайт.su, request: "GET /bitrixsetup.php HTTP/2.0", host: "сайт.su"

    Вроде всё сделал по вашему мануалу, но SELinux блокирует.

    • Смотрите лог selinux, каких разрешений не хватает. С помощью audit2allow еще раз сформируйте модуль для selinux и загрузите его.

  11. Здравствуйте, подскажите когда ситуация что на одном внешнем IP висит несколько вэб-серверов, например одна ВМ это почтовик, вторая ВМ это различные сервисы типа zabbix elk и т.п. Так вот почтовик использует apache 80 и 443 порт и второй веб-сервер с сервисами на nginx также использует 80 и 443 порт под свои сервисы phpMyAdmin например. Не пойму как сделать dstnat на mikrotike чтобы не конфликтовали веб-сервера? В DNS хостинга адреса service.имя_домена.ru и mail.имя_домена.ru висят на одном и том же внешнем IP а веб-сервера по факту разные.

    • Для этого нужно использовать какой-то http прокси, чтобы управлять входящими соединениями и перенаправлять их на разные виртуалки в зависимости от домена. Пример такой настройки - https://serveradmin.ru/nginx-proxy_pass/

  12. Спасибо, большое, столько время сэкономил, и не в первый раз

  13. Здравствуйте, Владимир. Подскажите, как мне сертификат получить для поддоменов. Чтобы не для каждого поддомена получать каждый раз сертификат, а один на все поддомены? Просто при получении помимо основного домена указать еще *.domen.ru . Этого достаточно будет?

  14. Я решил немного изменить директорию для сайтов на var/www (так привычнее для меня).
    Но теперь есть открыть домен в браузере вижу ошибку 403 Forbidden
    И в логах самого сайта "/var/www/example.ru/public_html/index.html" is forbidden (13: Permission denied)

    Я понимаю что нужно настроить какие-то права но пока не совсем понимаю какие именно.

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

  15. Аноним

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

    nginx: [emerg] cannot load certificate "/etc/letsencrypt/live/домен.ru/fullchain.pem": BIO_new_file() failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/etc/letsencrypt/live/дщмен.ru/fullchain.pem','r') error:2006D080:BIO routines:BIO_new_file:no such file)
    nginx: configuration file /etc/nginx/nginx.conf test failed

    • Четко написано, что нет файла сертификата - /etc/letsencrypt/live/домен.ru/fullchain.pem
      Либо ошиблись с названием домена, либо сертификат не получили.

      • Аноним

        Так эту ошибку выдает имено при попытке получения сертификата. при команде certbot-auto certonly

      • Аноним

        certbot-auto certonly
        Saving debug log to /var/log/letsencrypt/letsencrypt.log
        Error while running apachectl configtest.

        AH00526: Syntax error on line 85 of /etc/httpd/conf.d/ssl.conf:
        SSLCertificateFile: file '/etc/pki/tls/certs/localhost.crt' does not exist or is empty

        Error while running nginx -c /etc/nginx/nginx.conf -t.

        nginx: [emerg] cannot load certificate "/etc/letsencrypt/live/домен.ru/fullchain.pem": BIO_new_file() failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/etc/letsencrypt/live/дщмен.ru/fullchain.pem','r') error:2006D080:BIO routines:BIO_new_file:no such file)
        nginx: configuration file /etc/nginx/nginx.conf test failed

        домен указывается правильно

  16. после правок локальных и заливки файлов на сервак , ошибка ....premissive denied ... тк владелец/группа залитых root:root, приходиться постоянно выполнять после заливки команду sudo chown -R nginx:nginx /web

    Подскажите что где не правильно настроил ?

    • Не понял, о какой заливке файлов идет речь? Через sftp?

      • Аноним

        ну да в шторме, добавляю файлы моделей итп , потом лью их на сервак

        • Значит льете от учетки root. Логиньтесь учеткой, от которой веб сервер работает для этого сайта, тогда владельцем будет нужный пользователь.

  17. Дмитрий

    Добрый день.
    Опыта особо нет, пытаюсь найти как связать и развернуть на различных вируталках связку серверов confluence+jira+bitbucket
    Везде показывают примеры когда сайты находятся на одной машине где сам nginx, а мне надо что то вроде чтобы на jira.mydomain.com попадало на 192.168.0.11 confluence.mydomain.com на 192.168.0.12. При этом на роутере имеющtv внешний адрес mydomain я пробрасываю 80 порт на машину nxinx с адресом 192.168.0.10

    Я нашел у вас статью "Настройка proxy_pass в nginx" мне в ту сторону смотреть?

  18. А можно подробней как получить и автоматически продлевать WildCard сертификаты и переадресацию с несуществующего домена 3го уровня на главный домен 2го... конкретней задача единый сертификат на simple.com и http://www.simple.com с авто продлением , а так же переброс с несуществующего домена blablabla.simple.com на главный simple.com

  19. Виталий

    В общем не знаю что за фигня, но у меня сюда: access_log /web/sites/z.serveradmin.ru/log/access.log main; и error_log /web/sites/z.serveradmin.ru/log/error.log; прописан доступ как положено, но тем немение служба не стартует, говорит что нет доступа и всё ("log/access.log" failed (13: Permission denied)).
    Прописал сюда:
    access_log /var/log/nginx/z.serveradmin/access.log main; и error_log /var/log/nginx/z.serveradmin/error.log;
    chown nginx. var/log/nginx
    и заработало.

  20. Виталий

    День добрый, хотел для общего развития попробовать на виртуалку установить nginx, но возникла проблема с ssl сертификатами, подскажите пожалуйста где надо изменить настройки чтоб работало без ssl.

    • Для этого надо строку:

      listen 443 ssl http2;

      заменить на:

      listen 80;

      Вот это вообще убрать:

          ssl_certificate		/etc/letsencrypt/live/z.serveradmin.ru/fullchain.pem;
          ssl_certificate_key		/etc/letsencrypt/live/z.serveradmin.ru/privkey.pem;
      server {
           listen  443 ssl http2;
           server_name  www.z.serveradmin.ru;
           return 301 https://z.serveradmin.ru$request_uri;
      }
      server {
          listen 80;
          server_name z.serveradmin.ru;
          root /web/sites/z.serveradmin.ru/www/;
          index index.php index.html index.htm;
          access_log /web/sites/z.serveradmin.ru/log/access.log main;
          error_log /web/sites/z.serveradmin.ru/log/error.log;
      
          location / {
          return 301 https://z.serveradmin.ru$request_uri;
          }
      }
  21. Добрый день. Спасибо вам за ваш труд !
    Владимир, уже настроил сайт по вашей статье nginx+apache

    Хотелось бы услышать ваше мнение по поводу, что все-таки лучше или производительнее
    связка nginx+apache или nginx+php-fpm для интернет-магазина (opencart)
    В инете встречаются еще хитрые связки nginx+php-fpm+apache - можете ли высказать ваше мнение по этому сочетанию ?
    Спасибо

    • Нет достоверных данных. Разница про производительности минимальна и может зависеть от конкретного проекта. Если есть возможность работать на php-fpm, то лучше на нем, так как банально настраивать проще и удобнее. Это как по мне. Php-fpm более легковесный. К тому же в последних версиях apache сам использует php-fpm по дефолту для php. Так что если можно обойтись без apache, лучше убрать лишнее звено. Но если без него никак, я бы не тратил много сил, чтобы вывести его из работы.

  22. Евгений

    Добрый день.

    Все установил и настроил согласно вашей статьи.
    Но, всё это крутиться на домашнем сервере и проблема в том, что снаружи, из интернета, все прекрасно работает, а из локальной сети нет. Как можно попадать на сайты из локальной сети? типа ip/www/sites/siteadmin.ru/ или ещё как ?

    • Из локальной сети по имени домена должен резолвиться локальный ip адрес, а не внешний. Это решается с помощью локального dns сервера или правкой файла hosts на локальных компах.

      • Ну вот добавляю в DNS сервере А запись вида service.factory.pp.ua и веду её на локальный адрес веб-сервера. Ну дело в том что FQDN адрес получается не service.factory.pp.ua а service.factory.pp.ua.corp.loc дописывается суффикс домена и соответственно в браузере пишет что сертификат не действительный потому как выдан на service.factory.pp.ua. Как можно разрешить данную ошибку?

        • Не дописывать .loc в конце к домену. Зачем вы его добавляете? Сертификат должен точно соответствовать доменному имени, откуда бы вы не обращались к нему. Эту проверку делает браузер.

          • Я не добавляю, суффикс домена он сам приписывается когда добавляю запись в dns windows server. И получается что локальный веб сервер пингуется по fqdn имени service.factory.pp.ua.corp.loc а по адресу service.factory.pp.ua пинг идёт на внешний белый ip

            • Добавьте себе в локальный dns сервер зону factory.pp.ua, добавьте хост service и отдавайте локальным клиентам по запросу к адресу service.factory.pp.ua локальный адрес этого сервера.

              В общем, у вас вопрос на 100% к работе dns. Настройте все правильно и нормально будут работать сертификаты.

  23. Вот что пишет erorr.log | grep site2.net

    2020/06/07 17:42:01 [error] 6858#6858: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 3.12.146.51, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "site2.net"
    2020/06/07 17:42:09 [error] 6858#6858: *4 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 3.17.144.126, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "site2.net"
    2020/06/07 18:22:46 [emerg] 7145#7145: open() "/home/ve1l/site2.net/log/access.log" failed (2: No such file or directory)
    2020/06/07 18:23:55 [emerg] 7169#7169: open() "/home/ve1l/site2.net/log/access.log" failed (2: No such file or directory)
    2020/06/07 18:27:29 [emerg] 7308#7308: open() "/home/ve1l/site2.net/log/access.log" failed (2: No such file or directory)
    2020/06/07 18:30:56 [emerg] 7364#7364: open() "/web/sites/site2.net/log/access.log" failed (2: No such file or directory)
    2020/06/07 18:33:52 [emerg] 7454#7454: open() "/web/sites/site2.net/log/access.log" failed (2: No such file or directory)
    2020/06/07 18:36:12 [emerg] 7484#7484: open() "/web/sites/site2.net/log/access.log" failed (2: No such file or directory)
    2020/06/07 18:38:36 [emerg] 7505#7505: open() "/web/sites/site2.net/log/access.log" failed (2: No such file or directory)
    2020/06/07 18:40:02 [emerg] 7520#7520: open() "/web/sites/site2.net/log/access.log" failed (2: No such file or directory)
    2020/06/07 18:43:20 [emerg] 1487#1487: open() "/web/sites/site2.net/log/access.log" failed (2: No such file or directory)
    2020/06/07 18:49:11 [emerg] 1749#1749: open() "/web/sites/site2.net/log/access.log" failed (2: No such file or directory)
    2020/06/07 18:49:56 [emerg] 1754#1754: open() "/web/sites/site2.net/log/access.log" failed (2: No such file or directory)
    2020/06/07 18:58:51 [emerg] 1803#1803: open() "/web/sites/site2.net/log/access.log" failed (2: No such file or directory)
    2020/06/07 19:00:33 [emerg] 1812#1812: open() "/web/sites/site2.net/log/access.log" failed (2: No such file or directory)
    2020/06/07 19:01:22 [emerg] 1832#1832: open() "/web/sites/site2.net/log/access.log" failed (2: No such file or directory)
    2020/06/07 19:01:26 [emerg] 1835#1835: open() "/web/sites/site2.net/log/access.log" failed (2: No such file or directory)
    2020/06/07 19:06:10 [emerg] 1914#1914: open() "/web/sites/site2.net/log/access.log" failed (2: No such file or directory)
    2020/06/07 19:10:21 [emerg] 1937#1937: open() "/web/sites/site2.net/log/access.log" failed (2: No such file or directory)
    2020/06/07 19:19:20 [emerg] 2094#2094: open() "/web/sites/site2.net/log/error.log" failed (2: No such file or directory)
    2020/06/07 19:32:14 [warn] 2363#2363: only the last index in "index" directive should be absolute in /etc/nginx/conf.d/site2.net.conf:6
    2020/06/07 19:32:39 [warn] 2368#2368: only the last index in "index" directive should be absolute in /etc/nginx/conf.d/site2.net.conf:6
    2020/06/07 21:05:47 [warn] 2335#2335: conflicting server name "site2.net" on 0.0.0.0:80, ignored
    2020/06/07 21:05:47 [warn] 2335#2335: conflicting server name "www.site2.net" on 0.0.0.0:80, ignored
    2020/06/07 21:05:47 [warn] 2335#2335: conflicting server name "site2.net" on 0.0.0.0:443, ignored
    2020/06/07 21:05:47 [warn] 2335#2335: conflicting server name "www.site2.net" on 0.0.0.0:443, ignored
    2020/06/09 18:32:19 [warn] 1403#1403: "ssl_stapling" ignored, host not found in OCSP responder "ocsp.int-x3.letsencrypt.org" in the certificate "/etc/letsencrypt/live/site2.net/fullchain.pem"
    2020/06/09 18:37:11 [warn] 1446#1446: "ssl_stapling" ignored, host not found in OCSP responder "ocsp.int-x3.letsencrypt.org" in the certificate "/etc/letsencrypt/live/site2.net/fullchain.pem"
    2020/06/09 18:42:01 [warn] 1446#1446: "ssl_stapling" ignored, host not found in OCSP responder "ocsp.int-x3.letsencrypt.org" in the certificate "/etc/letsencrypt/live/site2.net/fullchain.pem"
    2020/06/09 21:31:04 [warn] 1449#1449: "ssl_stapling" ignored, host not found in OCSP responder "ocsp.int-x3.letsencrypt.org" in the certificate "/etc/letsencrypt/live/site2.net/fullchain.pem"
    2020/06/10 03:11:15 [warn] 1461#1461: "ssl_stapling" ignored, host not found in OCSP responder "ocsp.int-x3.letsencrypt.org" in the certificate "/etc/letsencrypt/live/site2.net/fullchain.pem"
    2020/06/10 03:14:24 [warn] 1443#1443: "ssl_stapling" ignored, host not found in OCSP responder "ocsp.int-x3.letsencrypt.org" in the certificate "/etc/letsencrypt/live/site2.net/fullchain.pem"
    2020/06/10 03:19:09 [warn] 1445#1445: "ssl_stapling" ignored, host not found in OCSP responder "ocsp.int-x3.letsencrypt.org" in the certificate "/etc/letsencrypt/live/site2.net/fullchain.pem"
    2020/06/10 03:22:05 [warn] 1450#1450: "ssl_stapling" ignored, host not found in OCSP responder "ocsp.int-x3.letsencrypt.org" in the certificate "/etc/letsencrypt/live/site2.net/fullchain.pem"
    2020/06/10 15:09:17 [warn] 2189#2189: "ssl_stapling" ignored, host not found in OCSP responder "ocsp.int-x3.letsencrypt.org" in the certificate "/etc/letsencrypt/live/site2.net/fullchain.pem"
    • Как минимум, у вас прямым текстом написана ошибка:
      open() "/web/sites/site2.net/log/access.log" failed (2: No such file or directory)
      Такого файла не существует. Где-то ошибка в пути скорее всего. Проверяйте.

      Ну и дальше все ошибки прямым текстом описаны. Берите и исправляйте. Они гуглятся хорошо, если что. Вы походу что-то не то с конфигом сделали, так как ошибки практически по всем параметрам.

  24. День добрый, спасибо за статью, очень всё подробно, всё получилось.
    Вопрос в другом, когда я создал конфиг для второго сайта, он выдаёт 502 ошибку, я для него тоже стянул ssl, всё так же по инструкции, слушают одни и те же порты. Подскажите как исправить, чтобы оба работали через https я думаю в этом может быть проблема.
    Скажите какую информацию вам скинуть, ведь по сути это ваш конфиг, только с разными доменами.

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

      • А какие именно логи глянуть, подскажите. Потому что, я полностью делал по аналогии.

        • Общий лог nginx - /var/log/nginx/access.log или error.log. Если для виртуального хоста логи в отдельный файл направляли, смотрите там. Надо просто узнать, почему 502 ошибка.

  25. Спасибо за статью века!

    у меня глупый вопросик... ребят ща мы всё установили. а с php-fpm ничего больше не надо делать? имею ввиду чисто написал коды в php и всё сработает? или допольнительно для него надо опять сёрифировать интернет?

    заранее спасибо за ответ!

    • Да, все верно. Если веб сервер уже работает, то больше ничего настраивать не надо. Достаточно писать код на php. Ну и про обновление не забывать. Рано или поздно, надо будет обновления ставить. Лучше сразу приучиться делать это регулярно. Хотя бы раз в месяц.

  26. запускаем nginx от nginx
    сертификаты делаем под root

    как думаете будет работать ???
    ============================
    sudo -u nginx nginx -t
    nginx: [warn] the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:1
    nginx: [emerg] cannot load certificate "/etc/letsencrypt/live/0307.sytes.net/fullchain.pem": BIO_new_file() failed (SSL: error:0200100D:system library:fopen:Permission denied:fopen('/etc/letsencrypt/live/0307.sytes.net/fullchain.pem','r') error:2006D002:BIO routines:BIO_new_file:system lib)
    nginx: configuration file /etc/nginx/nginx.conf test failed
    ===================================

  27. Either get and install your certificates...
    #sudo /usr/local/bin/certbot-auto --nginx

  28. Правильно ли я понял что для запрета индексации можно использовать:
    location = /robots.txt {
    deny all;
    log_not_found off;
    access_log off;
    }

    или
    location = /robots.txt {
    add_header Content-Type text/plain;
    return 200 "User-agent: *\nDisallow: /\n";
    }

    • Нет, вы просто запретите доступ к файлу robots.txt. Это не означает, что вас не будут индексировать. Будут, просто без учета настроек этого файла. Я считаю, что поисковые системы индексируют все, несмотря на настройки. Им это выгодно, все знать. Надежный способ закрыть сайт от индексации - запаролить его.

  29. Здравствуйте, Владимир. В прошлой установке (на centos 7 - https://serveradmin.ru/ustanovka-i-nastroyka-nginx-php-fpm-php7-1-na-centos-7/#_php-fpm_71) при установке php-fpm 7.1 - мы дописывали в конфиге /etc/php-fpm.d/www.conf еще несколько строчек (разрешения и группу для сокета):
    listen.mode = 0660
    listen.owner = nginx
    listen.group = nginx
    в данной установке (для centos 8) - эти настройки есть в дефолтном конфиге в закомментированном виде, нужно ли их раскомментировать?

    • Вроде не обязательно, если в статье не указано. Точно не помню, но вроде эти настройки не действуют, если активна другая настройка, которая рядом в конфиге.

  30. Владимир, все я кажется начал разбираться, как переносить сайт на новый домен, нужно под новый домен виртуальные хосты создать и с них сделать редирект со старого конфига nginx. Подскажите мне вот эту запись "return 301 $scheme://new-name.com;" делать только, где порт 443 без WWW И еще вот вы пишете , что в этом конфиге nginx отключен редирект файла robots.txt и что он отдельно отдается по http и https. Я этого не увидел в конфиге, вот про Cento7 вы писали статью там, это было. Спасибо.

  31. Владимир, спасибо Вам за статью. Настраивал по ней - все работает, все круто!
    Но так случилось, что мне нужно переехать на новый домен и сделать 301 редирект чтобы не терять позиции в поисковых системах и не терять вес старого домена, да и вообще чтобы яндекс не подумал что я клон сайта сделал с неуникальным контентом и не наложил фильтры. Подскажите, учитывая конфиги nginx в этой статье где конкретно нужно поставить редиректы, чтобы ничего не упустить, а то я запутался уже..

    • Вот тут в статье про nginx отдельно рассматриваю редиректы - https://serveradmin.ru/ustanovka-i-nastrojka-nginx/#__rewrite
      В общем случае вам просто надо поставить редирект на новое доменное имя и все. Никаких сложностей.

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

      • А мне для каждого порта ( с WWW и без WWW) нужно проставить редиректы, я правильно понимаю? Например с 80-ого порта с WWW старого домена редирект на новый домен с WWW. И так далее. И соответственно c 443 порта старого домена редирект на новый? А также создать каталог виртуального хоста с названеим нового домена, путь рута прописать новый, получить новые сертификаты SSL -указать новый путь. Сорри за нубские вопросы.

        • Буду Вам очень благодарен, если вы скинете этот конфиг видоизмененый под новый домен. Например новый домен 2z.serveradmin.ru

          Ваш старый конфиг:

          server {
          listen 443 ssl http2;
          server_name pma.serveradmin.ru;
          root /web/sites/pma.serveradmin.ru/www/;
          index index.php index.html index.htm;
          access_log /web/sites/pma.serveradmin.ru/log/access.log main;
          error_log /web/sites/pma.serveradmin.ru/log/error.log;

          auth_basic "Restricted Content";
          auth_basic_user_file /etc/nginx/.htpasswd;

          ssl_certificate /etc/letsencrypt/live/pma.serveradmin.ru/fullchain.pem;
          ssl_certificate_key /etc/letsencrypt/live/pma.serveradmin.ru/privkey.pem;

          location ~ \.php$ {
          fastcgi_pass unix:/run/php-fpm/www.sock;
          fastcgi_index index.php;
          fastcgi_param DOCUMENT_ROOT /web/sites/pma.serveradmin.ru/www/;
          fastcgi_param SCRIPT_FILENAME /web/sites/pma.serveradmin.ru/www$fastcgi_script_name;
          fastcgi_param PATH_TRANSLATED /web/sites/pma.serveradmin.ru/www$fastcgi_script_name;
          include fastcgi_params;
          fastcgi_param QUERY_STRING $query_string;
          fastcgi_param REQUEST_METHOD $request_method;
          fastcgi_param CONTENT_TYPE $content_type;
          fastcgi_param CONTENT_LENGTH $content_length;
          fastcgi_intercept_errors on;
          fastcgi_ignore_client_abort off;
          fastcgi_connect_timeout 60;
          fastcgi_send_timeout 180;
          fastcgi_read_timeout 180;
          fastcgi_buffer_size 128k;
          fastcgi_buffers 4 256k;
          fastcgi_busy_buffers_size 256k;
          fastcgi_temp_file_write_size 256k;
          }
          }

          server {
          listen 80;
          server_name pma.serveradmin.ru;
          root /web/sites/pma.serveradmin.ru/www/;
          index index.php index.html index.htm;
          access_log /web/sites/pma.serveradmin.ru/log/access.log main;
          error_log /web/sites/pma.serveradmin.ru/log/error.log;

          location / {
          return 301 https://pma.serveradmin.ru$request_uri;
          }
          }

  32. Подскажите как при данной установке nginx (как я понял мы не собираем из исходников) добавить после установки модуль --add-module=nginx-push-stream-module ?

    • А дефолтная установка из пакета точно без этого модуля идет? Мне кажется она его включает. Достаточно просто его настройки указать и он будет работать. Если нет, то придется собирать из исходников самому.

  33. При генерации сертификата когда вводу поддомен, система выдает что не привязан email адрес - это нормально? И где тогда его вводить, ведь система ничего ранее не запрашивала.

  34. Здравствуйте! у меня вопрос вы указываете вот так

    fastcgi_param DOCUMENT_ROOT /web/sites/pma.serveradmin.ru/www/;
    fastcgi_param SCRIPT_FILENAME /web/sites/pma.serveradmin.ru/www$fastcgi_script_name;
    fastcgi_param PATH_TRANSLATED /web/sites/pma.serveradmin.ru/www$fastcgi_script_name;

    а Я вот так
    fastcgi_param DOCUMENT_ROOT $document_root;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    этого у меня нету fastcgi_param PATH_TRANSLATED

    есть разница Я думал переменные сами всё делают или эта не так? у больше опыта дайте совет и про PATH_TRANSLATED зачем она (коротко если можно), спасибо

    • Писать полный путь вручную или $document_root, если они совпадают не принципиально. Зачем нужен PATH_TRANSLATED уже не помню. Это легко гуглится, можете сами почитать. Эти конфиги были сделаны много лет назад и по привычке кочуют из проекта в проект. По-моему, я смотрел рекомендации на сайте wordpress конкретно для этих сайтов. И на основе их составлял конфиг.

  35. Евгений

    Здравствуйте.
    На днях разобрался с запуском CentOS 8 на ВМ поколения 2 Hyper-v 2016. Оказалось , что у Microsoft UEFI firmware bug и Red hat предлагает использовать Hyper-V Server 2019. Помогло.
    По поводу MariaDB. У меня 10.4 установилось без проблем. Согласно инструкции с mariadb.org , создаем mariadb.repo и даем две команды:
    dnf install boost-program-options
    dnf install MariaDB-server MariaDB-client --disablerepo=AppStream
    И вопрос.
    Сегодня вышел релиз PHP 7.4 , и также прочитал , что 7.2 в ноябре снимается с поддержки.
    Я сейчас, поднимаю новый интернет-магазин, и в полном замешательстве.
    Какую версию PHP ставить?
    Если есть мысли, буду благодарен.

    • Значит баг с репозиторием Mariadb починили.

      Насчет версии php - какую последнюю версию поддерживает магазин, такую и используйте. Не вижу тут причин для раздумий.

  36. Споткнулся на установке mariadb:
    [root@=========== yum.repos.d]# sudo dnf install MariaDB-server MariaDB-client --disablerepo=AppStream
    Последняя проверка окончания срока действия метаданных: 0:10:46 назад, Чт 14 ноя 2019 20:00:38.
    Отсутствуют совпадения для аргумента: MariaDB-server
    * Возможно, вы имели в виду: mariadb-server
    Отсутствуют совпадения для аргумента: MariaDB-client
    Ошибка: Совпадений не найдено
    [root@========== yum.repos.d]#

    • Я же упомянул эту проблему в статье. Это баг официального репозитория mariadb для centos 8. Как решить я не понял, но и не стал сильно заморачиваться. Версия 10.3 из базового репозитория вполне сойдет.

      • А как ставить то ее?

      • [root@localhost rsyslog.d]# yum install MariaDB-server MariaDB-client
        MariaDB 8.5 kB/s | 2.9 kB 00:00
        Последняя проверка окончания срока действия метаданных: 0:00:01 назад, Чт 14 янв 2021 14:12:07.
        Все совпадения отфильтрованы модульным фильтрованием для аргумента: MariaDB-server
        * Возможно, вы имели в виду: mariadb-server
        Все совпадения отфильтрованы модульным фильтрованием для аргумента: MariaDB-client
        Ошибка: Совпадений не найдено: MariaDB-server MariaDB-client

        • Изменился адрес репозитория для 10.4. Я поправил статью, поменял на версию 10.5. Теперь все нормально. По статье ставится mariadb корректно.

  37. Дмитрий

    Поставил все по инструкции все прекрасно шаблоны ставятся сайт на wordpress, но вот переводы хотят ftp

    Чтобы осуществить запрошенное действие, WordPress необходим доступ к вашему серверу. Пожалуйста, введите координаты доступа к FTP. Если вы не помните координаты, можно узнать их в службе поддержки вашего хостинг-провайдера.

    • Аноним

      Как это возможно победить?

    • Что-то недонастроили. Запрос на ftp выскакивает, если процесс php-fpm не имеет прав на запись в директорию, в которую хочет что-то установить.

  38. Для selinux я бы добавил правила.
    semanage fcontext -a -t httpd_sys_rw_content_t "DOCUMENT_ROOT/data/www(/.*)?"
    semanage fcontext -a -t httpd_log_t "DOCUMENT_ROOT/data/logs(/.*)?"
    semanage fcontext -a -t httpd_tmp_t "DOCUMENT_ROOT/data/tmp(/.*)?
    restorecon -vR DOCUMENT_ROOT/data/

    • На самом деле я добавлял, применительно к моей статье, вот эти правила:

      semanage fcontext -a -t httpd_sys_content_t "/web/sites(/.*)?"
      semanage fcontext -a -t httpd_log_t "/web/sites(/.*)?/log(/.*)?"

      Проверял, все ОК, они нормально добавлялись. Вот чего я не понял, почему и без этих правил все работает. Я внимательно посмотрел на модуль, который создается автоматически и не понял, какое конкретно разрешение позволяет web серверу нормально работать без добавление новых директорий для контента и логов.

      • Без этих правил работать не будет, по крайней мере, у меня не стартовал сервис nginx, ругался на permission denied на лог файл. Возможно, выполняли # setenforce 0.

        • Будет, проверял много раз. Включаем в момент настройки setenforce 0, когда все закончили, делаем автоматически модуль:

          # grep nginx /var/log/audit/audit.log | audit2allow -M nginx
          # semodule -i nginx.pp

          Включаем:
          # setenforce 1

          Nginx работает. Тут наших директорий нет:

          semanage fcontext -l | grep httpd_log_t
          semanage fcontext -l | grep httpd_sys_content_t

          Собственно, все это можно наглядно увидеть на видео, я записал весь процесс настройки, в том числе selinux.

  39. Владимир

    Спасибо за статью, все толково написано

  40. Спасибо за статью.
    Можно про установку Asterisk на Cent OS 8?

    • Сомневаюсь, что он сейчас встанет туда. Надо ждать, когда все пакеты и репы подготовят к новой системе. Я пока еще не пробовал.

      • Вот у меня и не становится. То есть становится, но с ошибками PID. Сколько форумов не перелопатил, везде одно и то же. Буржуйские копируют друг друга, наши русские - те же буржуйские, только на другом языке.
        Буду ждать, спасибо. А пока довольствуюсь рабочим вариантом на Debian 10.

  41. сделай статью про nginx настройку нескольких доменов на одном айпи генерацией сертификатов и настройкой уровнем A+ желательно на freebsd

    • Это все уже сделано в этой статье. 2 домена на одном ip, конфиги и сертификаты tls дают рейтинг А+. В freebsd все будет один в один такое же, так как формат конфига nginx во всех системах одинаковый.

      • спасибо.. я просто пролистал.. не внимательно... выходные всётаки.. прошу прощения.. сейчас изучу)

        • Аноним

          настроил как ты рекомендовал... получил рейтинг F+
          пересмотри тут https://habr.com/ru/post/252821/
          поменял параметры как с на хабре получил A+
          в целом очень толково написано...

          • Ты просто где-то ошибся. Ту статью я знаю давно, брал из нее рекомендации. Но она устарела. В то время еще не было tls 1.3. С моими настройками будет A+. Я кучу серверов настраиваю. В том числе и этот сайт так же настроен. Можешь проверить его рейтинг.

  42. не хватает пункта по настройке push модулей для nginx

    • Это уже нишевые настройки. Нужны далеко не всем. Про nginx можно много всего писать.

  43. Очень хорошая статья! Спасибо вам!

  44. Родиион

    еще бы на Debian/Ubuntu такое сделать. Спасибо за статью

    • Возможно будет. Не хватает времени одному поддерживать актуальность статей на нескольких системах, с учетом того, что все они постоянно обновляются.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar