Предупреждение: эта статья не является инструкцией к действиям, является лишь дневником моей последней настройки сервера и может уничтожить ваш сервер и карьеру. Стоит учесть, что при каждой настройке возникают какие-то неожиданные проблемы даже если следовать одной и той же инструкции. Это необъяснимо, но факт. Просьба не писать, что у вас что-то не получается, но если есть чем дополнить, то добро пожаловать в комментарии в конце страницы.


Подготовка

Имеем сервер с Centos 6.9 и root-доступ.

Если временная зона установлена неверно, сразу устанавливаем МСК:

rm /etc/localtime
ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime

Создаем пользователя "для чтения", под которым будет работать nginx:

useradd -m webmaster -s /bin/bash
passwd webmaster

Создаем пользователя сайта и добавляем в его группу пользователя "для чтения":

useradd -s /bin/bash siteuser
passwd siteuser
usermod -a -G siteuser webmaster
chmod 750 /home/siteuser

Таким образом с учетом прав 750 webmaster сможет читать файлы всех сайтов, но siteuser сможет читать и писать только свои файлы.

Отключаем SELinux, открываем /etc/selinux/config и устанавливаем:

SELINUX=disabled

Перезапускаем систему

reboot

В iptables открываем порты 80 и 443:

iptables -I INPUT 5 -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -I INPUT 5 -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
service iptables save
service iptables restart

Устанавливаем пакеты, которые могут понадобиться в будущем:

yum install gcc gcc-c++ make nano zip unzip wget mc bzip2 curl nginx memcached yum-utils yum-plugin-replace

MySQL

Устанавливаем MySQL:

yum install http://repo.webtatic.com/yum/el6/x86_64/webtatic-release-6-9.noarch.rpm
yum replace mysql-libs --replace-with mysql55w-libs
yum install mysql55w-server

В /etc/my.cnf добавляем/заменяем:

[mysqld]
max_allowed_packet = 192M
key_buffer = 32M
query_cache_size = 64M
query_cache_limit = 2M
thread_cache_size = 16
table_open_cache = 512
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
innodb_buffer_pool_size = 192M
innodb_additional_mem_pool_size = 16M
transaction-isolation = READ-COMMITTED

[mysqldump]
max_allowed_packet = 192M

PHP

Устанавливаем php 5.6:

yum install http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
yum-config-manager --enable remi-php56
yum install php php-mcrypt php-devel php-gd php-mbstring php-mysql php-pdo php-xml php-pecl-memcache

Настраиваем php, в /etc/php.ini изменяем:

short_open_tag = On
realpath_cache_size = 4096k
max_input_vars = 10000
memory_limit = 512M
post_max_size = 16M
cgi.fix_pathinfo=0
upload_max_filesize = 16M
max_file_uploads = 100
date.timezone = "Europe/Moscow"
mbstring.internal_encoding = UTF-8
mbstring.func_overload = 2

Apache

Устанавливаем nginx и httpd-itk:

yum install nginx httpd-itk

В /etc/httpd/conf.d/php.conf добавляем:

<IfModule itk.c>
   LoadModule php5_module modules/libphp5.so
</IfModule>
<IfModule mod_setenvif.c>
SetEnvIf x-forwarded-proto https HTTPS=on
</IfModule>

В /etc/sysconfig/httpd добавляем:

HTTPD=/usr/sbin/httpd.itk

Изменения в /etc/httpd/conf/httpd.conf:

User webmaster
Group webmaster
ServerName localhost
<Directory />
    Options FollowSymLinks
    AllowOverride All
</Directory>
AllowOverride All

Создаём файл /etc/httpd/conf.d/vhosts.conf с конфигом серверов:

Listen 127.0.0.1:8888
<VirtualHost *:8888>
    ServerName site.ru
    DocumentRoot /home/siteuser/site.ru/
    AssignUserId user user
    php_value session.save_path "/var/lib/php/session_siteru"
</VirtualHost>

Соответственно папку для сессий нужно создать и дать права на неё группе пользователя сайта:

mkdir /var/lib/php/session_siteru
chown root:siteuser session_siteru
chmod 770 /var/lib/php/session_siteru

NGINX

Настраиваем NGINX. В /etc/nginx/nginx.conf:

user webmaster;
worker_processes 8; # количество потоков процессора или auto

В блоке http добавляем/обновляем:

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
gzip on;
gzip_types text/css application/x-javascript;
proxy_buffering off;
client_max_body_size 100m;
client_body_buffer_size 16M;

В /etc/nginx/ создаем папку ssl и кидаем туда сертификат и ключ SSL.

В /etc/nginx/conf.d создаём файл.conf с конфигом сайта:

server {
    listen 80;
    listen 443 ssl;
    server_name site.ru;
    root /home/siteuser/site.ru/;
    index index.php index.html index.htm;
    ssl_certificate ssl/site.crt;
    ssl_certificate_key ssl/site.key;

    include /etc/nginx/default.d/*.conf;

    location / {
        try_files   $uri $uri/ @apache;
    }
    location ~ \.php$ {
        proxy_pass http://127.0.0.1:8888;
    }
    location @apache {
        proxy_pass http://127.0.0.1:8888;
    }

    location ~ (/\.ht|/\.git|/bitrix/modules|/bitrix/php_interface) {
        deny all;
    }

    error_page 404 /404.php;
    error_page 500 502 503 504 /500.html;
}

Запуск сервисов

Добавляем все сервисы в автозапуск и запускаем:

chkconfig --level 345 nginx on
chkconfig --level 345 httpd on
chkconfig --level 345 mysqld on
service nginx start
service httpd start
service mysqld start

Настройка MySQL и создание БД

Настраиваем MYSQL, для начала устанавливаем пароль root-пользователя:

mysqladmin -u root password 'PASSWORD7'

Создаём базу данных и пользователя БД под сайт:

mysql -u root -p

mysql> create database sitedb;
mysql> grant usage on *.* to dbuser@localhost identified by 'PASSWORD9';
mysql> grant all privileges on sitedb.* to dbuser@localhost;
mysql> flush privileges;
mysql> exit

Полезные команды

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

Дамп БД в файл:

mysqldump -u DBUSER -p -f DBNAME > dump.sql

Восстановление БД из файла:

mysql -u DBUSER -p -f DBNAME < dump.sql

Скачивание /path/to/download/ с удаленного сервера через ssh [email protected] в папку /path/to/upload/:

rsync -avz --exclude 'dir/*' --exclude 'dir/' [email protected]:/path/to/download/ /path/to/upload/

Создание и распаковка tar.gz:

tar -cvfz archive.tar.gz dir #создание архива gzip
tar xvfz archive.tar.gz -C /folder/to/unpack/ #распаковка

Копирование файлов с FTP-сервера (на крайний случай):

wget -r --user=FTPUSER --password=FTPPASSWD ftp://ftp-server.ru