Оригинал: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:~#
[ad name=»Google Adsense»]
Уважайте труд автора, сохраняйте копирайты.
Реклама на сайте висит не просто так и если статья Вам понравилась, с ее помощью Вы можете отблагодарить автора за проделанную работу. Спасибо!
Сложно, и не каждый осилит, но тем кто к линуксу ближе даже приятно и привычно и намного удобнее.