Общая настройка системы.
Обновляем CentOS:
Устанавливаем репозиторий EPEL:
Настраиваем время:
ДЛЯ РОССИИ
Код:
\cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime
ДЛЯ УКРАИНЫ
Код:
\cp /usr/share/zoneinfo/Europe/Kiev/etc/localtime
Настраиваем cron для автоматической синхронизации времени:
И настраиваем запуск задания ежедневно в 00:00:
ДЛЯ РОССИИ
Код:
0 0 * * * /sbin/ntpdate ru.pool.ntp.org
ДЛЯ УКРАИНЫ
Код:
0 0 * * * /sbin/ntpdate ua.pool.ntp.org
Отключаем SELinux:
Код:
sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config
Открываем необходимые порты в брандмауэре:
Код:
firewall-cmd --permanent --add-port=80/tcp
Код:
firewall-cmd --permanent --add-port=443/tcp
Код:
firewall-cmd --permanent --add-port=8080/tcp
Код:
firewall-cmd --permanent --add-port=20-21/tcp
Код:
firewall-cmd --permanent --add-port=40900-40999/tcp
Код:
firewall-cmd --permanent --add-port=25/tcp
Код:
firewall-cmd --permanent --add-port=465/tcp
Код:
firewall-cmd --permanent --add-port=587/tcp
* 80, 443 и 8080 порты для веб-сервера; 20, 21 порты нужны для работы FTP; 40900-40999 также необходимы для работы FTP (динамические порты для пассивного режима); 25, 465 и 587 порты нужны для работы почтового сервера по SMTP; последняя команда перезапускает firewalld, чтобы применить новые правила.
Установка NGINX
Код:
nano /etc/yum.repos.d/nginx.repo
Код:
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
Внесем небольшую корректировку в файл nginx.conf:
Код:
nano etc/nginx/nginx.conf
Код:
http {
...
server_names_hash_bucket_size 64;
....
}
* на практике, может встретиться ошибка could not build server_names_hash, you should increase server_names_hash_bucket_size: 32. Она возникает при большом количестве виртуальных серверов или если один из них будет иметь длинное название. Данная строка в конфиге исправит ситуацию.
Проверим, что веб-сервер работает. Для этого открываем браузер и вводим в адресной строке IP-адрес сервера. В итоге мы должны увидеть заголовок «Welcome to nginx!»:
<-------------- добавлено через 65 сек. -------------->
Установка PHP 7 и PHP-FPM
Устанавливаем репозиторий на webtatic.com:
Код:
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
Теперь устанавливаем php7:
Проверить рабочую версию php можно следующей командой:
Код:
yum install php70w-fpm php70w-opcache
Настройка связки NGINX + PHP
Код:
nano /etc/nginx/nginx.conf
В секции location редактируем параметр index на следующее значение:
Код:
location / {
index index.php;
}
А внутри секции server добавим следующее:
Код:
location ~ \.php$ {
set $root_path /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name;
include fastcgi_params;
fastcgi_param DOCUMENT_ROOT $root_path;
}
* где /usr/share/nginx/html — корневой путь хранения скриптов; 9000 — порт php-fpm.
Проверяем правильность настроек nginx:
И перезагружаем его:
Заходим в каталог хранения настроенного сайта:
Создаем index.php со следующим содержимым:
Открываем в браузере IP-адрес нашего сервера. Теперь мы должны увидеть сводную информацию по PHP и его настройкам:
Установка MariaDB:
Устанавливаем MariaDB следующей командой:
Код:
yum install mariadb mariadb-server
* для установки mysql выполняем команду yum install mysql
Разрешаем автозапуск и запускаем СУБД:
* для работы с mysql меняем mariadb на mysql.
Сразу создаем пароль для учетной записи root:
Код:
mysqladmin -u root password
<-------------- добавлено через 65 сек. -------------->
PHP + MariaDB (MySQL)
Для возможности подключаться к базе данных скриптами PHP необходимо установить следующие модули:
После перезагружаем php-fpm:
Код:
systemctl restart php-fpm
И открываем наш сайт в браузере. В phpinfo появится новая секция MySQL.
* нас не должно смущать, что установили мы mariadb, а заголовок mysql. Если посмотреть в таблицу, можно увидеть ячейку Client API version, в которой указано, что используется именно mariadb.
<-------------- добавлено через 62 сек. -------------->
Установка phpMyAdmin
Для установки phpMyAdmin вводим следующую команду:
Теперь создадим для него отдельный виртуальный домен в NGINX:
Код:
nano /etc/nginx/conf.d/phpmyadmin.conf
И добавим в него следующее содержимое:
Код:
server {
listen 80;
server_name phpmyadmin.mydomain.com;
set $root_path /usr/share/phpmyadmin;
location / {
root $root_path;
index index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name;
include fastcgi_params;
fastcgi_param DOCUMENT_ROOT $root_path;
}
}
* где phpmyadmin.dmosk.local — адрес для виртуального домена, именно этот адрес должен быть введен в адресную строку браузера, чтобы открылся нужный сайт. Поэтому есть нет возможность зарегистрировать домен и имя узла в DNS, можно воспользоваться локальным файлом hosts. /usr/share/phpmyadmin — это каталог, в который по умолчанию устанавливается phpMyAdmin.
После перезапускаем NGINX:
Также нужно перезапустить php-fpm, так как в процессе установки был добавлен модуль mbstring:
Код:
systemctl restart php-fpm
И открываем в браузере наш домен, в данном примере, phpmyadmin.mydomain.com. Откроется форма для авторизации — вводим логин root и пароль, который мы указали после установки и запуска mariadb.
<-------------- добавлено через 65 сек. -------------->
Установка Memcached
Для начала, выполняем установку пакетов:
Код:
yum install php70w-pecl-memcached
После разрешаем автозапуск и запускаем сервис кэширования:
Код:
systemctl enable memcached
Код:
systemctl start memcached
Перезапускаем php-fpm:
Код:
systemctl restart php-fpm
<-------------- добавлено через 60 сек. -------------->
Установка Mcrypt, Zip, Curl, GD, PDO
Код:
yum install php70w-mcrypt
Код:
yum install php70w-common
<-------------- добавлено через 67 сек. -------------->
Postfix
В CentOS 7 postfix уже установлен и запущен. Нам необходимо сделать несколько простых настроек:
Код:
nano /etc/postfix/main.cf
Код:
myorigin = $mydomain
smtp_generic_maps = hash:/etc/postfix/generic_map
* где myhostname — имя узла для почтового сервера (его он будет использовать в представлениях другим почтовым серверам); mydomain — домен сервера; myorigin — имя домена, которое будет подставляться всем отправляемым сообщениям без явного указания оного; smtp_generic_maps указывает на карту с общими правилами пересылки.
Открываем карту пересылки:
Код:
nano /etc/postfix/generic_map
И добавляем:
Код:
@mydomain.com no-reply@mydomain.com
* данной настройкой мы будем подставлять всем отправляемым письмам без поля FROM адрес
no-reply@mydomain.com
Создаем карту:
Код:
postmap /etc/postfix/generic_map
Для применения настроек перезагружаем почтовый сервер:
Код:
systemctl restart postfix
<-------------- добавлено через 64 сек. -------------->
Конфигурация сервера:
PHP
Открываем на редактирование следующий файл:
И правим следующее:
Код:
upload_max_filesize = 256M
post_max_size = 256M
short_open_tag = On
date.timezone = "Europe/Moscow"
Перезапускаем php-fpm
Код:
systemctl restart php-fpm
NGINX
Открываем на редактирование следующий файл:
Код:
nano /etc/nginx/nginx.conf
И правим следующее:
И внутри секции http добавляем:
Код:
client_max_body_size 256M;
Подключаем домен магазина:
Создаем новый файл виртуального домена NGINX:
Код:
nano /etc/nginx/conf.d/prestashopstore.conf
* обязательно на конце должен быть .conf, так как только такие файлы веб-сервер подгружает в конфигурацию.
И добавляем следующее содержимое:
Код:
server {
listen 80;
listen [::]:80;
server_name prestashopstore.com www.prestashopstore.com;
root /var/www/prestashopstore/www;
access_log /var/www/prestashopstore/log/nginx/access.log;
error_log /var/www/prestashopstore/log/nginx/error.log;
index index.php index.html;
location ~ /.well-known {
root /var/www/prestashopstore/www/;
allow all;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
auth_basic off;
allow all;
log_not_found off;
access_log off;
}
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 1;
gzip_buffers 16 8k;
gzip_http_version 1.0;
gzip_types application/json text/css application/javascript;
rewrite ^/[a-zA-Z][a-zA-Z]/(index\.php.*)$ /$1 last;
rewrite ^/api/?(.*)$ /webservice/dispatcher.php?url=$1 last;
rewrite ^/([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+.jpg$ /img/p/$1/$1$2$3.jpg last;
rewrite ^/([0-9])([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+.jpg$ /img/p/$1/$2/$1$2$3$4.jpg last;
rewrite ^/([0-9])([0-9])([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+.jpg$ /img/p/$1/$2/$3/$1$2$3$4$5.jpg last;
rewrite ^/([0-9])([0-9])([0-9])([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+.jpg$ /img/p/$1/$2/$3/$4/$1$2$3$4$5$6.jpg last;
rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+.jpg$ /img/p/$1/$2/$3/$4/$5/$1$2$3$4$5$6$7.jpg last;
rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+.jpg$ /img/p/$1/$2/$3/$4/$5/$6/$1$2$3$4$5$6$7$8.jpg last;
rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+.jpg$ /img/p/$1/$2/$3/$4/$5/$6/$7/$1$2$3$4$5$6$7$8$9.jpg last;
rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+.jpg$ /img/p/$1/$2/$3/$4/$5/$6/$7/$8/$1$2$3$4$5$6$7$8$9$10.jpg last;
rewrite ^/c/([0-9]+)(-[.*_a-zA-Z0-9-]*)(-[0-9]+)?/.+.jpg$ /img/c/$1$2$3.jpg last;
rewrite ^/c/([a-zA-Z_-]+)(-[0-9]+)?/.+.jpg$ /img/c/$1$2.jpg last;
location /admin-dev/ {
if (!-e $request_filename) {
rewrite ^/.*$ /admin-dev/index.php last;
}
}
location / {
if (!-e $request_filename) {
rewrite ^/.*$ /index.php last;
}
}
location ~ .php$ {
fastcgi_split_path_info ^(.+.php)(/.*)$;
try_files $uri =404;
fastcgi_keep_conn on;
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
* где prestashopstore.com — домен, для которого создается виртуальный домен; /var/www/prestashopstore — каталог, в котором будет размещаться сайт.
** обратите внимание на выделения полужирным — здесь нужно подставить свои данные.
*** Заменить admin-dev на свой путь к панели управления.
<-------------- добавлено через 70 сек. -------------->
Создаем каталоги для сайта:
* где
prestashopstore — имя каталога. Нам будет намного удобнее копировать и вставлять команды с переменной (не придется править после копипасты).
Код:
mkdir -p /var/www/$TMP_SITE/{www,tmp}
Код:
mkdir -p /var/www/$TMP_SITE/log/{nginx}
Создаем индексный файл со следующим содержимым:
Код:
nano /var/www/$TMP_SITE/www/index.php
Код:
<?php echo "<h1>Hello from Prestashopstore</h1>"; ?>
Проверяем корректность настроек конфигурационных файлов:
Перезапускаем веб-сервер:
Открываем сайт в браузере.
Устанавливааем Prestashop.
<-------------- добавлено через 64 сек. -------------->
Получение бесплатного сертификата Let's Encrypt
Запрашивать сертификат Let's Encrypt проще всего с веб-сервера, на котором запущен сайт для домена. Возможен альтернативный вариант с монтирование сетевой папки, но его рассматривать не будем.
Устанавливаем утилиту certbot.
Код:
certbot certonly --webroot --agree-tos --email postmaster@prestashopstore.com --webroot-path /var/www/prestashopstore/www -d prestashopstore.com -d www.prestashopstore.com
* где:
certonly — запрос нового сертификата;
webroot — проверка будет выполняться на основе запроса к корню сайта;
agree-tos — даем согласие на лицензионное соглашение;
email — почтовый адрес администратора домена;
webroot-path — каталог в системе Linux, который является корневым для сайта;
d — перечисление доменов, для которых запрашиваем сертификат.
После успешного выполнения команды, сертификаты будут созданы в каталоге /etc/letsencrypt/archive/prestashopstore.com, а также симлинки на них в каталоге /etc/letsencrypt/live/prestashopstore.com. При настройке приложений, стоит указывать пути до симлинков, так как при обновлении файлы в первом каталоге будут меняться, во втором — нет. Публичный ключ будет с именем cert.pem, а приватный — privkey.pem.
Автоматическое продление
Смотрим полный путь до скрипта certbot:
Открываем на редактирование cron и добавляем следующее:
0 0 * * 1,4 /usr/bin/certbot renew
* в данном примере проверка и продление сертификата будет выполняться по понедельникам и четвергам (1,4) в 00:00. /usr/bin/certbot — путь, который мне выдала команда which certbot.
Команда certbot renew проверяет для всех наших сертификатов срок окончания, и если осталось менее 30 дней, запрашивает новый, сохраняет его в каталоге /etc/letsencrypt/archive/<домен> и обновляет симлинк.
Редактируем настройки виртуального домена
Код:
nano /etc/nginx/conf.d/prestashopstore.conf
После последней скобки добавляем конфигурацию:
Код:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl on;
ssl_certificate /etc/letsencrypt/live/prestashopstore/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/prestashopstore/privkey.pem;
server_name prestashopstore.com www.prestashopstore.com;
root /var/www/prestashopstore/www;
access_log /var/www/prestashopstore/log/nginx/access.log;
error_log /var/www/prestashopstore/log/nginx/error.log;
index index.php index.html;
location ~ /.well-known {
root /var/www/prestashopstore/www/;
allow all;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
auth_basic off;
allow all;
log_not_found off;
access_log off;
}
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 1;
gzip_buffers 16 8k;
gzip_http_version 1.0;
gzip_types application/json text/css application/javascript;
rewrite ^/[a-zA-Z][a-zA-Z]/(index\.php.*)$ /$1 last;
rewrite ^/api/?(.*)$ /webservice/dispatcher.php?url=$1 last;
rewrite ^/([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+.jpg$ /img/p/$1/$1$2$3.jpg last;
rewrite ^/([0-9])([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+.jpg$ /img/p/$1/$2/$1$2$3$4.jpg last;
rewrite ^/([0-9])([0-9])([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+.jpg$ /img/p/$1/$2/$3/$1$2$3$4$5.jpg last;
rewrite ^/([0-9])([0-9])([0-9])([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+.jpg$ /img/p/$1/$2/$3/$4/$1$2$3$4$5$6.jpg last;
rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+.jpg$ /img/p/$1/$2/$3/$4/$5/$1$2$3$4$5$6$7.jpg last;
rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+.jpg$ /img/p/$1/$2/$3/$4/$5/$6/$1$2$3$4$5$6$7$8.jpg last;
rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+.jpg$ /img/p/$1/$2/$3/$4/$5/$6/$7/$1$2$3$4$5$6$7$8$9.jpg last;
rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+.jpg$ /img/p/$1/$2/$3/$4/$5/$6/$7/$8/$1$2$3$4$5$6$7$8$9$10.jpg last;
rewrite ^/c/([0-9]+)(-[.*_a-zA-Z0-9-]*)(-[0-9]+)?/.+.jpg$ /img/c/$1$2$3.jpg last;
rewrite ^/c/([a-zA-Z_-]+)(-[0-9]+)?/.+.jpg$ /img/c/$1$2.jpg last;
location /admin-dev/ {
if (!-e $request_filename) {
rewrite ^/.*$ /admin-dev/index.php last;
}
}
location / {
if (!-e $request_filename) {
rewrite ^/.*$ /index.php last;
}
}
location ~ .php$ {
fastcgi_split_path_info ^(.+.php)(/.*)$;
try_files $uri =404;
fastcgi_keep_conn on;
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
Теперь Prestashop работает как по HTTP так и по HTTPS по протоколу HTTP2.
Переходим в Панель управления магазином. В настройках включаем SSL.