Разворачиваем веб-сервер на связке NGINX + Apache (httpd) + MariaDB + PHP + PHPMyAdmin +FTP, или по-простому NGINX + LAMP.
Будем следовать следующему принципу – сначала всё установим, а потом уже будем заниматься настройкой.
Устанавливаем компоненты
Это своего рода чек-лист для проверки наличия компонентов:
- NGINX – подробно описано в этой статье.
- PHP и PHP-FRM – подробно описано в этой статье.
- Apache (httpd) – подробно описано в этой статье.
- MariaDB – подробно описано в этой статье.
- PhpMyAdmin – подробно описано в этой статье.
Перед настройкой. Важно для понимания!
Общая картина выглядит следующим образом:
- Настройка сервера на какой-нибудь домен – это настройка всего ДВУХ основных компонентов – httpd и nginx. Для домена создается один конфиг в httpd и другой в nginx, и все по сути.
- Но, чтобы прописать конфиги правильно, нужно заранее определиться со структурой папок для сайта на своем сервере, потому что в конфигах пишутся пути до этих папок, и нужно их заранее знать уже.
Ну, и сразу тогда разберемся со структурой этих папок, подготовим их.
Вы можете придумать свою структуру, но лично я, как и многие другие вебмастера, использую следующую (просто посмотрите, а чуть позже создадим):
/web | создаем новую папку в самом корне сервера, т.е. на одном уровне с папками etc, var и др.
Это будет основной раздел, где будут все наши сайты. |
/web/site1.ru /web/site2.ru /web/site3.ru |
внутри нее будем создавать отдельную папку под каждый сайт, так удобно. |
И для каждого сайта создаем две папки:
|
|
/web/site1.ru/www | эта папка будет содержать все файлы сайта (сюда будем заливать по ftp) |
/web/site1.ru/logs | а сюда будут сваливаться все логи |
Теперь создаем это все одной командой:
mkdir /web && mkdir /web/site1.ru && mkdir /web/site1.ru/www && mkdir /web/site1.ru/logs
*таким образом мы создали все необходимые папки для одного сайта.
Не забываем назначить владельца папки:
chown -R apache. /web
И дать права на эту папку:
chmod -R 775 /web
Переходим к настройке связки NGINX + Apache (httpd)
Важно для понимания!
Как мы помним, для того, чтобы наш сервер обслуживал какой-нибудь домен, нужно для этого домена:
- написать конфиг в httpd
- написать конфиг в nginx
То есть всего лишь 2 конфига и все!
Конфиг для httpd
Перед созданием нового конфига, нужно проверить, чтобы в основном конфиге сервиса /etc/httpd/conf/httpd.conf была раскомментирована строка (она обычно в самом конце):
IncludeOptional conf.d/*.conf
*тогда наш отдельный новый конфиг будет подхватываться сервисом автоматически.
Открываем на редактирование и правим (раскомментируем):
mcedit /etc/httpd/conf/httpd.conf
Сохраняем.
Теперь заходим в директорию /etc/httpd/conf.d/ и внутри нее создаем файл-конфиг с названием сайта site1.ru.conf
То есть можно выполнить команду:
mcedit /etc/httpd/conf.d/site1.ru.conf
*тогда откроется несуществующий файл, мы туда занесем инфу, сохраним его и файл тут же создастся с этим содержимым.
Классический конфиг выглядит так:
#в связке nginx+apache ставим именно порт 8080 <VirtualHost *:8080> #тут все понятно, пишем домен и его алиас ServerName site1.ru ServerAlias www.site1.ru #определяем корневую папку сайта для доступа из интернета DocumentRoot /web/site1.ru/www #определяем куда будут сваливаться логи ошибок и доступа ErrorLog /web/site1.ru/logs/error.log CustomLog /web/site1.ru/logs/access.log common #следующий блок определяет опции и разрешения для корневой папки сайта <Directory /web/site1.ru/www> Options FollowSymLinks AllowOverride All Require all granted </Directory> </VirtualHost>
Сохраняем и проверяем корректность настроек конфига:
apachectl configtest
Перезапускаем httpd:
systemctl restart httpd
В принципе, теперь можно перейти к настройке конфига nginx. Но для мозгоебов перфекционистов, к которым я себя тоже отношу, можно пойти по пути универсализации этого конфига.
Настройка конфига httpd для перфекционистов
Этот блок можно пропустить и читать уже про наcтройку конфига nginx. Здесь я просто попытаюсь его изменить так, чтобы для каждого нового сайта исправлять конфиг приходилось самый минимум, то есть сделать его практически универсальным.
Мы видим, что у нас часто повторяется название сайта site1.ru. И для каждого нового домена придется менять его снова во многих местах. Это неудобно, поэтому сделаем так, чтобы его приходилось менять только в одном месте.
Для этого название сайта определим в переменную, а потом будем просто использовать эту переменную в любом месте.
Никуда не пишем, просто для понимания:
Define domain site1.ru #команда define определяет переменную
Теперь в том месте, где нам понадобится вывести название нашего сайта, мы просто будем писать:
${domain}
Теперь берем наш классический конфиг (которые уже сделали выше) и сначала задаем переменную, а потом везде site1.ru меняем на ${domain}.
Итоговый конфиг такой:
#в связке nginx+apache ставим именно порт 8080 <VirtualHost *:8080> #определяем переменную, пишем это в самом начале Define domain site1.ru #тут все понятно, пишем домен и его алиас ServerName ${domain} ServerAlias www.${domain} #определяем корневую папку сайта для доступа из интернета DocumentRoot /web/${domain}/www #определяем куда будут сваливаться логи ошибок и доступа ErrorLog /web/${domain}/logs/error.log CustomLog /web/${domain}/logs/access.log common #следующий блок определяет опции и разрешения для корневой папки сайта <Directory /web/${domain}/www> Options FollowSymLinks AllowOverride All Require all granted </Directory> </VirtualHost>
— этот конфиг удобен тем, что название сайта нужно менять только в одном месте, там где задается переменная. А в остальных местах подставляется эта самая переменная.
Если идти еще дальше, то одинаковые куски кода можно вынести в дефолтный конфиг httpd, который лежит вот здесь /etc/httpd/conf/httpd.conf.
Здесь одинаковым блоком может стать:
<Directory /web/${domain}/www> Options FollowSymLinks AllowOverride All Require all granted </Directory>
Но, чтобы он стал универсальным и подходил для любого домена, нужно ${domain} заменить на * (звездочку).
<Directory /web/*/www> Options FollowSymLinks AllowOverride All Require all granted </Directory>
И запихать этот код в дефолтный конфиг /etc/httpd/conf/httpd.conf, а в классическом конфиге тогда этот кусок нужно вырезать.
Не забываем перезапустить httpd.
Конфиг для NGINX
Перед созданием нового конфига, нужно проверить, чтобы в основном конфиге сервиса /etc/nginx/nginx.conf была раскомментирована строка:
include /etc/nginx/conf.d/*.conf*тогда наш новый конфиг подхватится сервисом автоматически.
Открываем и проверяем:
mcedit /etc/nginx/nginx.conf
Аналогично, заходим в директорию /etc/nginx/conf.d/ и внутри нее создаем файл-конфиг с названием сайта site1.ru.conf или просто выполняем команду:
mcedit /etc/nginx/conf.d/site1.ru.conf
И в него заносим:
server { listen 80; server_name site1.ru www.site1.ru; 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; # Ведём журнал доступа: access_log /web/site1.ru/logs/access.log; # Разделяем статику и динамку, статику храним в кэше 10 дней: location ~* ^.+\.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|docx|xls|xlsx|exe|pdf|ppt|tar|wav|bmp|rtf|js)$ { root /web/site1.ru/www; expires 10d; } location / { proxy_pass http://127.0.0.1:8080/; proxy_redirect off; log_not_found off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
В данном конфиге – для нового сайта нужно заменить имя сайта в четырех местах.
Проверяем корректность настройки конфига:
nginx -t
Перезапускаем nginx:
systemctl restart nginx
Важно! После каждого изменения любого конфига, необходим перезапуск сервиса!
FTP
В качестве ftp лучше использовать sftp. Установка sftp на centos 7 рассмотрена в этой статье.