Установка и настойка web сервера Nginx + Apache + PHP + MySQL на Debian 11 / Ubuntu 20.04

Здравия всем. В данной заметке я собрал большую часть шагов, необходимых для настройки виртуального хостинга, на свеже установленной системе Debian 11 или Ubuntu server 20.04. В процессе работы с web серверами я пришел к выводу, что для php лучше всего подходит Apache в качестве web сервера, но он очень прожорлив на ресурсы сервера. Поэтому я на своих web серверах настраиваю Nginx + Apache. В данной статье я показываю, как настроить Nginx + Apache с PHP и MySQL

Перед началом работы.

Перед установкой я обычно захожу по ssh на сервер. Получаю права root на Ubuntu 20.04

sudo bash

На Debian 11 по умолчанию нет sudo, нужно либо поставить, либо использовать команду

su - 

Потом проверяю и ставлю обновления

apt update
apt upgrade

Во всех своих серверах я пользуюсь mc (Midnight Commander)

и его редактором mcedit

Web сервер Apache в качестве Back-end

Установка web сервера Apache

Теперь можно приступать к установке Apache в системе Debian 11 / Ubuntu lts 20.04

 apt install apache2 apache2-utils

После этого, если файрволл ufw включён, нужно разрешить доступ к 80 и 443 портам.

ufw allow 80
ufw allow 443

Сервис apache2 стартует сразу после установки. Можно проверить через браузер:

http://"ip адрес сервера", в моём случае http://192.168.48.92

Настройка web сервера Apache

Начинаем настройку с портов. Поскольку у нас Apache будет в роле back-end, убираю его с 80 порта, на 8080.

mcedit /etc/apache2/ports.conf

Listen 8080

Сохраняем и перегружаем службу

service apache2 restart

Проверяем поднялся ли Apache на новом порту

# netstat -tulnp | grep apache2
tcp6       0      0 :::8080                 :::*                    LISTEN      764/apache2

Создаем в директории /var/www директорию blank с пустым index.hmtl

cd /var/www
mkdir blank
echo " " >> /var/www/blank/index.html

Заворачиваем в неё все дефольтные web запросы

mcedit /etc/apache2/sites-available/000-default.conf

<VirtualHost *:8080>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/blank

        
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Я предпочитаю следующую структуру web хостинга:

~/www/site1.local

~/log/

директория для содержимого сайта

директория для логов сайта

В директории пользователя надо создать 2 директории www и log, в моём случае это пользователь yuri

cd /home/yuri
mkdir www
mkdir www/test.hserv.su
mkdir log

Создаем виртуальный хостинг для сайта site1.local

mcedit /etc/apache2/sites-available/test.hserv.su.conf

<VirtualHost *:8080>
        ServerAdmin web@localhost
        ServerName test.hserv.su
        ServerAlias www.test.hserv.su
        DocumentRoot /home/yuri/www/test.hserv.su

        ErrorLog /home/yuri/log/test.hserv.su_error.log
        CustomLog /home/yuri/log/test.hserv.su_access.log combined
        
        <Directory />
             Options FollowSymLinks
             AllowOverride All
        </Directory>
        
        <Directory /home/yuri/www/test.hserv.su/>
             Options Indexes FollowSymLinks
             AllowOverride None
             Require all granted
        </Directory>

</VirtualHost>

Включаем сайт в конфигурации

a2ensite test.hserv.su.conf

После этого нужно перегрузить Apache для применения изменений.

service apache2 restart

Если возникли какие-то ошибки — смотрим лог apache error_log.

cat /home/yuri/log/test.hserv.su_error.log

Если все в порядке, то проверим, нормально ли настроен наш виртуальный хост. Для этого создадим в папке /home/yuri/www/test.hserv.su/ файл index.html

mcedit /home/yuri/www/test.hserv.su/index.html

<h1>Welcome to test.hserv.su!</h1>

chown yuri. /home/yuri/www/test.hserv.su/index.html

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

192.168.48.92		test.hserv.su

где 192.168.48.92 IP адрес нашего веб сервера. Это нужно сделать только в том случае, если настраиваете web сервер где-то в локальной сети без реально существующего доменного имени.

Теперь в браузере набираем адрес http://test.hserv.su:8080. Если видим картинку:

значит все правильно настроили. Если какие-то ошибки, то идем смотреть лог ошибок конкретного виртуального хоста

cat /home/yuri/log/test.hserv.su_error.log

Web сервер Nginx в качестве Front-end

Установка web сервера Nginx

Теперь приступим к установке Nginx

apt install nginx

Настройка web сервера Nginx

Теперь приступим к настройке. Создадим конфиги Nginx для этих виртуальных хостов.

mcedit /etc/nginx/sites-available/test.hserv.su.conf

server {
    listen 80;
    server_name test.hserv.su www.test.hserv.su;
    access_log /home/yuri/log/nginx-test-hserv-access.log combined buffer=64k;
    error_log /home/yuri/log/nginx-test-hserv-error.log error;

    location / {
	proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host      $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ {
        root        /home/yuri/www/test.hserv.su;
        access_log  off;
        expires     max;
    }  

    location = /robots.txt {
        root  /home/yuri/www/test.hserv.su;
        allow all;
        log_not_found off;
        access_log off;
    }
}

Применим наш конфиг в доступные сайты

ln -s /etc/nginx/sites-available/test.hserv.su.conf /etc/nginx/sites-enabled/test.hserv.su.conf
service nginx reload

Теперь в браузере набираем адрес http://test.hserv.su. Если видим картинку:

значит все правильно настроили.

Настройка Nginx SSL с помощью Let’s Encrypt

Дальнейшая настройка возможна, только для зарегистрированного домена и правильной настройки DNS.

Устанавливаем пакет certbot для получения бесплатного ssl сертификата от let’s encrypt.

apt install certbot python3-certbot-nginx

Certbot предоставляет широкий выбор способов получения сертификатов SSL с помощью плагинов: Плагин Nginx изменит конфигурацию Nginx и перезагрузит ее, когда это потребуется. Для использования этого плагина введите следующую команду:

certbot --nginx -d test.hserv.su

Первый раз certbot спросит у вас email, на который Let’s Encrypt будет присылать уведомления, когда сертификат будет заканчиваться. Let’s Encrypt предоставляет сертификаты на 90 дней.

Принимаем условия соглашения, решаем подписываться на рекламу или нет. После этого certbot проверит сайт на доступность по 80 порту. После проверки, certbot пропишет в конфигурацию nginx для нашего домена test.hserv.su SSL сертификаты и попытается сделать редирект с 80 порта на 443

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/test.hserv.su/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/test.hserv.su/privkey.pem
   Your certificate will expire on 2022-01-12. To obtain a new or
   tweaked version of this certificate in the future, simply run
   certbot again with the "certonly" option. To non-interactively
   renew *all* of your certificates, run "certbot 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

Пакет certbot выполняет это автоматически, добавляя таймер systemd, который будет запускаться два раза в день и автоматически продлевать все сертификаты, истекающиее менее, чем через 30 дней.

Запросить статус таймера с помощью команды systemctl:

systemctl status certbot.timer

● certbot.timer - Run certbot twice daily
     Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Thu 2021-10-14 16:18:32 MSK; 14min ago
    Trigger: Fri 2021-10-15 04:35:52 MSK; 12h left
   Triggers: ● certbot.service

Если ошибок нет, все нормально. Certbot будет продлевать ваши сертификаты, когда это потребуется, и перезагружать Nginx для активации изменений. Если процесс автоматического обновления когда-нибудь не выполнится, то Let’s Encrypt отправит сообщение на указанный вами адрес электронной почты с предупреждением о том, что срок действия сертификата подходит к концу.

Установка PHP

В базовом репозитории как Debian 11, так и Ubuntu 20.04 хранится актуальная версия php 7.4. Если у вас нет необходимости использовать что-то новее или старее, то можно остановиться на этой версии.

Устанавливаем php в Debian 11 или Ubuntu 20.04 , а так же некоторые популярные модули, которые могут пригодиться для того же phpmyadmin.

apt install php php-cli php-mysql php-json php-gd php-ldap php-odbc php-common php-opcache php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap php-zip

Выполним перезапуск Apache:

service apache2 restart

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

mcedit /home/yuri/www/test.hserv.su/index.php

<?php phpinfo(); ?>

chown yuri. /home/yuri/www/test.hserv.su/index.php

Заходим по адресу http://test.hserv.su/index.php

Вы должны увидеть вывод информации о php. Если что-то не так, возникли какие-то ошибки, смотрите лог ошибок виртуального хоста, php ошибки будут тоже там.

Где лежит php.ini

После установки часто возникает вопрос, а где хранятся настройки php? В Debian системах уже относительно давно, файл php.ini разделили. Для Apache он расположен в папке /etc/php/7.4/apache2/, для cli он расположен в папке /etc/php/7.4/cli/. Там можно редактировать глобальные настройки для всех виртуальных хостов. Персональные настройки каждого сайта можно сделать отдельно в файле конфигурации виртуального хоста, который мы сделали раньше. Давайте добавим туда несколько полезных настроек:

mcedit /etc/apache2/sites-available/test.hserv.su.conf

Добавляем в самый конец, перед </VirtualHost>


php_admin_value date.timezone 'Europe/Moscow'
php_admin_value max_execution_time 120
php_admin_value max_input_time 120
php_admin_value post_max_size 200M
php_admin_value upload_max_filesize 50M
php_admin_value max_file_uploads 150

Для применения настроек нужно сделать перегрузить Apache.

service apache2 restart

Установка MySQL

Сейчас все большее распространение получает форк MySQL — MariaDB. Она имеет полную совместимость с MySQL. В последнее время, я предпочитаю использовать именно ее.

Устанавливаем mariadb в Debian 11 или Ubuntu 20.04

apt install mariadb-server

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

mysql_secure_installation

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

Файлы настроек mysql/mariadb в Debian лежат в директории /etc/mysql/. Для обычной работы достаточно настроек по-умолчанию. Но если вы решите изменить их, не забудьте перезапустить службу баз данных.

service mariadb restart

Установка phpmyadmin

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

mkdir /home/yuri/www/test.hserv.su/pma

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

cd ~
wget https://files.phpmyadmin.net/phpMyAdmin/5.1.1/phpMyAdmin-5.1.1-all-languages.tar.gz

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

tar xvzf phpMyAdmin-5.1.1-all-languages.tar.gz
cp -R phpMyAdmin-5.1.1-all-languages/* /home/yuri/www/test.hserv.su/pma/
chown -R yuri. /home/yuri/www/test.hserv.su/pma/

Настройка phpmyadmin

Phpmyadmin готов к работе сразу после установки, дополнительные настройки не обазательны. Закрываем доступ к панели средствами Web сервера. Для использования панели необходимо будет не только знать имя учетной записи mysql, но и пользователя и пароль для доступа непосредственно к панели.

Будем использовать стандартное средство для ограничения доступа к каталогу с помощью .htaccees. Создадим такой файл в папке со скриптами phpmyadmin:

mcedit /home/yuri/www/test.hserv.su/pma/.htaccess

AuthName "Enter Password"
AuthType Basic
Require valid-user
AuthUserFile "/home/yuri/www/test.hserv.su/pma/.htpasswd"

Теперь создадим файл с авторизационными данными:

htpasswd -bc /home/yuri/www/test.hserv.su/pma/.htpasswd user password

Где user — имя пользователя, а password пароль.

Чтобы авторизация заработала, необходимо в файле конфигурации виртуального хостинга в разделе Directory добавить параметр AllowOverride перед </VirtualHost>

 mcedit /etc/apache2/sites-available/test.hserv.su.conf

<Directory /home/yuri/www/test.hserv.su/pma/>
  AddDefaultCharset UTF-8
  Require all granted
  AllowOverride All
</Directory>

Перезапускаем Apache.

service apache2 restart

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

Дополнительная настройка web сервера

После установки и настройки необходимо сделать тонкую настройку.

Настройка времени ожидания Nginx

Когда Nginx работает перед Apache, он передает запрос в Apache и ждет по умолчанию 60 секунд, если за это время не пришел ответ от Apache, то Nginx выдаст ошибку 502. Чтобы этого не происходило рекомендую поднять таймоуты до 120 секунд. В секцию location после proxy_pass вставить:

mcedit /etc/nginx/sites-available/test.hserv.su.conf

location / {
	proxy_pass http://127.0.0.1:8080;
        
        proxy_read_timeout    120;
        proxy_connect_timeout 120;
        proxy_send_timeout    120;
}

Перегружаем Nginx для применения настроек

service nginx restart

К примеру, для виртуального хостинга популярного CMS движка WordPress, я ставлю 180 секунд, потому что во время обновления плагинов или самого движка WordPress Apache может очень долго не отвечать


proxy_connect_timeout 180;
proxy_send_timeout    180;
proxy_read_timeout    180;

Передача реального IP клиента в Apache

Когда Nginx работает перед Apache, то в логах Apache, в скриптах будет присутсвовать IP локального 127.0.0.1, что не несет никаких сведений о том, какой пользователь был на сайте. Перестают работать все сервисы, привязанные к IP пользователю на сайтах.

Чтобы убедиться в этом создадим файл ip.php

 mcedit /home/yuri/www/test.hserv.su/ip.php

<?php
echo $_SERVER['REMOTE_ADDR']
?>

После этого переходим по адресу http://test.hserv.su/ip.php и видим:

Конфигурирование Nginx

Чтобы это исправить идем в секцию location конфигурации Nginx после proxy_pass добавим:

mcedit /etc/nginx/sites-available/test.hserv.su.conf

location / {
	proxy_pass http://127.0.0.1:8080;
        
        proxy_read_timeout    120;
        proxy_connect_timeout 120;
        proxy_send_timeout    120;
        
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
}

Перегружаем Nginx для применения настроек

service nginx restart

Конфигурирование Apache

Для того, чтобы Apache начал правильно воспринимать и обрабатывать реальный IP пользователя, воспользуемся идущим в стандартном пакете Apache модулем remoteip.

Вначале настроим работу модуля remoteip. Для этого создадим файл remoteip.conf:

mcedit /etc/apache2/conf-available/remoteip.conf

RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 127.0.0.1
RemoteIPTrustedProxy 127.0.0.1

Теперь всё это нужно подключить модуль remoteip и перегружаем Apache:

a2enmod remoteip
a2enconf remoteip
service apache2 restart

Если все правильно увидим, свой IP адрес. Если вы настраиваете в локальной сети, то там будет ваш локальный IP как у меня на картинке:

SSL между Nginx и Apache

Некоторым скриптам необходимо знать через какую схему они работают, http, или https. Таким образом они формируют ссылки, а иногда принудительно перенаправляют клиентов куда нужно. Из-за не правильной настройки серверного ПО переадресация не может завершиться и браузер покажет нам ошибку ‘too many redirects‘.К примеру, это относится к популярному CMS движку WordPress.

Конфигурирование Nginx

Чтобы это исправить идем в секцию location конфигурации Nginx после proxy_pass добавим:

mcedit /etc/nginx/sites-available/test.hserv.su.conf

location / {
	proxy_pass http://127.0.0.1:8080;
        
        proxy_read_timeout    120;
        proxy_connect_timeout 120;
        proxy_send_timeout    120;
        
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
}

Перегружаем Nginx для применения настроек

service nginx restart

Конфигурирование Apache

Нам необходми модуль setenvif_module, который подключен стандартной установке Apache.

Добавляем в конфигурацию виртуального хостинга перед секцией </VirtualHost>

mcedit /etc/apache2/sites-available/test.hserv.su.conf

<IfModule setenvif_module>
  SetEnvIf X-Forwarded-Proto https HTTPS=on
</IfModule>

Перегружаем Apache для применения настроек

service apache2 restart

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

Если вы планируется передавать доступ к сайту другим людям, например для доступа к исходникам сайта, то на текущий момент лучше это делать по протоколу sftp.

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

mcedit /etc/ssh/sshd_config

#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
Match User yuri
ChrootDirectory /home/yuri
ForceCommand internal-sftp

Сохраняем и перезапускаем ssh.

service ssh restart

Настройка подключения sftp с ограничением доступа за пределами конкретной папки закончена.

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

Чтобы к файлам, загруженным через сайт, был доступ через ftp, можно запускать Apache от имени пользователя. Для этого используем модуль Apache mpm_itk. Поставим его.

apt install libapache2-mpm-itk

Добавляем в конфигурацию виртуального хостинга перед секцией </VirtualHost>

mcedit /etc/apache2/sites-available/test.hserv.su.conf

<IfModule mpm_itk_module>
	AssignUserId yuri www-data
</IfModule>

Где yuri это имя пользователя, а www-data это группа, под которым будет запускаться Apache

Перегружаем Apache для применения настроек

service apache2 restart

Ротация логов виртуальных хостов

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

Создадим файл конфигурации logrotate для нашего виртуального хостинга

mcedit /etc/logrotate.d/hosting

/home/yuri/log/*log {
        size=2M
        missingok
        rotate 10
        compress
        delaycompress
        notifempty
        create 0640 yuri www-data
        sharedscripts
        postrotate
                /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
        endscript
}

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

Заключение

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

Apache


<VirtualHost *:8080>
        ServerAdmin web@test.hserv.su
        ServerName test.hserv.su
        ServerAlias www.test.hserv.su
        DocumentRoot /home/yuri/www/test.hserv.su

        SetEnvIf X-Forwarded-Proto https HTTPS=on

        ErrorLog /home/yuri/log/test.hserv.su_error.log
        CustomLog /home/yuri/log/test.hserv.su_access.log combined

        <Directory />
             Options FollowSymLinks
             AllowOverride All
        </Directory>

        <Directory /home/yuri/www/test.hserv.su/>
             Options Indexes FollowSymLinks
             AllowOverride None
             Require all granted
        </Directory>

        <Directory /home/yuri/www/test.hserv.su/pma/>
            AddDefaultCharset UTF-8
            Require all granted
            AllowOverride All
        </Directory>

        #Запуск Apache под пользователем
        <IfModule mpm_itk_module>
             AssignUserId yuri www-data
        </IfModule>

        php_admin_value date.timezone 'Europe/Moscow'
        php_admin_value max_execution_time 300
        php_admin_value max_input_time 180
        php_admin_value post_max_size 200M
        php_admin_value upload_max_filesize 50M
        php_admin_value max_file_uploads 150

</VirtualHost>

Nginx


server {
    server_name test.hserv.su www.test.hserv.su;
    access_log /home/yuri/log/nginx-test-hserv-access.log combined buffer=64k;
    error_log /home/yuri/log/nginx-test-hserv-error.log error;


    

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_connect_timeout 120;
        proxy_send_timeout 120;
        proxy_read_timeout 180;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;

    }

    location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ {
        root        /home/yuri/www/test.hserv.su;
        access_log  off;
        expires     max;
    }

    location = /robots.txt {
        root  /home/yuri/www/test.hserv.su;
        allow all;
        log_not_found off;
        access_log off;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/test.hserv.su/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/test.hserv.su/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
    
    
}
server {
    if ($host = test.hserv.su) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    server_name test.hserv.su www.test.hserv.su;
    return 404; # managed by Certbot


}

47 ответов к «Установка и настойка web сервера Nginx + Apache + PHP + MySQL на Debian 11 / Ubuntu 20.04»

  1. Спасибо за ваш труд.
    Последние пример полного конфига nginx для фронта сайта/
    proxy_set_header Host $host; #Одиножды
    proxy_connect_timeout 120;
    proxy_send_timeout 120;
    proxy_read_timeout 180;
    proxy_set_header Host $host; #Дважды, с этой ошибкой, сайт работать не будет
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;

    Такую ошибку будет сложно найти, а «nginx -t» скажет что все хорошо.
    Еще столкнулся с ситуацией если делать доступ к файлам сайтов для других по sftp, то после этой модификации, зайти под учеткой yuri по ssh будет невозможно, разве что переключиться на нее после входа с помощью команды «su — yuri»

    1. Спасибо большое, исправил ошибку. Действительно проглядел, когда составлял итоговый конфиг.

      По поводу sftp согласен, надо было в примере другое имя пользователя поставить.

      1. И еще один момент, вы уверены что certbot умеет делать сертификаты для локальных доменов?

        1. В где в статье я писал про локальные домены? certbot смотрит в свой DNS и ищит там записи для указанного домена, и только после этого проходит проверку.

          1. # тут
            «где 192.168.48.92 IP адрес нашего веб сервера. Это нужно сделать только в том случае, если настраиваете web сервер где-то в локальной сети без реально существующего доменного имени.»

            # А про локальный https. (не сказать что красиво работает, так — костыль)
            Простейший способ сгенерировать закрытый ключ и самоподписанный сертификат для localhost — выполнить следующую команду из пакета openssl:
            openssl req -x509 -out localhost.crt -keyout localhost.key \
            -newkey rsa:2048 -nodes -sha256 \
            -subj ‘/CN=localhost’ -extensions EXT -config <( \
            printf "[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")

            Вы можете сконфигурировать локальный web-сервер, используя файлы localhost.crt и localhost.key, добавив localhost.crt в список доверенных корневых сертификатов.

  2. Спасибо за Ваш труд, статья отличная, делал все по шагам и все получилось. Можно ли какую нибудь статью на тему панели управления типо directadmin.

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

    SetEnvIf X-Forwarded-Proto https HTTPS=on

    1. Данная опция говорит apache, что внешний прокси работает по протоколу HTTPS. Спасибо за наводку, сейчас исправлю конечный конфиг

  4. Здравствуйте. Спасибо за статью, очень подробно все изложено.
    У меня не получился пункт SSL между Nginx и Apache
    В nginx прописал proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
    В апач SetEnvIf X-Forwarded-Proto https HTTPS=on
    не работает
    Если в nginx прописать просто строку
    proxy_set_header X-Forwarded-Proto https;
    Тогда все работает, в чем может быть проблема?

    1. Здравствуйте. Проверил сейчас, действительно слетает.
      Вот рабочая строчка:
      вместо proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
      нужно proxy_set_header X-Forwarded-Proto $scheme;

      Спасибо за помощь!

  5. Полгода назад делал по этому мануалу, всё взлетело. Сейчас понадобилось развернуть Web-сервер, не получается. Третий раз переделываю. После установки nginx, создания конфига хоста, добавление ссылки и рестарта nginx’а, при переходи по доменному имени без порта, отправляет в blank.

    На компе, откуда захожу в файле hosts прописан адрес имя. Что не так…? Может какие-то дефолтные настройки в апаче или энджинксе поменялись…?

    1. Доброго дня!
      В настройках nginx небольшая ошибка. Исправил в мануале. Чтобы вам не искать, добавьте 2 строки в конфигурацию nginx
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;

      Чтобы было вот так:

      location / {
      	proxy_pass http://127.0.0.1:8080;
              proxy_set_header Host      $host;
              proxy_set_header X-Real-IP $remote_addr;
          }

      Если этих строк не будет, то nginx не будет передавать имя хоста и apache будет показывать пустой бланк.

  6. Странно, всё сделал по инструкции, выбивает ошибка 403 Forbidden. Может кто подскажет в чём может быть проблема

    1. Добрый день, Роман
      Попробуйте добавить в /etc/apache2/apache2.conf следующие строки:

      и перезагрузить apache
      service apache2 reload

  7. Добрый день
    настроил всё по инструкции апатч с указанием своих естественно данных
    захожу по домену у меня открывается страница заглушки а не сайта
    что мог сделать не так?
    Если я правильно понял то любой левый запрос заглушка а если правильный запрос то сайт
    у меня любой запрос это заглушка

    1. Нашел свою ошибку. Всё исправил и теперь работает.

      Спасибо за статью

  8. Подскажите как запустить несколько php 5.6 и 7.4 чтобы на одном сервере работало но естественно каждая версия php на свой хост настроена была

    1. Добрый день!
      Для запуска нескольких версий php на одном сервере, нужно запускать php как различные модули, те к примеру поставить основную версию как в статье, а другую как php-fpm

  9. Делаю всё по ваше гайду но постоянно получаю ошибку
    Запрещенный
    У вас нет разрешения на доступ к этому ресурсу. Сервер не может прочитать файл htaccess, отказывает в доступе в целях безопасности.

      1. 1 этап установка apach скажу правду я новичок в этом деле пытаюсь разобраться уже 4 часа но не выходит
        Distributor ID: Ubuntu
        Description: Ubuntu 22.04.2 LTS
        Release: 22.04
        Codename: jammy

          1. Да, первым делом выполняю sudo bash.
            Далее выполняю все команды с точностью как описанно в мануале.
            Переустановил убунту чтобы наверняка знать что я ничего не оставил после удаления апача.
            В последний раз я ничего не изменял в коммндах, за исключением yuri на имя моего каталога\логина.

          2. Все я понял где ошибка. Я забыл указать, что для каталогов www и logs нужна поменять группу по умолчанию, чтобы apache имел к ним доступ. Попробуйте команду chown :www-data /home/ВАШЛОГИН/www
            Надо обновить статью и исправить ошибку.

  10. Попробовал, результата не принесло.
    Завтра попробую по новой, жду вашего обновленного мануала с нетерпением !

    1. root@server:/var/www разместил всё тут, ошибка 403 исчезла и появилась заветная надпись Welcome to test.hserv.su!

      А при размещении в домашнем каталоге 403 Отказано в доступе, chown :www-data /home/ВАШЛОГИН/www — успехов не принесла. вероятно где то не правильно указываю права доступа.

      1. Это здорово, что смогли! Мои предположения, про доступ верны. Надо попробовать на текущей версии Ubuntu 22.04 поднять по мануалу и исправить ошибки.

  11. У меня вопросы возникли :))
    Ставим сайт на apache2, а потом через nginx проксируем 80 на 8080, разделяя нагрузку, я правильно догадался ?
    И такой вот ещё вопрос раз всё можно делать через конфиг nginx то можно выкинуть .htaccess из домена\папки апача ?
    Но вот к примеру я ставлю phpmyadmin через обычную установку, не по вашему гайду, и мне нужен доступ к примеру таким образом http://mysite.org/phpmyadmin т.е достаточно указать в конфиге ngnix mysite.conf строку include snippets/phpmyadmin.conf будет ли это верным ?

    1. Да nginx ставят для уменьшения нагрузки на сервер, а также чтобы через него отдавать статику.
      Проксирую nginx именно apache, по скольку apache имеет множество функций, которые используют программисты.
      Если все делать через nginx, и убрать apache, то нужно php заводить через php-pfm, иначе phpmyadmin работать не будет.

  12. Здравствуйте. Благодаря вашей инструкции впервые настроил сервер на Ubuntu 20 + apache + nginx + php 8.1 для работы сайта на Joomla 4. Развернул сайт, зашёл в админку, всё нормально работает, но при попытке открыть главную страницу сайта или любую другую постоянно отображается ошибка nginx 502 Bad Gateway. страницы типа info.php и ip.php тоже работали, как и админка, но фронт сайта не открывается. В чём может быть проблема?
    В логах nginx:
    2023/04/25 16:01:36 [error] 675427#675427: *946 upstream prematurely closed connection while reading response header from upstream, client: 10.250.124.5, server: test.site.ru, request: «GET / HTTP/1.1», upstream: «http://127.0.0.1:8080/», host: «test.site.ru»

    1. Здравствуйте Алексей! Такое ощущение, что Apache падает по ошибке. Посмотрите в логах Apache, что пишет.

      1. В логах apache пусто. apache -t выдает:
        [core:warn] [pid 731238] AH00111: Config variable ${APACHE_RUN_DIR} is not defined
        apache2: Syntax error on line 80 of /etc/apache2/apache2.conf: DefaultRuntimeDir must be a valid directory, absolute or relative to ServerRoot

        1. в логах для сайта пусто. в общих логах apache после попытки открыть страницу появляется строка:
          [core:notice] [pid 731824] AH00051: child pid 731832 exit signal Segmentation fault (11), possible coredump in /etc/apache2

          1. Может не хватает ему памяти. Проверьте в php.ini memory_limit

          2. memory_limit 128M. увеличил через конфиг апача до 2048M. не помогло

          3. в интернете вроде бы пишут, что эта проблема встречается при использовании php8.1, но какогото решения найти не могу пока

          4. Про php 8.1 я думал. Может поставить другую версию php и пробовать на ней?

          5. я сначала вообще 8.2 установил, потом на 8.1 сменил, но ниже не хочу, так как всё равно придётся обновляться до неё. раз так не работает, то буду пробовать другие варианты настройки, если не найду какогото решения сейчас

  13. Спасибо большое за статью! Долго не мог настроить корректное перенаправление с nginx https на локальный apache http. Часть ссылок WordPress упорно хотела открываться по http, хотя должна была по https. Помогла вот эта строка в конфиге apache: «SetEnvIf X-Forwarded-Proto https HTTPS=on».

    1. Это очень хорошо, когда все получается! Поздравляю! Рад, что помогла моя статья!

  14. Добрый день.
    Я только начинаю изучать эти системы…Делаю всё как написано, но:
    1. Ругается на этой строчке: chown username. /home/yuri/www/test.hserv.su/index.html
    chown: warning: ‘.’ should be ‘:’: ‘username.’
    После этого: http://ip-adr:8080 (и 80) — Forbidden
    You don’t have permission to access this resource.Server unable to read htaccess file, denying access to be safe
    По имени сайта (host изменил) — вообще не открывается

    Что не так делаю?

  15. Статья хорошая, но затык у меня на шаге
    192.168.48.92 test.hserv.su
    Делаю на реальном сервере Debian, сайт не хочет показываться, не по ip, не по имени. Если вводить ip, показывается страница апача. Наверно на реальном сервере немного по другому

  16. Добрый день! Я новичок в этом деле. Дошел до пункта:
    cd /var/www
    mkdir blank
    echo » » >> /var/www/blank/index.html
    Заворачиваем в неё все дефольтные web запросы

    Что значит дефолтные web запросы? Подскажите, пожалуйста, что надо внести в этот файл?

  17. Здравствуйте. Спасибо за инструкцию. Настроил по ней сервер на Debian 11. Развернул сайт на Joomla, добавил файл .htaccess, включил в настройках сайта SEF и перенаправление URL. Но на сайте открывается только главная страница, остальные выдают ошибку «Not Found. The requested URL was not found on this server. Apache/2.4.56 (Debian) Server at site.ru Port 80». В чем может быть проблема?

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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.