В связи с выходом нового релиза популярной операционной системы пришло время актуализировать некоторые статьи. Сегодня я настрою производительный веб сервер CentOS 8 на свежих версиях nginx, php-fpm, где сам php версии 7.2. Сейчас пока нет необходимости использовать сторонние репозитории для php, так как в стандартных присутствует свежая и актуальная версия.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Цели статьи
- Описать общий принцип настройки web сервера на базе nginx.
- Показать, как установить актуальные версии nginx, php-fpm и mariadb.
- Привести примеры своих конфигов для перечисленных сервисов.
- Настроить бесплатные ssl сертификаты let's encrypt для сайтов.
- Показать, как настроить selinux для web сервера nginx.
- Записать и показать видео настройки веб сервера.
Данная статья является частью единого цикла статьей про сервер 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 и добавляем в автозагрузку.
# systemctl start nginx # systemctl enable nginx
Проверяем, запустился ли web сервер. Для этого идем по ссылке http://75.37.225.138/. Вы должны увидеть стандартную страницу заглушку.
Если ее не видите, скорее всего у вас включен и не настроен 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
Теперь выполним небольшую начальную настройку. Очень подробно вопрос настройки 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-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
Наша следующая задача - получить бесплатные сертификаты. Для этого временно остановим 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 и добавляем в автозагрузку.
# 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 я рассматривал отдельно. Можете зайти в панель и создать базу 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.
На этом основная настройка web сервера завершена. Он уже полностью работоспособен. Если вам достаочно этого функционала, то можете сразу переходить к настройке ротации логов.
Доступ к сайту по sftp
Если вы администратор и единственный пользователь, то больше можно ничего не делать. Вы и так сможете загрузить на сервер все что нужно тем или иным способом. Если же вы будете передавать управление сайтами другим людям, им нужен доступ к директории с исходниками сайта. Раньше для этих целей повсеместно использовали ftp. Если вы хотите так сделать, у меня есть статья по настройке ftp сервера vsftpd.
Я же предлагаю использовать sftp по нескольким причинам:
- Он безопаснее.
- Его быстрее настроить.
- Не надо отдельно настраивать 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 сервера. Общий смысл их следующий:
- У нас нестандартная директория для сайтов - /web/sites, по-умолчанию запросы будут блокироваться.
- Надо разрешить nginx взаимодействовать с сокетом.
- Позволить nginx управлять параметром rlimit_nofile.
- И еще некоторое количество запретов, которые сможете сами проверить.
Суть описываемой дальше настройки 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 сервера:
- Полный бэкап сервера или отдельных сайтов.
- Мониторинг веб сервера и веб сайта с помощью zabbix.
- Защита админки wordpress с помощью fail2ban.
- Если у вас будут проблемы с ботами, то пригодится статья по блокировке доступа к сайту по странам или защита сайта от ddos.
Если еще что-то полезное вспомню, добавлю ссылки. Пока вроде все. Статья получилось большой и насыщенной. Было не просто все собрать воедино, проверить, связать между собой и оформить в последовательное повестование. Мог где-то ошибиться. Жду комментариев и отзывов. Написал все по своему опыту, как я обычно настраиваю веб сервера. Предполагаю что-то можно сделать более удобно и правильно. Буду рад научиться.
Напоминаю, что данная статья является частью единого цикла статьей про сервер Centos.
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.
Вы хоть обновляйте - КОГДА НИБУДЬ половина уже не работает
Возьмите и обновите сами, а тут ссылку оставьте. Странно звучит требование в обновлении на сайте со свободным доступом. Когда посчитаю нужным и найду свободное время, тогда и обновлю. Возможно никогда.
Добрый день!
У вас в статье расписаны поддомены.
А если я хочу сайт без домена сделать?
Я создал папку, конфиг 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.
Хотя для под-домена - всё ок выпустил.
У хостера в настройказ ДНС что у домена что у поддомена указан один и тот же А адрес
Спасибо
Потому что с тех пор все изменилось ! статья с 14.01.2021 сейчас 2023 год
Скрипт безопасной настройки MariaDB изменился на /usr/bin/mariadb-secure-installation
Доброго времени суток!
Возник вот какой вопрос:
"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 адрес не получится. Хотя может и можно как-то, я никогда этого не делал и не проверял.
Добрый день,
если много сайтов есть смысл сделать несколько виртуалок на гипервизоре? памяти и место достаточно? И как лучше защитить их? Или в какую сторону лучше смотреть насчет защиты виртуальных машин. Как можно лучше "за-контейренить" каждый сайт, ну в смысле если один упал и за плохого кода, то остальных это не коснулось. Докер для этого наверное не стоит, как насчет LXC контейнеров, каждый контейнер содержит все что нужно для сайта.
Владимир у вас пару статей на LXC контейнеры в 2018/2019. Они ( LXC контейнеры ) уже не актуальны? Или лучше на proxmox-е делать лучше все контейнеры для каждого сайта?
Спасибо вам!
Так трудно сказать однозначно. Все зависит от различных условий. Каждому сайту по вируталке - идеальный вариант с точки зрения изоляции и безопасности, но понятное дело, что большой расход ресурсов сервера идет, плюс сильно усложняется управление. Для хостинга типовых сайтов на едином стеке технологий (например php+mysql) проще использовать один сервер, обеспечивая безопасность разделением доступа к файлам и запуском служб от разных пользователей. Именно это я и показываю в статье. Все виртуальные хостинги строятся плюс-минус именно так.
Контейнеры - тема скорее для удобства разработки и разворачивания кода, а не эксплуатации.
Добрый день! А если у меня в конфиге /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 добавьте к запуску. Если будут ошибки в конфиге, вы их увидите.
Приветствую , после настройки не запускается ни один домен пишет ошибку , что больше 20 редиректов, подскажите , как исправить
Здравствуйте.
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 С точкой просто писать меньше. Указанную ошибку вообще не понимаю. Ни разу не видел.
# /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
# dnf install certbot
Last metadata expiration check: 0:26:58 ago on Sat 09 Jan 2021 06:02:47 PM EST.
No match for argument: certbot
Error: Unable to find a match: certbot
Он в репозитории epel:
# dnf install epel-release
# dnf install certbot
Вроде всё сделал по вашему мануалу, но SELinux блокирует.
Смотрите лог selinux, каких разрешений не хватает. С помощью audit2allow еще раз сформируйте модуль для selinux и загрузите его.
Здравствуйте, подскажите когда ситуация что на одном внешнем 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/
Спасибо, большое, столько время сэкономил, и не в первый раз
Здравствуйте, Владимир. Подскажите, как мне сертификат получить для поддоменов. Чтобы не для каждого поддомена получать каждый раз сертификат, а один на все поддомены? Просто при получении помимо основного домена указать еще *.domen.ru . Этого достаточно будет?
Нет, не достаточно. Там более длинная процедура. Запускаете, как обычно, выпуск домена, указываете домен *.domen.ru. Вам в выводе предложат добавить в dns запись типа txt, текст будет в консоли. Когда добавите эту запись, будет выпущен wildcard сертификат. Подробнее тут - https://medium.com/@saurabh6790/generate-wildcard-ssl-certificate-using-lets-encrypt-certbot-273e432794d7
Я решил немного изменить директорию для сайтов на var/www (так привычнее для меня).
Но теперь есть открыть домен в браузере вижу ошибку 403 Forbidden
И в логах самого сайта "/var/www/example.ru/public_html/index.html" is forbidden (13: Permission denied)
Я понимаю что нужно настроить какие-то права но пока не совсем понимаю какие именно.
Пользователь, от которого работает веб сервер, обычно nginx, должен иметь доступ, как минимум на чтение, к этой директории.
Тоже столкнулся с такой проблемой : ( установка делается с нуля и точь в чоть как у вас тут с татье)
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
домен указывается правильно
после правок локальных и заливки файлов на сервак , ошибка ....premissive denied ... тк владелец/группа залитых root:root, приходиться постоянно выполнять после заливки команду sudo chown -R nginx:nginx /web
Подскажите что где не правильно настроил ?
Не понял, о какой заливке файлов идет речь? Через sftp?
ну да в шторме, добавляю файлы моделей итп , потом лью их на сервак
Значит льете от учетки root. Логиньтесь учеткой, от которой веб сервер работает для этого сайта, тогда владельцем будет нужный пользователь.
Добрый день.
Опыта особо нет, пытаюсь найти как связать и развернуть на различных вируталках связку серверов 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" мне в ту сторону смотреть?
Да, это то, что вам нужно для решение задачи.
А можно подробней как получить и автоматически продлевать WildCard сертификаты и переадресацию с несуществующего домена 3го уровня на главный домен 2го... конкретней задача единый сертификат на simple.com и http://www.simple.com с авто продлением , а так же переброс с несуществующего домена blablabla.simple.com на главный simple.com
В общем не знаю что за фигня, но у меня сюда: 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
и заработало.
Возможно SELinux блокирует доступ в /web/sites
День добрый, хотел для общего развития попробовать на виртуалку установить nginx, но возникла проблема с ssl сертификатами, подскажите пожалуйста где надо изменить настройки чтоб работало без ssl.
Для этого надо строку:
заменить на:
Вот это вообще убрать:
спасибо!
Добрый день. Спасибо вам за ваш труд !
Владимир, уже настроил сайт по вашей статье nginx+apache
Хотелось бы услышать ваше мнение по поводу, что все-таки лучше или производительнее
связка nginx+apache или nginx+php-fpm для интернет-магазина (opencart)
В инете встречаются еще хитрые связки nginx+php-fpm+apache - можете ли высказать ваше мнение по этому сочетанию ?
Спасибо
Нет достоверных данных. Разница про производительности минимальна и может зависеть от конкретного проекта. Если есть возможность работать на php-fpm, то лучше на нем, так как банально настраивать проще и удобнее. Это как по мне. Php-fpm более легковесный. К тому же в последних версиях apache сам использует php-fpm по дефолту для php. Так что если можно обойтись без apache, лучше убрать лишнее звено. Но если без него никак, я бы не тратил много сил, чтобы вывести его из работы.
Добрый день.
Все установил и настроил согласно вашей статьи.
Но, всё это крутиться на домашнем сервере и проблема в том, что снаружи, из интернета, все прекрасно работает, а из локальной сети нет. Как можно попадать на сайты из локальной сети? типа 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. Настройте все правильно и нормально будут работать сертификаты.
Вот что пишет erorr.log | grep site2.net
Как минимум, у вас прямым текстом написана ошибка:
open() "/web/sites/site2.net/log/access.log" failed (2: No such file or directory)
Такого файла не существует. Где-то ошибка в пути скорее всего. Проверяйте.
Ну и дальше все ошибки прямым текстом описаны. Берите и исправляйте. Они гуглятся хорошо, если что. Вы походу что-то не то с конфигом сделали, так как ошибки практически по всем параметрам.
День добрый, спасибо за статью, очень всё подробно, всё получилось.
Вопрос в другом, когда я создал конфиг для второго сайта, он выдаёт 502 ошибку, я для него тоже стянул ssl, всё так же по инструкции, слушают одни и те же порты. Подскажите как исправить, чтобы оба работали через https я думаю в этом может быть проблема.
Скажите какую информацию вам скинуть, ведь по сути это ваш конфиг, только с разными доменами.
Так ничего особенного для второго сайта делать не надо. По аналогии настраивается второй виртуальный хост и все. Посмотрите лог веб сервера. 502 ошибка не на пустом месте возникает. Там будет написано, в чем конкретно проблема.
А какие именно логи глянуть, подскажите. Потому что, я полностью делал по аналогии.
Общий лог nginx - /var/log/nginx/access.log или error.log. Если для виртуального хоста логи в отдельный файл направляли, смотрите там. Надо просто узнать, почему 502 ошибка.
Спасибо за статью века!
у меня глупый вопросик... ребят ща мы всё установили. а с php-fpm ничего больше не надо делать? имею ввиду чисто написал коды в php и всё сработает? или допольнительно для него надо опять сёрифировать интернет?
заранее спасибо за ответ!
Да, все верно. Если веб сервер уже работает, то больше ничего настраивать не надо. Достаточно писать код на php. Ну и про обновление не забывать. Рано или поздно, надо будет обновления ставить. Лучше сразу приучиться делать это регулярно. Хотя бы раз в месяц.
запускаем 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
===================================
Если делать все как в статье, работать будет.
Either get and install your certificates...
#sudo /usr/local/bin/certbot-auto --nginx
Правильно ли я понял что для запрета индексации можно использовать:
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. Это не означает, что вас не будут индексировать. Будут, просто без учета настроек этого файла. Я считаю, что поисковые системы индексируют все, несмотря на настройки. Им это выгодно, все знать. Надежный способ закрыть сайт от индексации - запаролить его.
Здравствуйте, Владимир. В прошлой установке (на 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) - эти настройки есть в дефолтном конфиге в закомментированном виде, нужно ли их раскомментировать?
Вроде не обязательно, если в статье не указано. Точно не помню, но вроде эти настройки не действуют, если активна другая настройка, которая рядом в конфиге.
Владимир, все я кажется начал разбираться, как переносить сайт на новый домен, нужно под новый домен виртуальные хосты создать и с них сделать редирект со старого конфига nginx. Подскажите мне вот эту запись "return 301 $scheme://new-name.com;" делать только, где порт 443 без WWW И еще вот вы пишете , что в этом конфиге nginx отключен редирект файла robots.txt и что он отдельно отдается по http и https. Я этого не увидел в конфиге, вот про Cento7 вы писали статью там, это было. Спасибо.
Владимир, спасибо Вам за статью. Настраивал по ней - все работает, все круто!
Но так случилось, что мне нужно переехать на новый домен и сделать 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;
}
}
А то боюсь где-нибудь накосячить и новичкам другим будет пример
Подскажите как при данной установке nginx (как я понял мы не собираем из исходников) добавить после установки модуль --add-module=nginx-push-stream-module ?
А дефолтная установка из пакета точно без этого модуля идет? Мне кажется она его включает. Достаточно просто его настройки указать и он будет работать. Если нет, то придется собирать из исходников самому.
При генерации сертификата когда вводу поддомен, система выдает что не привязан email адрес - это нормально? И где тогда его вводить, ведь система ничего ранее не запрашивала.
Снято. не внимательно читаю что пишет ssl
Здравствуйте! у меня вопрос вы указываете вот так
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 конкретно для этих сайтов. И на основе их составлял конфиг.
Здравствуйте.
На днях разобрался с запуском 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 - какую последнюю версию поддерживает магазин, такую и используйте. Не вижу тут причин для раздумий.
Споткнулся на установке 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 корректно.
Поставил все по инструкции все прекрасно шаблоны ставятся сайт на wordpress, но вот переводы хотят ftp
Чтобы осуществить запрошенное действие, WordPress необходим доступ к вашему серверу. Пожалуйста, введите координаты доступа к FTP. Если вы не помните координаты, можно узнать их в службе поддержки вашего хостинг-провайдера.
Как это возможно победить?
Что-то недонастроили. Запрос на ftp выскакивает, если процесс php-fpm не имеет прав на запись в директорию, в которую хочет что-то установить.
Для 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.
Спасибо за статью, все толково написано
Спасибо за статью.
Можно про установку Asterisk на Cent OS 8?
Сомневаюсь, что он сейчас встанет туда. Надо ждать, когда все пакеты и репы подготовят к новой системе. Я пока еще не пробовал.
Вот у меня и не становится. То есть становится, но с ошибками PID. Сколько форумов не перелопатил, везде одно и то же. Буржуйские копируют друг друга, наши русские - те же буржуйские, только на другом языке.
Буду ждать, спасибо. А пока довольствуюсь рабочим вариантом на Debian 10.
сделай статью про nginx настройку нескольких доменов на одном айпи генерацией сертификатов и настройкой уровнем A+ желательно на freebsd
Это все уже сделано в этой статье. 2 домена на одном ip, конфиги и сертификаты tls дают рейтинг А+. В freebsd все будет один в один такое же, так как формат конфига nginx во всех системах одинаковый.
спасибо.. я просто пролистал.. не внимательно... выходные всётаки.. прошу прощения.. сейчас изучу)
настроил как ты рекомендовал... получил рейтинг F+
пересмотри тут https://habr.com/ru/post/252821/
поменял параметры как с на хабре получил A+
в целом очень толково написано...
Ты просто где-то ошибся. Ту статью я знаю давно, брал из нее рекомендации. Но она устарела. В то время еще не было tls 1.3. С моими настройками будет A+. Я кучу серверов настраиваю. В том числе и этот сайт так же настроен. Можешь проверить его рейтинг.
не хватает пункта по настройке push модулей для nginx
Это уже нишевые настройки. Нужны далеко не всем. Про nginx можно много всего писать.
Очень хорошая статья! Спасибо вам!
еще бы на Debian/Ubuntu такое сделать. Спасибо за статью
Возможно будет. Не хватает времени одному поддерживать актуальность статей на нескольких системах, с учетом того, что все они постоянно обновляются.