Установка связки Drupal 7.7, Nginx (LEMP) на Debian Squeeze/Ubuntu 11.04

Опубликовано – 12.09.2011

Оригинал:Running Drupal 7.7 On Nginx (LEMP) On Debian Squeeze/Ubuntu 11.04
Перевод:Сгибнев Михаил

 В этом руководстве показано, как заставить работать сайт под управлением Drupal 7.7 на Debian Squeeze или Ubuntu 11.04 используя nginx вместо Apache (LEMP = Linux + nginx (произноситься как «engine x») + MySQL + PHP).

 Как обычно, не дается никаких гарантий.

 1. Предварительные шаги

 Я собираюсь установить Drupal как vhost с адресом www.example.com/example.com, где document root будет находиться в каталоге /var/www/www.example.com/web.

 Вам необходимо иметь уже установленный LEMP, почитать, как это можно сделать, можно тут:

 Installing Nginx With PHP5 And MySQL Support On Debian Squeeze

 Installing Nginx With PHP5 (And PHP-FPM) And MySQL Support On Ubuntu 11.04

 Примечание для пользователей Ubuntu: все действия выполняются с правами пользователя root, поэтому вы должны использовать утилиту sudo.

 Установка APC

 APC это свободно распространяемый и открытый PHP opcode cacher для кэширования и оптимизации выполняемого кода PHP. Он похож на другие подобные продукты, такие как eAccelerator и XCache. Настоятельно рекомендуется иметь установленный один из этих продуктов для увеличения быстродействия работы ваших страниц.

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

apt-get install php-apc

 Если Вы используете PHP-FPM в качестве демона FastCGI (как в статье Installing Nginx With PHP5 (And PHP-FPM) And MySQL Support On Ubuntu 11.04), перезапустите его:

/etc/init.d/php5-fpm restart

 Если Вы используете lighttpd’s spawn-fcgi в качестве демона FastCGI (как в статье Installing Nginx With PHP5 And MySQL Support On Debian Squeeze), Вы должны остановить процесс spawn-fcgi (запущенный на порту 9000) и создать новый:

netstat -tap

 Находим PID процесса spawn-fcgi:

root@server1:~# netstat -tap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 *:sunrpc *:* LISTEN 734/portmap
tcp 0 0 *:www *:* LISTEN 2987/nginx
tcp 0 0 *:ssh *:* LISTEN 1531/sshd
tcp 0 0 *:57174 *:* LISTEN 748/rpc.statd
tcp 0 0 localhost.localdom:smtp *:* LISTEN 1507/exim4
tcp 0 0 localhost.localdom:9000 *:* LISTEN 1542/php5-cgi
tcp 0 0 localhost.localdo:mysql *:* LISTEN 1168/mysqld
tcp 0 52 server1.example.com:ssh 192.168.0.198:2462 ESTABLISHED 1557/0
tcp6 0 0 [::]:www [::]:* LISTEN 2987/nginx
tcp6 0 0 [::]:ssh [::]:* LISTEN 1531/sshd
tcp6 0 0 ip6-localhost:smtp [::]:* LISTEN 1507/exim4
root@server1:~#

 Останавливаем процесс:

kill -9 1542

 Создаем новый процесс spawn-fcgi:

/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid

 3. Устанавливаем Drupal

 У моего сайта www.example.com document root располагается в каталоге /var/www/www.example.com/web. Создаем этот каталог:

mkdir -p /var/www/www.example.com/web

 Скачиваем Drupal в document root:

cd /tmp
wget http://ftp.drupal.org/files/projects/drupal-7.7.tar.gz
tar xvfz drupal-7.7.tar.gz
cd drupal-7.7/
mv * /var/www/www.example.com/web/

 Я рекомендую сделать document root и файлы Drupal доступными для записи демону nginx который запущен от пользователя www-data и группы www-data:

chown -R www-data:www-data /var/www/www.example.com/web

 Если Вы еще не создали базу данных MySQL, то самое время это сделать (я создал базу drupal, пользователь drupal_admin и пароль drupal_admin_password):

mysqladmin -u root -p create drupal

mysql -u root -p

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON drupal.* TO 'drupal_admin'@'localhost' IDENTIFIED BY 'drupal_admin_password';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON drupal.* TO 'drupal_admin'@'localhost.localdomain' IDENTIFIED BY 'drupal_admin_password';

FLUSH PRIVILEGES;

quit;

 Затем создаем vhost конфигурацию для www.example.com:

vi /etc/nginx/sites-available/www.example.com.vhost


server {
listen 80;
server_name www.example.com example.com;
root /var/www/www.example.com/web;

if ($http_host != "www.example.com") {
rewrite ^ http://www.example.com$request_uri permanent;
}

index index.php index.html;

location = /favicon.ico {
log_not_found off;
access_log off;
}

location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}

# Make sure files with the following extensions do not get loaded by nginx because nginx would display the source code, and these files can contain PASSWORDS!
location ~* \.(engine|inc|info|install|make|module|profile|test|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)$|^(\..*|Entries.*|Repository|Root|Tag|Template)$|\.php_ {
deny all;
}

# Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}

location / {
try_files $uri $uri/ /index.php?$args;
}

location ~* \.(jpg|jpeg|png|gif|css|js|ico)$ {
expires max;
log_not_found off;
}

location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}

 Включаем vhost, создав символическую ссылку в /etc/nginx/sites-enabled/:

cd /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/www.example.com.vhost www.example.com.vhost

 Перезапускаем nginx:

/etc/init.d/nginx reload

 Прим. переводчика: В оригинальной статье с этого момента начинается галерея скриншотов с установкой Drupal, которая не включает в себя ничего необычного и поэтому мной была пропущена.

 Во время настройки Drupal, Вы можете проигнорировать вкладку .HTACCESS поскольку она генерирует правила rewrite для Apache, но мы будем делать их с помощью nginx.

 Теперь мы можем сконфигурировать vhost для nginx:

vi /etc/nginx/sites-available/www.example.com.vhost

 Заменяем строки:

[...]
location / {
try_files $uri $uri/ /index.php?$args;
}
[...]

 На:

[...]
location @nocache {
try_files $uri $uri/ /index.php?$args;
}
[...]

 И добавляем следующую новую секцию location / { }:

[...]
location / {
if ($query_string ~ ".+") {
return 405;
}
# pass requests from logged-in users to Apache
if ($http_cookie ~ "DRUPAL_UID" ) {
return 405;
} # pass POST requests to Apache
if ($request_method !~ ^(GET|HEAD)$ ) {
return 405;
}
error_page 405 = @nocache;
# do not allow browsers to cache HTML
add_header Expires "Sun, 19 Nov 1978 05:00:00 GMT";
add_header Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0";
# serve requested content from the cache if available, otherwise pass the request to Apache
try_files /cache/normal/$host/${uri}_.html /cache/perm/$host/${uri}_.css /cache/perm/$host/${uri}_.js /cache/$host/0$uri.html /cache/$host/0${uri}/index.html @nocache;
}
[...]

 Полностью наш файл конфигурации будет выглядеть так:

server {
listen 80;
server_name www.example.com example.com;
root /var/www/www.example.com/web;

if ($http_host != "www.example.com") {
rewrite ^ http://www.example.com$request_uri permanent;
}

index index.php index.html;

location = /favicon.ico {
log_not_found off;
access_log off;
}

location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}

# Make sure files with the following extensions do not get loaded by nginx because nginx would display the source code, and these files can contain PASSWORDS!
location ~* \.(engine|inc|info|install|make|module|profile|test|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)$|^(\..*|Entries.*|Repository|Root|Tag|Template)$|\.php_ {
deny all;
}

# Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}

location / {
if ($query_string ~ ".+") {
return 405;
}
# pass requests from logged-in users to Apache
if ($http_cookie ~ "DRUPAL_UID" ) {
return 405;
} # pass POST requests to Apache
if ($request_method !~ ^(GET|HEAD)$ ) {
return 405;
}
error_page 405 = @nocache;
# do not allow browsers to cache HTML
add_header Expires "Sun, 19 Nov 1978 05:00:00 GMT";
add_header Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0";
# serve requested content from the cache if available, otherwise pass the request to Apache
try_files /cache/normal/$host/${uri}_.html /cache/perm/$host/${uri}_.css /cache/perm/$host/${uri}_.js /cache/$host/0$uri.html /cache/$host/0${uri}/index.html @nocache;
}

location @nocache {
try_files $uri $uri/ /index.php?$args;
}

location ~* \.(jpg|jpeg|png|gif|css|js|ico)$ {
expires max;
log_not_found off;
}

location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}

 Перезапускаем nginx:

/etc/init.d/nginx reload

 На этом всё. Как только Ваш сайт посетит первый анонимный пользователь, Вы увидите, что nginx работает:

ls -l /var/www/www.example.com/web/cache/normal/www.example.com/


root@server1:~# ls -l /var/www/www.example.com/web/cache/normal/www.example.com/
total 36
-rw-rw-r-- 1 www-data www-data 11465 Aug 10 11:59 _.html
-rw-rw-r-- 1 www-data www-data 9619 Aug 10 11:59 nginx-413-request-entity-too-large_.html
-rw-rw-r-- 1 www-data www-data 9628 Aug 10 12:00 postfix-mail-loops-back-to-myself_.html
root@server1:~#




 Уважайте труд автора, сохраняйте копирайты.
Реклама на сайте висит не просто так и если статья Вам понравилась, с ее помощью Вы можете отблагодарить автора за проделанную работу. Спасибо!

Один комментарий в Установка связки Drupal 7.7, Nginx (LEMP) на Debian Squeeze/Ubuntu 11.04

  1. Greg:

    Сложно, и не каждый осилит, но тем кто к линуксу ближе даже приятно и привычно и намного удобнее.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*