Задача была такая: перенести свой блог, сделанный на WordPress на свой домашний сервер. Все в целях эксперимента. Установку Nginx, PHP (не забудьте установить php5-fpm), MySQL описывать не буду – это все просто, при установке по умолчанию все должно работать. Еще нам понадобятся бэкапы сайта и его базы данных. Их можно получить на
Разархивируем файлы сайта в папку на новом сервере, например в /usr/local/www/bdb.net.ua.
Теперь настроим файлы Nginx. Редактируем файл /etc/nginx/nginx.conf:
user www-data;
worker_processes 1;
pid /var/run/nginx.pid;
events {
worker_connections 256;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
server_tokens off;
client_max_body_size 8m;
reset_timedout_connection on;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
index index.php index.html index.htm;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
upstream php5-fpm {
keepalive 8;
server unix:/var/run/php5-fpm.sock;
}
# include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Опция worker_processes у меня равна 1, потому, что на сервере один процессор.
Создаем конфигурацию для WordPress — /etc/nginx/conf.d/wordpress.conf:
# WordPress single blog rules.
# Designed to be included in any server {} block.
# This order might seem weird - this is attempted to match last if rules below fail.
# http://wiki.nginx.org/HttpCoreModule
location / {
try_files $uri $uri/ /index.php?$args;
}
# Add trailing slash to */wp-admin requests.
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
# Directives to send expires headers and turn off 404 error logging.
location ~* ^.+.(xml|ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
access_log off; log_not_found off; expires max;
}
# Uncomment one of the lines below for the appropriate caching plugin (if used).
#include global/wordpress-wp-super-cache.conf;
#include global/wordpress-w3-total-cache.conf;
# Pass all .php files onto a php-fpm/php-fcgi server.
location ~ .php$ {
# Zero-day exploit defense.
# http://forum.nginx.org/read.php?2,88845,page=3
# Won't work properly (404 error) if the file is not stored on this server, which is
# entirely possible with php-fpm/php-fcgi.
# Comment the 'try_files' line out if you set up php-fpm/php-fcgi on another machine. # And then cross your fingers that you won't get hacked.
try_files $uri =404;
fastcgi_split_path_info ^(.+.php)(/.+)$;
#NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_intercept_errors on;
fastcgi_ignore_client_abort on;
fastcgi_keep_conn on;
fastcgi_pass php5-fpm;
}
Добавляем набор ограничений — /etc/nginx/conf.d/restrictions.conf:
# Global restrictions configuration file.
# Designed to be included in any server {} block.</p>
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
# Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
# Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban)
location ~ /. {
deny all;
}
# Deny access to any files with a .php extension in the uploads directory
# Works in sub-directory installs and also in multisite network
# Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban)
location ~* /(?:uploads|files)/.*.php$ {
deny all;
}
По умолчанию в Nginx уже есть файл начальной конфигурации /etc/nginx/sites-available/default, мы заменим его содержимое на такое (не забывайте подставлять свои пути к паке с файлами сайта):
server {
server_name localhost;
root /usr/local/www/bdb.net.ua;
access_log /var/log/nginx/bdb.info-access.log;
error_log /var/log/nginx/bdb.info-error.log;
include conf.d/restrictions.conf;
include /usr/local/www/bdb.net.ua/nginx.conf;
include conf.d/wordpress.conf;
}
Стоит заметить, что на этот файл существует симлинк в папке /etc/nginx/sites-enabled/, иначе конфигурация работать не будет.
Создадим файл:
touch /usr/local/www/bdb.net.ua/nginx.conf
Он понадобится для функционирования очень полезного плагина для WordPress — W3 Total Cache, который рекомендуется к установке.
Не забываем установить владельца – www-data и группу-владельца — www-data на папку с сайтом. Разрешения на папку и файлы я установил – 755.
Перезагрузить конфигурационный файл Nginx можно так:
sudo nginx -s reload
Теперь импортируем базу данных. Запускаем MySQL:
mysql -uroot -p<password>
Создаем базу:
CREATE DATABASE wordpress;
Выходим из MySQL и импортируем базу:
mysql -uroot -p<password> wordpress < /path/to/base/site.sql
Теперь нужно поменять в базе данных URL сайта. Запускаем MySQL:
mysql -uroot -p<password>
Последовательно выполните такие команды:
USE wordpress;
UPDATE wp_options SET option_value = REPLACE(option_value, 'http://старый_домен.com', 'http://новый_домен.com') WHERE option_name = 'home' OR option_name = 'siteurl';
UPDATE wp_posts SET guid = REPLACE(guid, 'http://старый_домен.com', 'http://новый_домен.com');
UPDATE wp_posts SET post_content = REPLACE(post_content, 'http://старый_домен.com', 'http://новый_домен.com');
Первая команда у меня не сработала, пришлось заменить такой:
UPDATE wp_options SET option_value = 'http://bdb.net.ua/' WHERE option_name = 'home' OR option_name = 'siteurl';
После этого я беспрепятственно зашел в админку сайта.
Автор: Filosof8