Установка LNMP - nginx, mysql, php-fpm - Gentoo, Debian, Ubuntu, CentOSПодписка на Комментарии к "Установка LNMP - nginx, mysql, php-fpm - Gentoo, Debian, Ubuntu, CentOS"

Аватар zenon

Это руководство открывает серию материалов по установке известных систем управления содержимым (CMS) на веб-сервер Nginx. В отдельную статью необходимо выделить общую часть, которая будет одинаковой для всех CMS, написанных на PHP (грубо говоря мы сделаем тот же LAMP, только вместо громоздкого и неповоротливого веб-сервера Apache у нас будет Nginx). Задача данного руководства – установка веб-сервера Nginx, системы управления базами данных MySQL и менеджера процессов FastCGI (FPM), а также их настройка.

* Конфигурация и установка отдельных CMS будут описаны в дополнительных материалах.

Установка и запуск nginx, mysql, php-fpm (Linux Nginx Mysql Php - LNMP)

  • Все приведенные ниже инструкции сначала были выполнены.
  • Небольшие пояснения:
    • - символ # (решётка) - означает выполнение команды от root (суперпользователя)
    • - cat /path/to/some.file - означает что ниже приведено полное содержимое файла some.file, расположенного в каталоге /path/to
    • - nano /path/to/some.file - означает что надо отредактировать часть файла как указанно
    • - в процессе установки MySQL будет произведена предварительная настройка и задан пароль root

Gentoo:

# echo "dev-lang/php gd gd2 curl simplexml tokenizer dom tidy sqlite xml fpm cgi" >> /etc/portage/package.use
# emerge php nginx mysql

Вначале необходимо произвести начальную настройку MySQL:
# emerge --config dev-db/mysql

Debian:

# cat /etc/apt/sources.list.d/nginx.list
deb http://nginx.org/packages/debian/ wheezy nginx
deb-src http://nginx.org/packages/debian/ wheezy nginx
# wget http://nginx.org/keys/nginx_signing.key && cat nginx_signing.key | apt-key add -

# apt-get install nginx php5-cli php5-common php5-fpm fcgiwrap mysql-server php5-mysql php5-gd

CentOS:
Тут надо заметить, что в своих репозиториях CentOS нет nginx, поэтому добавим репозиторий:

# cat /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
# yum update

# yum install nginx mysql mysql-server php-fpm php-cli php-mysql php-gd

Настроить MySQL:
# service mysql start
# /usr/bin/mysql_secure_installation

Управление сервисами mysql, nginx, php-fpm и добавление их в автозагрузку:
Gentoo:

# /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

Debian:

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

# update-rc.d nginx defaults
# update-rc.d mysql defaults
# update-rc.d php5-fpm defaults

CentOS:

# service mysqld start
# service nginx start
# service php-fpm start

# chkconfig --levels 235 mysqld on
# chkconfig --levels 235 nginx on
# chkconfig --levels 235 php-fpm on

Сразу после установки nginx понимает только статические файлы, не исполняемые на сервере, и, если установка прошла успешно, запустив его можно проверить отображение "Welcome to Nginx!" на localhost (127.0.0.1) :

Впрочем может быть и так:

Это означает, что сервер не настроен.

Настройки по умолчанию подходят для большинства случаев и не требуют больших изменений на данном этапе. В различных дистрибутивах Linux настройки и месторасположение конфигурационных файлов могут различаться (также это замечание относится к использованию пакетов, установленных из репозиториев, отличных от основного), здесь всё зависит от поддерживающего пакет человека.
Неизменным остаётся расположение файла настроек /etc/nginx/nginx.conf. Конфигурации сайтов, дополнительные параметры добавляются в него через опцию include.
В Debian например сейчас конфигурации сайтов добавляются в стиле Apache (добавление конфигурации созданием симлинков):

...
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
...

В официальных репозиториях нет этого нововведения, и конфигурации сайтов добавляются вот так:
...
include /etc/nginx/conf.d/*.conf;
...

то есть любой файл из каталога /etc/nginx/conf.d/ с расширением .conf будет добавлен.
Если каталог /etc/nginx/conf.d - отсутствует, создайте его:
# mkdir /etc/nginx/conf.d

В include как правило присутствует конфигурация сайта по умолчанию, который как раз и выводит надпись "Welcome to nginx!" при обращении к localhost (127.0.0.1):
Debian/Ubuntu - /etc/nginx/sites-enabled/default
Gentoo/CentOS - /etc/nginx/conf.d/default
Больше этот файл не нужен - удалите его.

Права на каталог сайтов
Создаем (если не существует) каталог для сайтов и устанавливаем права:

# mkdir -p /var/www/localhost
# chmod -R a-rwx,u+rwX,g+rX /var/www
# chown www-data:www-data -R /var/www

Владельцем каталога сайтов должен быть пользователь, от которого запущен и работает вэб-сервер. В Debian и Ubuntu это www-data, в Gentoo, CentOS - пользователь nginx. В конфигурации за это отвечает директива user (nginx.conf):
user  www-data;
worker_processes  4;
...
...

При переносе сайта, а также чтобы был доступ к содержимому сайта у пользователей, входящих в группу www-data необходимы корректные права на содержимое:
Права на каталоги 775, на файлы 664.

# find /var/www -type d -exec chmod 775 {} +
# find /var/www -type f -exec chmod 664 {} +

И добавить себя в группу www-data.

# usermod -a -G www-data username

Стандартная конфигурация nginx (/etc/nginx/nginx.conf)

# Документация http://nginx.org/ru/docs/ngx_core_module.html
# Пользователь от которого работает вэб-сервер
# user nginx;
user www-data;
# Количество рабочих процессов = количество ядер*2 /рекомендуется
worker_processes 4;
pid /var/run/nginx.pid;

events {
   # Максимальное число соединений, которое одновременно
   # может открыть рабочий процесс
   worker_connections 768;
}

http {
   # Используем sendfile, но осторожно, если надо отдавать большие файлы,
   # то sendfile случается вредит
   sendfile on;
   # Ограничиваем размер сегмента отправляемой за одну блокируемую отдачу
   sendfile_max_chunk  128k;
   # Буфер отдачи который используется для обрабатываемых данных
   postpone_output  1460;
   # Размер хеша для доменных имен.
   server_names_hash_bucket_size 64;
   # Размер данных принимаемых post запросом
   client_max_body_size 15m;
   tcp_nopush on;
   tcp_nodelay on;
   keepalive_timeout 65;
   types_hash_max_size 2048;
   # Не говорим врагу версию nginx
   server_tokens off;
   include /etc/nginx/mime.types;
   default_type application/octet-stream;
   # Настройки логирования
   access_log /var/log/nginx/access.log;
   error_log /var/log/nginx/error.log;
   # Настройки компрессии
   gzip on;
   gzip_disable "msie6";
   gzip_vary on;
   gzip_proxied any;
   gzip_comp_level 6;
   gzip_buffers 16 8k;
   gzip_http_version 1.1;
   gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

   include /etc/nginx/conf.d/*.conf;
}

Подключение процесс менеджера php-fpm к веб-серверу
* Важно - дополнительные пояснения - FastCGI (PHP FPM) для Nginx
* Связку nginx и php-fpm настраиваем на работу через unix сокет
Создадим новую конфигурацию для localhost:

# nano /etc/nginx/conf.d/localhost.conf
server {
   server_name localhost;
   # listen 192.168.0.120:80;
   listen 127.0.0.1:80;
   root /var/www/localhost;
   index index.php;

   location ~ [^/]\.php(/|$) {
      fastcgi_split_path_info ^(.+?\.php)(/.*)$;
      if (!-f $document_root$fastcgi_script_name) {
         return 404;
      }
      # fastcgi_pass 127.0.0.1:9000;
      fastcgi_pass unix:/var/run/php5-fpm.sock;
      fastcgi_index index.php;
      include fastcgi_params;
   }
}

и тестовый файл php в корне
# nano /var/www/localhost/index.php
<?php
phpinfo();
?>

Отредактируем конфигурацию php-fpm:
Gentoo:

# nano /etc/php/fpm-php5.4/php-fpm.conf

Debian/Ubuntu:
# nano /etc/php5/fpm/pool.d/www.conf

CentOS:
# nano /etc/php-fpm.d/www.conf

Отредактируем в этом файле следующие переменные:
listen:

...
; Note: This value is mandatory.
; listen = 127.0.0.1:9000
listen = /var/run/php5-fpm.sock
...

user, group:
* В CentOS и Gentoo - nginx, Debian/Ubuntu - www-data
; 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 = www-data
group = www-data

* в этом файле комментариями является любой текст после символа ";" (точка с запятой).
После чего перегружаем nginx и php-fpm.
Открываем браузер и заходим на localhost, в результате мы должны увидеть тестовую страницу PHP:


.
.
Версия Nginx на момент написания - стабильная - nginx/1.4.1, но это в репозитории самого nginx, в репозиториях дистрибутивов версии более ранние, и поэтому могут возникнуть небольшие нестыковки, например в openSUSE 12.3 - версия nginx/1.2.9 и это руководство почти полностью подходит, но необходимо использовать /etc/nginx/fastcgi_params отсюда.
.
.
.
.
Ссылки:
nginx: http://nginx.org/ru/
nginx Wiki: http://wiki.nginx.org/NginxRu
PHP: http://www.php.net/
PHP-FPM: http://php-fpm.org/
MySQL: http://www.mysql.com/

Продолжение в ближайшие дни, а именно конфигурация и установка для:
Wordpress, Joomla, Drupal, ....

Похожие материалы:
Аватар Victor

Настроил, но php-fpm не вызывается
В логах php-fpm пусто

Аватар zenon

А в логах nginx?
Вопрос надо задавать более подробно.
ы. В статье ссылку дал на правильный fastcgi_params
его можно назвать например fastcgi_params1 и в конфиге сделать вот так:

...
...
      include fastcgi_params1;
      fastcgi_index index.php;
      fastcgi_pass unix:/var/run/php5-fpm.sock;
...
...

Вообще если следовать данному мануалу, то не может не получиться, специально проверял всё.
Аватар Victor

Спасибо за ответ.
Делал все как в статье.
У меня CentOS 6.4, nginx 1.4.3, php-fpm 5.5.4
в логах пусто, судя по http заголовкам php вызывается, но скрипт не передается.

Но двойной проверки я обнаружил что в файле fastcgi_params отсутствует строка:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

После исправления все заработало.
Спасибо

Аватар Nige1ist

Вот эта часть конфига:

   location ~ [^/]\.php(/|$) {
      fastcgi_split_path_info ^(.+?\.php)(/.*)$;
      if (!-f $document_root$fastcgi_script_name) {
         return 404;
      }
      # fastcgi_pass 127.0.0.1:9000;
      fastcgi_pass unix:/var/run/php5-fpm.sock;
      fastcgi_index index.php;
      include fastcgi_params;
   }

Не работает. Конфиг из этой статьи работает.
Аватар zenon

Nige1ist, всё здесь работает, внимательнее на предидущий пост посмотри, может у тебя как раз fastcgi_params другой.
Конфигурационные файлы без проверки не выкладываю.

Аватар Nige1ist

zenon написал:

Nige1ist, всё здесь работает, внимательнее на предидущий пост посмотри, может у тебя как раз fastcgi_params другой.

Конфигурационные файлы без проверки не выкладываю.


Ну не работает этот конфиг, не работает.
Аватар Nige1ist

zenon написал:

Смотри:
/etc/nginx/fastcgi_params

параметр cgi.fix_pathinfo в /etc/php5/fpm/php.ini

И еще раз - FastCGI (PHP FPM) для Nginx


Каюсь - грешен. Пропустил этот момент. Посчитал что он рекомендуется, но не обязателен к исполнению.
Аватар Nige1ist

Возникла затруднительная ситуация. Есть ли шанс прикрутить lightsquid к nginx? По умолчанию LightSquid работает в связке Apache. Для Apache идет такая вот настройка:

Alias   /lightsquid/    /usr/lib/cgi-bin/lightsquid/

<Location "/lightsquid/">
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0
# Before uncommenting the following lines please put IP address
# of your computer in the Allow line
        # Allow from REPLACE-WITH.YOUR-HOST.IP-ADDRESS
# IPv6 addresses work only with apache2
        Allow from ::1/128
</Location>

Которая хранится в:
/etc/apache2/conf.d/lightsquid
Аватар zenon

Ну мы тут про php разговариваем, а lightsquid это cgi.
У меня вот так все cgi работают - http://www.linuxru.org/tips/163 (не смотри, что для Gentoo написано, смысл тот-же).

Аватар Nigelist

Тут возник вопрос, можно ли подключить сторонний модуль *.so в конфигурацию nginx? А вообще, хочу прикрутить веб-интерфейс 1С:Предприятие к nginx. Пример из Apache'вского httpd.conf:

LoadModule _1cws_module "/opt/1C/v8.2/i386/wsap22.so"

# 1c publication
Alias "base" "/var/www/base/"
<Directory "/var/www/base/">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
    SetHandler 1c-application
    ManagedApplicationDescriptor "/var/www/base/default.vrd"
</Directory>

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