Новости:

SMF - Just Installed!

Главное меню

Последние сообщения

#91
Web servers / От: NGINX + Apache + MariaDB (...
Последний ответ от George - Окт. 05, 2022, 12:47
2. Создание базы данных

Создаем базу данных для сайта командами:
Код: bash
mysql -uroot -p

Код: sql
 CREATE DATABASE site1 DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8mb4_general_ci;

Код: sql
 GRANT ALL PRIVILEGES ON site1.* TO dbuser@localhost IDENTIFIED BY 'password' WITH GRANT OPTION;

Код: sql
 quit

* данными sql-командами мы создаем базу данных site1 и предоставляем к ней доступ для учетной записи dbuser с паролем password. При желании сделать соединение более безопасным, можно убрать WITH GRANT OPTION.
#92
Web servers / От: NGINX + Apache + MariaDB (...
Последний ответ от George - Окт. 05, 2022, 12:28
Создание первого сайта

Настало время проверить наш сервер на реальном примере. Задаем переменную, значение которой будет домен сайта:
Код: bash
TMP_SITE=site1.local

* где site1.local заменить на имя домена, для которого создаем первый сайт. Нам будет намного удобнее копировать и вставлять команды с переменной (не придется править после копипасты).
1. Добавление виртуального домена

Создаем новый файл виртуального домена NGINX:
Код: bash
nano /etc/nginx/sites-enabled/$TMP_SITE.conf

* обязательно на конце должен быть .conf, так как только такие файлы веб-сервер подгружает в конфигурацию.

И добавляем следующее содержимое.

Для HTTP:

Код: apacheconf
server {
    listen      80;
    server_name  site1.local www.site1.local;
    set $root_path /var/www/site1.local/www;

    access_log /var/www/site1.local/log/nginx/access_log;
    error_log /var/www/site1.local/log/nginx/error_log;
    
    gzip  on;
    gzip_disable "msie6";
    gzip_min_length 1000;
    gzip_vary on;
    gzip_proxied    expired no-cache no-store private auth;
    gzip_types      text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;

    root  $root_path;
    index  index.php index.html index.htm;

    location / {
        proxy_pass http://127.0.0.1:8080/;
        proxy_redirect    off;
        proxy_set_header  Host            $host;
        proxy_set_header  X-Forwarded-Proto $scheme;
        proxy_set_header  X-Real-IP        $remote_addr;
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
    
    location ~* ^.+\.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|docx|xls|xlsx|exe|pdf|ppt|tar|wav|bmp|rtf|js)$ {
            expires modified +1w;
    }
}

* где site1.local — домен, для которого создается виртуальный домен; /var/www/site1 — каталог, в котором будет размещаться сайт.
** все запросы будут переводиться на локальный сервер, порт 8080, на котором работает apache, кроме обращений к статическим файла (jpg, png, css и так далее).
*** обратите внимание на выделения полужирным — здесь нужно подставить свои данные.


Для HTTPS:
Код: apacheconf
server {
    listen 80;
    server_name site1.local www.site1.local;
    return 301 https://$host$request_uri;
}

server {
    listen       443 ssl;
    ssl on;
    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/cert.key;

    server_name  site1.local www.site1.local;
    set $root_path /var/www/site1.local/www;

    access_log /var/www/site1.local/log/nginx/access_log;
    error_log /var/www/site1.local/log/nginx/error_log;
    
    gzip  on;
    gzip_disable "msie6";
    gzip_min_length 1000;
    gzip_vary on;
    gzip_proxied    expired no-cache no-store private auth;
    gzip_types      text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;

    root   $root_path;
    index  index.php index.html index.htm;

    location / {
        proxy_pass http://127.0.0.1:8080/;
        proxy_redirect     off;
        proxy_set_header   Host             $host:$server_port;
        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
    
    location ~* ^.+\.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|docx|xls|xlsx|exe|pdf|ppt|tar|wav|bmp|rtf|js)$ {
            expires modified +1w;
    }
}

* в первой секции server мы перенаправляем все запросы по незащищенному http на https.
** ssl_certificate и ssl_certificate_key — пути к публичному и приватному ключам соответственно.
*** для получения бесплатного сертификата читайте статью Получение бесплатного SSL сертификата Let's Encrypt.


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

Код: bash
nano /etc/apache2/sites-enabled/$TMP_SITE.conf
Код: php
<VirtualHost *:8080>
    Define root_domain site1.local
    Define root_path /var/www/site1.local

    ServerName ${root_domain}
    ServerAlias www.${root_domain}
    DocumentRoot ${root_path}/www

    ErrorLog     ${root_path}/log/apache/error_log
    TransferLog  ${root_path}/log/apache/access_log

    php_admin_value upload_tmp_dir ${root_path}/tmp
    php_admin_value doc_root ${root_path}
    php_admin_value open_basedir    ${root_path}:/usr/local/share/smarty:/usr/local/share/pear
    php_admin_value session.save_path 0;0660;${root_path}/tmp
</VirtualHost>

Создаем каталоги для сайта:
Код: bash
mkdir -p /var/www/$TMP_SITE/{www,tmp}

Код: bash
mkdir -p /var/www/$TMP_SITE/log/{nginx,apache}

Создаем индексный файл со следующим содержимым:

Код: bash
nano /var/www/$TMP_SITE/www/index.php

Код: bash
<?php echo "<h1>Hello from site1</h1>"; ?>

Задаем права на папки:

Код: bash
chown -R www-data:www-data /var/www/$TMP_SITE

Код: bash
chmod -R 775 /var/www/$TMP_SITE

Проверяем корректность настроек конфигурационных файлов:

Код: bash
nginx -t

Код: bash
apachectl configtest

Перезапускаем веб-сервер:

Код: bash
systemctl reload nginx
Код: bash
systemctl reload apache2
Открываем сайт в браузере по нашему домену site1.local (он должен быть прописан в DNS или можно его задать в локальном файле hosts того компьютера, с которого мы открываем сайт в браузере). Мы должны увидит фразу «Hello from site1».
#93
Web servers / От: NGINX + Apache + MariaDB (...
Последний ответ от George - Окт. 05, 2022, 12:16
Тюнинг веб-сервера

PHP

Внесем небольшие изменения в нашу конфигурацию PHP:

    post_max_size — максимальный объем отправляемых на сервер данных;
    upload_max_filesize — максимально допустимый размер одного загружаемого файла;
    short_open_tag — разрешение использования короткого способа открытия php (<?);
    date.timezone — временная зона, которая будет использоваться веб-сервером, если ее не переопределить настройками в коде php или в файле .htaccess.

Данные изменения вносятся в разные файлы в зависимости от версии PHP и обработчике. Например, для php версии 7.4 и Apache мы открываем на редактирование следующий файл:
Код: bash
nano /etc/php/8.1/apache2/php.ini

И правим следующее:
Код: vim
post_max_size = 1G
...
upload_max_filesize = 512M
...
short_open_tag = On
...
date.timezone = "Europe/Moscow"

Но мы упростим задачу. Для начала, создадим две переменные:

Код: bash
PHP_VER=8.1
Код: bash
INT=apache2

Теперь мы можем упростить настройку для Apache:

Код: bash
sed -e "s/post_max_size = 8M/post_max_size = 1G/" -i /etc/php/$PHP_VER/$INT/php.ini

Код: bash
sed -e "s/upload_max_filesize = 2M/upload_max_filesize = 512M/" -i /etc/php/$PHP_VER/$INT/php.ini

Код: bash
sed -e "s/short_open_tag = Off/short_open_tag = On/" -i /etc/php/$PHP_VER/$INT/php.ini

Код: bash
sed -e "s/;date.timezone =/date.timezone ='Europe\/Moscow'/" -i /etc/php/$PHP_VER/$INT/php.ini

Посмотреть результат можно командой:

Код: bash
cat /etc/php/$PHP_VER/$INT/php.ini | grep -e "^post_max_size\|^upload_max_filesize\|^short_open_tag\|^date.timezone"
Теперь меняем интерпретатор:

Код: bash
INT=fpm

И повторяем:

Код: bash
sed -e "s/post_max_size = 8M/post_max_size = 1G/" -i /etc/php/$PHP_VER/$INT/php.ini

Код: bash
sed -e "s/upload_max_filesize = 2M/upload_max_filesize = 512M/" -i /etc/php/$PHP_VER/$INT/php.ini
Код: bash
sed -e "s/short_open_tag = Off/short_open_tag = On/" -i /etc/php/$PHP_VER/$INT/php.ini

Код: bash
sed -e "s/;date.timezone =/date.timezone ='Europe\/Moscow'/" -i /etc/php/$PHP_VER/$INT/php.ini

Проверяем:

Код: bash
cat /etc/php/$PHP_VER/$INT/php.ini | grep -e "^post_max_size\|^upload_max_filesize\|^short_open_tag\|^date.timezone"

Перезапускаем php-fpm и apache:

Код: bash
systemctl restart php8.1-fpm

Код: bash
systemctl restart apache2


NGINX

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

Код: bash
nano /etc/nginx/nginx.conf

И внутри секции http добавляем:

Код: vim
client_max_body_size 512M;

После перезапускаем nginx:
Код: bash
systemctl reload nginx
#94
Web servers / От: NGINX + Apache + MariaDB (...
Последний ответ от George - Окт. 05, 2022, 12:03
Postfix


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

Устанавливаем пакет postfix:

Код: bash
apt install postfix -y

Вносим некоторые изменения в настройки:

Код: bash
nano /etc/postfix/main.cf

Код: vim
myorigin = $mydomain
smtp_generic_maps = hash:/etc/postfix/generic_map

* mydomain — домен сервера; myorigin — имя домена, которое будет подставляться всем отправляемым сообщениям без явного указания оного; smtp_generic_maps указывает на карту с общими правилами пересылки.

Открываем карту пересылки:

Код: bash
nano /etc/postfix/generic_map

И добавляем:
Код: bash
@example.org    no-reply@example.org

* данной настройкой мы будем подставлять всем отправляемым письмам без поля FROM адрес no-reply@dmosk.local.

Создаем карту:

Код: bash
postmap /etc/postfix/generic_map

Включаем автозапуск почтового сервера и перезапускаем его службу:

Код: bash
systemctl enable postfix

Код: bash
systemctl restart postfix
Корректная отправка

Для того, чтобы сервер мог отправлять сообщения на внешние ящики, необходимо корректно настроить в DNS, как минимум, записи A и PTR.

Для добавления А-записи, необходимо в настройках панели управления нашим доменом создать запись типа. Ее имя и IP-адрес должны соответствовать имени и адресу нашего сервера.

Для создания PTR-записи необходимо написать письмо Интернет-провайдеру, к которому подключен наш сервер. Если наш сервер арендуется у хостинговой компании, необходимо либо написать данное письмо данной хостинговой компании, либо данная возможность может быть предоставлена в панели управления хостинговыми услугами.
#95
Web servers / От: NGINX + Apache + MariaDB (...
Последний ответ от George - Окт. 04, 2022, 11:55
Apache Real IP


Запросы на apache приходят от NGINX, и они воспринимаются первым как от IP-адреса 127.0.0.1. На практике, это может привести к проблемам, так как некоторым сайтам необходимы реальные адреса посетителей. Для решения проблемы будем использовать модуль remoteip.

Создаем конфигурационный файл со следующим содержимым:

Код: bash
nano /etc/apache2/mods-available/remoteip.conf
Код: vim
<IfModule remoteip_module>
  RemoteIPHeader X-Forwarded-For
  RemoteIPTrustedProxy 127.0.0.1/8
</IfModule>

Активируем модуль:

Код: bash
a2enmod remoteip

Перезапускаем apache:

Код: bash
systemctl restart apache2

Для проверки настройки открываем браузер и вводим в адресную строку http://<IP-адрес сервера>, где откроется наша страница phpinfo. В разделе Apache Environment мы должны увидеть внешний адрес компьютера, с которого обращаемся к серверу в опции REMOTE_ADDR.
#96
Web servers / От: NGINX + Apache + MariaDB (...
Последний ответ от George - Окт. 04, 2022, 11:50
NGINX + Apache

Ранее мы настроили связку nginx + php-fpm. Теперь настроим nginx + apache. Открываем конфигурационный файл nginx для сайта по умолчанию:

Код: bash
nano /etc/nginx/sites-enabled/default

Находим наш настроенный location для php-fpm:

...
Код: apacheconf
        location ~ \.php$ {
            set $root_path /var/www/html;
            fastcgi_pass unix:/run/php/php7.4-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name;
            include fastcgi_params;
            fastcgi_param DOCUMENT_ROOT $root_path;
        }
...

и меняем на:

...
Код: apacheconf
        location ~ \.php$ {
            proxy_pass http://127.0.0.1:8080;
            proxy_redirect     off;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Forwarded-Proto $scheme;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }
...

Проверяем и перезапускаем nginx:

Код: bash
nginx -t

Код: bash
systemctl reload nginx

Пробуем открыть в браузере http://<IP-адрес сервера> — должна открыться та же страница, что при проверке Apache (с добавлением 8080):

Проверка работоспособности Apache + NGINX
#97
Web servers / От: NGINX + Apache + MariaDB (...
Последний ответ от George - Окт. 04, 2022, 11:34
Apache

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

Устанавливаем apache и модуль для php:

Код: bash
apt install apache2 libapache2-mod-php

Заходим в настройки портов:

Код: bash
nano /etc/apache2/ports.conf

И редактируем следующее:
Код: vim
Listen 8080

#<IfModule ssl_module>
#       Listen 443
#</IfModule>

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

* мы настроили прослушивание на порту 8080, так как на 80 уже работает NGINX. Также мы закомментировали прослушивание по 443, так как и он будет слушаться NGINX.

Теперь открываем настройку следующего модуля:

Код: bash
nano /etc/apache2/mods-available/dir.conf

И добавляем впереди индексных файлов index.php:
Код: vim
<IfModule dir_module>
    DirectoryIndex index.php index.html ...
</IfModule>

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

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

Код: bash
nano /etc/apache2/apache2.conf

Рядом с опциями Directory дописываем:

Код: vim
<Directory /var/www/*/www>
    AllowOverride All
    Options Indexes ExecCGI FollowSymLinks
    Require all granted
</Directory>

* где Directory указывает на путь, для которого мы хотим задать настройки; AllowOverride — позволит переопределить все настройки с помощью файла .htaccess; Options задает некоторые настройки: Indexes разрешает списки каталогов, ExecCGI разрешает запуск cgi скриптов, Require all granted — предоставляет всем доступ к сайтам в данном каталоге.

Ниже допишем:

Код: vim
<IfModule setenvif_module>
    SetEnvIf X-Forwarded-Proto https HTTPS=on
</IfModule>

* этой настройкой мы при получении заголовка X-Forwarded-Proto со значением https задаем переменную $_SERVER['HTTPS'] равную on. Данная настройки критична для функционирования некоторых CMS.

Запрещаем mpm_event:
Код: bash
a2dismod mpm_event

* по умолчанию, apache2 может быть установлен с модулем мультипроцессовой обработки mpm_event. Данный модуль не поддерживает php 7 и выше.

Разрешаем модуль мультипроцессовой обработки mpm_prefork:

Код: bash
a2enmod mpm_prefork

Разрешаем модуль php:

Код: bash
a2enmod php8.1

* в данном примере установлен php версии 8.1.

Разрешаем модуль setenvif:

Код: bash
a2enmod setenvif

Разрешаем модуль rewrite:

Код: bash
a2enmod rewrite

 

В процессе включения модулей, если мы видим «Module ... already enabled», значит модуль уже включен.

Разрешаем автозапуск Apache и перезапускаем службу:

Код: bash
systemctl enable apache2

Код: bash
systemctl restart apache2
Открываем браузер и вводим в адресную строку http://<IP-адрес сервера>:8080. Мы должны увидеть привычную страницу:

Проверка работоспособности Apache с помощью phpinfo

* в разделе Server API мы должны увидеть Apache.
#98
Web servers / От: NGINX + Apache + MariaDB (...
Последний ответ от George - Окт. 04, 2022, 11:16
Установка и настройка FTP-сервера

Мы настроим ProFTPd, так как он позволит использовать виртуальных пользователей с uid пользователя www-data.

Для его установки вводим следующую команду:

Код: bash
apt install proftpd

Смотрим uid пользователя www-data:

Код: bash
id www-data

* в Ubuntu это, как правило, 33.

Создаем виртуального пользователя:

Код: bash
ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=ftpwww --uid=33 --gid=33 --home=/var/www --shell=/usr/sbin/nologin

* где /etc/proftpd/ftpd.passwd — путь до файла, в котором хранятся пользователи; ftpwww — имя пользователя (логин); uid и gid — идентификаторы пользователя и группы системной учетной записи (www-data); /var/www — домашний каталог пользователя; /usr/sbin/nologin — оболочка, запрещающая локальный вход пользователя в систему.

Открываем основной конфигурационный файл:
Код: bash
nano /etc/proftpd/proftpd.conf

Снимаем комментарий или редактируем опцию:

Код: vim
DefaultRoot                     ~
* данная опция говорит о том, что корневой директорией для пользователя будет домашняя директория. Это нужно, чтобы FTP-пользователи не могли выйти за пределы дозволенного и видеть на сервере сайты друг друга.

Создаем дополнительный конфигурационный файл для proftpd:

Код: bash
nano /etc/proftpd/conf.d/custom.conf
Со следующим содержимым:

Код: vim
UseIPv6 off
IdentLookups off
PassivePorts 60000 65535

RequireValidShell off
AuthUserFile /etc/proftpd/ftpd.passwd
AuthPAM off
LoadModule mod_auth_file.c
AuthOrder mod_auth_file.c

* где 60000 - 65535 — диапазон динамических портов для пассивного режима.

Разрешаем автозапуск FTP-серверу и запускаем его:

Код: bash
systemctl enable proftpd
Код: bash
systemctl restart proftpd

Пробуем подключиться к серверу, использую любые FTP-клиенты, например, FileZilla, Total Commander или тот же браузер.

При необходимости, можно настроить шифрование и хранение пользователей в  базе данных. Подробнее в инструкции Установка и настройка ProFTPd на Ubuntu Server.
#99
Web servers / От: NGINX + Apache + MariaDB (...
Последний ответ от George - Окт. 04, 2022, 11:09
Установка Memcached


Для начала, выполняем установку пакетов:

Код: bash
apt install memcached php-memcached

После разрешаем автозапуск и запускаем сервис кэширования:

Код: bash
systemctl enable memcached

Перезапускаем php-fpm:

Код: bash
systemctl restart php8.1-fpm

Для проверки, что модуль memcached появился в PHP, открываем наш сайт в браузере — в phpinfo должна появиться новая секция:
#100
Web servers / От: NGINX + Apache + MariaDB (...
Последний ответ от George - Окт. 04, 2022, 10:51
Установка phpMyAdmin

Код: bash
apt install phpmyadmin

* в процессе установки система может потребовать ввод пароля для пользователя phpmyadmin. Его нужно ввести дважды.

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

а) Виртуальный домен в NGINX:

Код: bash
nano /etc/nginx/sites-enabled/phpmyadmin.conf

Код: vim
server {
        listen       80;
        server_name  phpmyadmin.example.org;
        set $root_path /usr/share/phpmyadmin;

        root $root_path;

        location / {
                index index.php;
        }

        location ~ \.php$ {
                fastcgi_pass unix:/run/php/php8.1-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name;
                include fastcgi_params;
                fastcgi_param DOCUMENT_ROOT $root_path;
        }
}

* где phpmyadmin.example.org — адрес для виртуального домена, именно этот адрес должен быть введен в адресную строку браузера, чтобы открылся нужный сайт. Поэтому есть нет возможность зарегистрировать домен и имя узла в DNS, можно воспользоваться локальным файлом hosts. /usr/share/phpmyadmin — это каталог, в который по умолчанию устанавливается phpMyAdmin.

б) Используем location /phpmyadmin:

Код: bash
nano /etc/nginx/sites-enabled/default
Добавляем location :

Код: vim
server {
        listen       80 default_server;

        ...
Код: vim
    location /phpmyadmin {
            root /usr/share/;
            index index.php;
            location ~ ^/phpmyadmin/(.+\.php)$ {
                root /usr/share/;
                fastcgi_pass unix:/run/php/php8.1-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
                fastcgi_read_timeout 300;
            }
            location ~* ^/phpmyadmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {
                root /usr/share/;
            }      

}

После перезапускаем NGINX:

Код: bash
systemctl reload nginx

Открываем браузер. В зависимости от выбранного способа настройки, ссылка на phpmyadmin будет разной:

    http://phpmyadmin.example.org — если настроили phpmyadmin на отдельном виртуальном домене (способ а).
    http://<IP-адрес сервера>/phpmyadmin — если настроили location /phpmyadmin (способ б).

Откроется форма для авторизации — вводим логин phpmyadmin и пароль, который мы указали при установке phpmyadmin.

Если система вернула ошибку входа из-за неправильного пароля, необходимо задать пароль для учетной записи root@localhost (рассказывается выше в разделе установки MariaDB).
🡱 🡳

Отметьте интересные вам фрагменты текста и они станут доступны по уникальной ссылке в адресной строке браузера.