Gentoo + Nginx + Drupal7

Установка web-сервера LEMP (Linux, Nginx, MySQL, Php-fpm) + Drupal7 на основе Gentoo Linux.

Предположим, что вы уже установили по хендбуку систему (без иксов, разумеется) и можете работать с сервером по протоколу SSH.

Подготовительные операции

Глобальные настройки:

# /etc/portage/make.conf
...
USE="-X -gtk -xmp -gpm -ipv6 -bluetooth -apache -apache2 -wifi -systemd -alsa -sqlite \
logrotate php mysql mysqli gd gd2 curl simplexml tokenizer dom tidy xml fpm cgi gzip fcgi fcgiwrap ftp"
LINGUAS="en"
LANG="en_US.UTF-8"
EMERGE_DEFAULT_OPTS="--ask --verbose --usepkg"
PHP_TARGETS="php5-5"
PHP_INI_VERSION="production"
NGINX_MODULES_HTTP="access auth_basic autoindex browser charset empty_gif fastcgi geo geoip gzip \
limit_conn limit_req map memcached proxy push referer rewrite scgi split_clients ssi upstream_ip_hash userid uwsgi gunzip gzip_static"

Модули для NGINX сугубо индивидуально, в приведенном примере модулей достаточно для большинства случаев.

Флаги:

# /etc/portage/package.use
...
dev-lang/php sockets truetype pdo xmlreader xmlrpc xmlwriter xpm zip production
dev-db/mysql -* community ssl latin1
dev-db/phpmyadmin setup vhosts
net-ftp/proftpd openssl clamav

Обновляем дерево портэжей:

emerge eix
eix-update
eix-sync

Что бы не разрастались логи пригодится ротация:

emerge logrotate

Можно установить для удобства файловый менеджер Midnight Commander:

emerge app-misc/mc

Установка и конфигурация Nginx + MySQL + PHP

Установим Nginx + MySQL + PHP:

emerge php nginx mysql

Это долгая процедура, дольше всего компилится php.

Запускаем сервисы:

# /etc/init.d/nginx start
# /etc/init.d/mysql start
# /etc/init.d/php-fpm start

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

# rc-update add nginx default
# rc-update add mysql default
# rc-update add php-fpm default

После старта nginx при наборе в браузере IP-адреса вашего сервера (или домена, привязанного к этому IP) должно быть приветствие Welcome to Nginx!
Если же вы видите 403 Forbidden - значит сервер не сконфигурирован, необходимо отредактировать конфиг /etc/nginx/nginx.conf (см. ниже "Конфигурация Nginx").

Настраиваем MySQL:

emerge --config dev-db/mysql

устанавливаем пароль для рута mysql.

Директория для сайтов

Сайты у нас будут находится в директории /var/www/домен
Примечание: директорию /var/www можно вынести на отдельный раздел жесткого диска при первичной установке системы.
Конфиги сайтов - в /etc/nginx/sites-available
Работающие сайты - в /etc/nginx/sites-enabled
В sites-enabled будут симлинки на конфиги из sites-available (удобно, если у вас несколько сайтов). Для отключения сайта надо будет всего лишь удалить симлинк.

Создаем директорию:

mkdir /var/www

Даем nginx права на директорию:

chmod 755 /var/www && chown nginx:nginx /var/www

Конфигурация Nginx

# /etc/nginx/nginx.conf
user nginx nginx;
worker_processes 2; # это значение равно колличеству ядер процессора в системе.
pid /var/run/nginx.pid;
error_log /var/log/nginx/error_log info;
events {
worker_connections 1024; # значение 1024 по умолчанию, если на сервере достаточно оперативки, то можно выставить 4096 или auto.
use epoll;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main
'$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
client_header_timeout 10m;
client_body_timeout 10m;
send_timeout 10m;
connection_pool_size 256;
client_header_buffer_size 1k;
large_client_header_buffers 4 2k;
request_pool_size 4k;
server_names_hash_bucket_size 64;
gzip on;
gzip_min_length 1100;
gzip_buffers 4 8k;
gzip_types text/plain;
output_buffers 1 32k;
postpone_output 1460;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 75 20;
ignore_invalid_headers on;
index index.html;
include /etc/nginx/sites-enabled/*.conf;
}

Для удобства создаем пару темплейтов:

mkdir /etc/nginx/templates

Темплейт подключения PHP (будет использоваться на не друпал-сайтах, например для форума phpBB):

# /etc/nginx/templates/php
index index.html index.php;
location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        if (!-f $document_root$fastcgi_script_name) {
            return 404;
        }
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        include fastcgi.conf;
}
# запрещаем доступ к файлам .htaccess и .htpassword
location ~ /\.ht {
        deny all;
}
location = /favicon.ico {
        log_not_found off;
        access_log off;
}
location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
}

# кеширование статик-файлов браузером, устанавливаем значение в часах или max (максимальное):
# location ~* ^.+\.(css|rss|gif|jpeg|jpg|js|txt|png|tif|tiff|ico|jng|bmp|doc|pdf|rtf|xls|ppt|jardiff|rar|rpm|swf|sit|zip|bin|exe|dll|deb|cur)$ {
# expires 168h;
# log_not_found off;
# }

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

Темплейт подключения Drupal7:

# /etc/nginx/templates/drupal
gzip_static on;
location ~* \.(txt|log)$ {
allow 192.168.0.0/16;
deny all;
}
location ~ \..*/.*\.php$ {
return 403;
}
location ~ ^/sites/.*/private/ {
return 403;
}
location ~ (^|/)\. {
return 403;
}
location / {
try_files $uri @rewrite;
}
location @rewrite {
# Для Drupal 6:
# rewrite ^/(.*)$ /index.php?q=$1;
# Для Drupal 7:
rewrite ^ /index.php;
}
# Для Drupal 6:
# location ~ ^/sites/.*/files/imagecache/ {
# Для Drupal 7:
location ~ ^/sites/.*/files/styles/ {
try_files $uri @rewrite;
}

Конфигурация PHP-FPM

Редактируем php-fpm.conf

# /etc/php/fpm-php5.5/php-fpm.conf
...
; Note: This value is mandatory.
; listen = 127.0.0.1:9000
listen = /var/run/php5-fpm.sock
...
; Set permissions for unix socket, if one is used. In Linux, read/write
; permissions must be set in order to allow connections from a web server. Many
; BSD-derived systems allow connections regardless of permissions.
; Default Values: user and group are set as the running user
;                 mode is set to 0666
listen.owner = nginx
listen.group = nginx
listen.mode = 0666
...
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
user = nginx
group = nginx
...
; The number of child processes created on startup.
; Note: Used only when pm is set to 'dynamic'
; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.start_servers = 20
...

Отключаем уязвимость php:

# /etc/php/fpm-php5.5/php.ini
cgi.fix_pathinfo=0

Конфигурация vhosts

По умолчанию, vhosts настроено для работы с веб-сервером apache. Исправляем:

# /etc/vhosts/webapp-config
...
# сайты у нас располагаются в /var/www/домен
vhost_root="/var/www/${vhost_hostname}"
...
vhost_server="nginx"
...

Перезапустим сервисы:

/etc/init.d/nginx restart && /etc/init.d/php-fpm restart

Конфигурирование сервера завершено, можно приступать к размещению сайта.

Конфигурирование сайта

Рассмотрим на примере домена linuxpro.ru

Создаем необходимые директории для файлов:

mkdir -p /var/www/linuxpro.ru/{htdocs,private,log,cgi-bin,backup}
  • /var/www/linuxpro.ru/htdocs - тут будет установлен Drupal, это основная рабочая директория сайта.
  • /var/www/linuxpro.ru/private - для личных (приватных) файлов. Используется, если в настройках друпала (/admin/config/media/file-system) выбрана опция Метод загрузки по умолчанию: Закрытый — передачей файлов управляет Drupal.
  • /var/www/linuxpro.ru/log - директория для логов сайта.
  • /var/www/linuxpro.ru/cgi-bin - для cgi-скриптов (на всякий случай).
  • /var/www/linuxpro.ru/backup - для бекапов.

Связку nginx и php-fpm настраиваем на работу через unix сокет.
Создаем конфиг для сайта:

# /etc/nginx/sites-available/linuxpro.ru.conf
server {
server_name linuxpro.ru;
root /var/www/linuxpro.ru/htdocs;
access_log /var/www/linuxpro.ru/log/access.log;
error_log /var/www/linuxpro.ru/log/error.log;
include /etc/nginx/templates/php;
include /etc/nginx/templates/drupal;
}

Включаем сайт (создаем симлинк):

ln -s /etc/nginx/sites-available/linuxpro.ru.conf /etc/nginx/sites-enabled/linuxpro.ru.conf

После редактирования конфигов не забываем применение конфигов:

/etc/init.d/nginx reload

Проверим работу сайта. Создадим файл test.php

# nano /var/www/linuxpro.ru/htdocs/test.php
<?php
phpinfo
();
?>

Устанавливаем права на файл:

chmod 644 /var/www/linuxpro.ru/htdocs/test.php && chown nginx:nginx /var/www/linuxpro.ru/htdocs/test.php

Пробуем открыть в браузере: linuxpro.ru/test.php

php

Если PHP работает, то удаляем с сервера файл test.php. Если не работает - смотрим логи nginx и сайта - ищем где ошибка.

Создание базы данных

Базу данных и пользователя создадим в командной строке (при желании можно поставить пакет phpmyadmin).

Создадим, к примеру, пользователя drupaluser с паролем 123456 и базу данных drupal, на которую у пользователя drupaluser будут полные привелегии.

mysql -u root -p
mysql> create database drupal;
mysql> grant usage on *.* to drupaluser@localhost identified by '123456';
mysql> grant all privileges on drupal.* to drupaluser@localhost;
mysql> exit;

Проверяем:

$ mysql -u drupaluser -p'123456' drupal

Если надо удалить базу данных:

mysql> drop database drupal;

Drupal больше всего нагружает базу данных, поэтому не забываем оптимизировать конфигурацию mysql (это можно сделать и после установки drupal'а).

После редактирования конфигов необходим рестарт mysql:

# service mysql restart

Установка Drupal

Переходим в директорию сайта:

cd /var/www/linuxpro.ru/htdocs

Скачиваем друпал с официального сайта:

wget http://ftp.drupal.org/files/projects/drupal-7.28.tar.gz

Распаковываем архив:

tar -xzvf drupal-*.tar.gz

Удаляем архив:

rm drupal-*.tar.gz

Распакованный архив у нас оказался в директории htdocs/drupal - перемещаем на уровень выше:

mv drupal-*/* ./
mv drupal-*/.gitignore ./
mv drupal-*/.htaccess ./

Удаляем пустую директорию:

rmdir drupal-*

Устанавливаем права:

chmod -R a-rwx,u+rwX,g+rX /var/www/linuxpro.ru/htdocs && chown nginx:nginx -R /var/www/linuxpro.ru/htdocs

Если вы устанавливаете друпал не из оф.архива, а переносите готовую установку с другого компьютера, то (возможно) потребуется правка разрешений для всех файлов (права для директорий 755, для файлов 644):

find /var/www/linuxpro.ru/htdocs -type d -exec chmod 775 {} +
find /var/www/linuxpro.ru/htdocs -type f -exec chmod 664 {} +

Даем разрешение на запись для sites/default:

chmod a+w sites/default

Создаем директорию для публичных файлов:

mkdir sites/default/files
chmod a+w sites/default/files

Копируем файл настроек и временно даем права на запись:

cp sites/default/default.settings.php sites/default/settings.php
chmod a+w sites/default/settings.php

Выполняем установку Drupal /install.php

После завершения инсталяции drupal убираем права на запись для settings.php

chmod go-w sites/default/settings.php
chmod go-w sites/default

Что дальше ?

Дальше, при необходимости, можно установить пакеты:
net-ftp/proftpd - для доступа к сайтам по FTP,
app-admin/webmin - административный веб-интерфейс (бывает полезен, если по каким то причинам отвалился доступ по SSH),
net-firewall/iptables - файрволл,
app-antivirus/clamav - антивирус,
app-admin/sshguard - защита от аттак через ssh,
и так далее, в зависимости от назначения вашего сервера.

Комментарии
Аватар пользователя Гость

Какие еще пакеты желательно установить для оптимизации работы Друпала ?

Для друпала разве что еще Postfix можно установить.
Самому друпалу больше ничего не требуется. А всё остальное - у каждого индивидуально.

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