Переносим сайт на WordPress на VDS с NGINX
Несмотря на то, что существуют коммерческие и бесплатные панели управления серверами, в ряде случаев есть смысл использовать не готовые решения, а размещать вэбсайты на сервере или VDS, настроенном вручную. Объяснение этому простое — панель требует для своей работы определенных ресурсов (это особенно заметно на небольших VDS) и не всегда позволяет делать «тонкую» настройку.
Если вы знаете, что такое командная строка unix-машины и умеете пользоваться текстовыми редакторами для работы с файлами конфигурации, давайте попробуем перенести блог на WordPress на VDS или выделенный сервер, а заодно — немного ускорим работу нашего вэбсайта. Отметим, что для других CMS последовательность действий обычно такая-же, но могут потребоваться небольшие изменения в настройках nginx.
Итак, закажем SSD VDS, выберем Centos в качестве операционной системы. Примерно через 5 минут виртуальный сервер будет готов и можно будет приступать к настройке.
Сначала — обновим установленные пакеты и уберем штатные правила iptables:
1 2 3 |
iptables -F service iptables save yum -y update |
Изменение настроек iptables требуется, так как мы уберем со стандартного порта ssh-сервер, чтобы усложнить жизнь желающим подобрать пароли. Сделаем это одной командой (XXXX замените на желаемый порт) и перезапустим ssh-сервер:
1 2 |
sed -e 's/^#Port 22$/Port XXXX/g' -ibak /etc/ssh/sshd_config service sshd restart |
Не закрывая текущую сессию, проверим доступ к нашему серверу с использованием нестандартного ssh-порта. Если все в порядке, перезагрузим VDS командой reboot.
Далее установим необходимые серверные компоненты. Мы будем использовать PHP-FPM, Nginx и Mysql для нашего вэбсайта. Подключаем дополнительные репозитории, устанавливаем пакеты и запускаем mysqld:
1 2 3 4 |
rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm yum --enablerepo=remi install nginx mysql mysql-server php-fpm php-mysql php-gd service mysqld start |
Следующим шагом назначим пароль суперпользователя MySQL и удалим тестовые таблицы. Это проще всего сделать с помощью утилиты mysql_secure_installation:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
# /usr/bin/mysql_secure_installation NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY! In order to log into MySQL to secure it, we'll need the current password for the root user. If you've just installed MySQL, and you haven't set the root password yet, the password will be blank, so you should just press enter here. Enter current password for root (enter for none): OK, successfully used password, moving on... Setting the root password ensures that nobody can log into the MySQL root user without the proper authorisation. Set root password? [Y/n] y New password: Re-enter new password: Password updated successfully! Reloading privilege tables.. ... Success! By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? [Y/n] y ... Success! Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? [Y/n] y ... Success! By default, MySQL comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? [Y/n] y - Dropping test database... ... Success! - Removing privileges on test database... ... Success! Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? [Y/n] y ... Success! Cleaning up... All done! If you've completed all of the above steps, your MySQL installation should now be secure. Thanks for using MySQL! |
Самое время заняться нашим вэбсервером. Создаем каталог для вэбсайта:
1 |
mkdir -p /var/www/blog.net |
После этого создаем в любимом текстовом редакторе файл конфигурации виртуального хоста для nginx. В нашем случае файл называется /etc/nginx/conf.d/blog.net.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
server { listen 80; server_name blog.net www.blog.net; root /var/www/blog.net; index index.php index.html index.htm; gzip on; gzip_buffers 16 8k; gzip_comp_level 4; gzip_http_version 1.0; gzip_min_length 1280; gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript image/x-icon image/bmp; gzip_vary on; location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { root /var/www/blog.net; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_intercept_errors on; include fastcgi_params; } location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires 30d; log_not_found off; } } |
Отметим ключевые моменты — мы включаем gzip-сжатие для более быстрой загрузки сайта, файлы с расширение php отправляем на обработку php-fpm, а для статичных ресурсов генерируем заголовок Expires для кэширования на стороне посетителя сайта. Эти простые изменения позволяют объективно ускорить скорость загрузки сайта.
Перейдем к настройке PHP-FPM. Единственное изменение, которое необходимо сделать — сменить uid (пользователя, от которого работают процессы интерпретатора). Сделаем это одной командой с помощью sed:
1 |
sed -e 's/ = apache$/ = nginx/g' -ibak /etc/php-fpm.d/www.conf |
Основная часть настройки готова. Включим автозапуск необходимых компонентов, запустим их и сделаем тестовый php-файл для проверки работы нашей конструкции:
1 2 3 4 5 6 |
chkconfig --levels 235 mysqld on chkconfig --levels 235 nginx on chkconfig --levels 235 php-fpm on service php-fpm start service nginx start echo "<?php phpinfo(); ?>" > /var/www/blog.net/phpinfo.php |
Если все сделано без ошибок, то теперь можно с помощью любимого вэбброузера зайти по адресу http://ip-адрес-сервера/phpinfo.php и увидеть информацию о версии PHP и установленных модулях. В дальнейшем этот файл стоит удалить, а пока — приступим к переносу нашего блога.
Создаем базу данных (вместо XXXX подставьте пароль к MySQL, а вместо blogdb — имя базы данных сайта):
1 |
mysqladmin -uroot -pXXXX create blogdb |
С помощью консоли mysql добавим нового пользователя и предоставим ему привелегии для работы с базой данных blogdb. Запустим mysql -uroot -pXXXX и выполним три команды:
1 2 3 |
CREATE USER 'bloguser'@'localhost' IDENTIFIED BY 'PaSsWoRd'; GRANT ALL PRIVILEGES ON bloguser.* TO 'blogdb'@'localhost'; FLUSH PRIVILEGES; |
На этом настройка нашего сервера закончена. С помощью scp или sftp поместим резервную копию файлов нашего сайта в /var/www/blog.net. SQL-дамп базы данных можно загрузить следующей командой:
1 |
mysql -uroot -pXXXX blogdb < dump.sql |
Финальный штрих — установим корректные права на файлы:
1 |
chown -R nginx.nginx /var/www/ |
После этого можно проверять работоспособность нашего сайта и указывать в доменной зоне новый IP сайта. По окончании обновления DNS можно наслаждаться тем, насколько быстрее стал работать наш сайт — даже без дополнительной оптимизации:
Полезные ссылки:
- tools.pingdom.com — онлайн-сервис проверки скорости загрузки сайта
- just-ping.com — проверка «видимости» IP с разных локаций
- checkgzipcompression.com — включено ли gzip-сжатие?
- dnssy.com — онлайн-тест DNS
- — документация nginx
- — Веб-сервер на основе Nginx и PHP-FPM
Дополнение от 16 июля 2014 года: нам написал Роман Булах с уточнениями к данной записи. Ниже — его обоснованные замечания.
1. в конфиге php-fpm не указан open_basedir
2. необходимо запретить некоторые функции
php_admin_value[disable_functions] = dl,exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
3. Обязательно установить security.limit_extensions = .php .php3 .php4 .php5
4. В php.ini следует указать cgi.fix_pathinfo = 0Теперь nginx conf
Параметры php должны получить настройки путей к скриптам. Нужно указать расположение root точно:
1 2 3 4 5 6 7 8 |
location ~ \.php$ { # это лишнее - root /var/www/blog.net; нужно удалить fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; должен стартовать до опций fastcgi_param fastcgi_param SCRIPT_FILENAME /var/www/blog.net$fastcgi_script_name; добавить рут для скриптов с точным указанием. fastcgi_intercept_errors on; } |
Самое главное — инклудить php нужно после всех опций с локациями. Иначе, если пользователь захочет закрыть доступ, допустим, к папке config и ко всему что в ней, то это будет невозможно сделать полноценно. Сама папка будет закрыта, а файлы config.php в ней будут доступны.
Рекомендованные Романом конфигурационные файлы доступны на pastebin: blog.net.conf и fpm-www.conf. Спасибо за ценные замечания!