Tuesday, December 13, 2011

Установка Ngnix с PHP (и PHP-FPM) и MySQL на CentOS 6

Nginx (произносится как "engine x") является свободным, открытым исходным кодом, высокопроизводительный HTTP-сервер. Nginx известен своей стабильностью, богатым набором функций, простая настройка и низким потреблением ресурсов. В этом руководстве показано, как можно установить Nginx на CentOS 6.0 сервер с поддержкой PHP5 (через PHP-FPM) и MySQL поддержку.

1 Предварительные замечания

В этом руководстве используется имя хоста server1.example.com с IP адресом 192.168.0.100. Эти параметры могут отличаться от ваших, поэтому вам придется заменить их в случае необходимости.

2 Подключение дополнительных репозиториев

PHP-FPM отсутствует в официальных репозиториях CentOS, но из репозитория Remi RPM, которая зависит от EPEL хранилище; мы можем включить оба хранилища следующим образом:



1.rpm --import https://fedoraproject.org/static/0608B895.txt

2.rpm -ivh http://download.fedora.redhat.com/pub/epel/6/i386/epel-release-6-5.noarch.rpm

1.rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
2.rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

1.yum install yum-priorities
Отредактируйте /etc/yum.repos.d/epel.repo

1.nano /etc/yum.repos.d/epel.repo
измените приоритет на 10;

01.[epel]
02.name=Extra Packages for Enterprise Linux 6 - $basearch
03.#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
04.mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
05.failovermethod=priority
06.enabled=1
07.priority=10
08.gpgcheck=1
09.gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
10.[...]
Сделайте тоже сомое с /etc/yum.repos.d/remi.repo изменив приоритет на 10, и установите enabled на 1:

1.nano /etc/yum.repos.d/remi.repo

01.[remi]
02.name=Les RPM de remi pour Enterprise Linux $releasever - $basearch
03.#baseurl=http://rpms.famillecollet.com/enterprise/$releasever/remi/$basearch/
04.mirrorlist=http://rpms.famillecollet.com/enterprise/$releasever/remi/mirror
05.enabled=1
06.priority=10
07.gpgcheck=1
08.gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
09.failovermethod=priority
10. 
11.[remi-test]
12.name=Les RPM de remi en test pour Enterprise Linux $releasever - $basearch
13.#baseurl=http://rpms.famillecollet.com/enterprise/$releasever/test/$basearch/
14.mirrorlist=http://rpms.famillecollet.com/enterprise/$releasever/test/mirror
15.enabled=0
16.gpgcheck=1
17.gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

3 Установка MySQL 5

Сначала установите MySQL 5 следующим образом:

1.yum install mysql mysql-server
Затем мы создаем в запуске системы связи для MySQL (для того что бы MySQL запускался автоматически при загрузке системы) и запустите сервер MySQL:

1.chkconfig --levels 235 mysqld on
2./etc/init.d/mysqld start
Теперь убедитесь, что сеть включена и работает.

1.netstat -tap | grep mysql
Netstat должен показать что-то вроде этого:

1.[root@server1 ~]# netstat -tap | grep mysql
2.tcp        0      0 *:mysql                     *:*                         LISTEN      2302/mysqld
3.[root@server1 ~]#
Если этого не произойдет, нужно отредактировать /etc/my.cnf и закомментируйте опцию пропуска сетей:

1.nano /etc/my.cnf

1.[...]
2.#skip-networking
3.[...]
И перезапустить MySQL сервер: 

1.service mesqld restart
Настрооем MySQL:
Установим пароль для пользователя root (в противном случае любой желающий может получить доступ к MySQL базе данных!):

1.mysql_secure_installation

01.[root@server1 ~]# mysql_secure_installation
02. 
03. 
04. 
05. 
06.NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
07.      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!
08. 
09. 
10.In order to log into MySQL to secure it, we'll need the current
11.password for the root user.  If you've just installed MySQL, and
12.you haven't set the root password yet, the password will be blank,
13.so you should just press enter here.
14. 
15.Enter current password for root (enter for none): <-- ENTER
16.OK, successfully used password, moving on...
17. 
18.Setting the root password ensures that nobody can log into the MySQL
19.root user without the proper authorisation.
20. 
21.Set root password? [Y/n] <-- ENTER
22.New password: <-- ПАРОЛЬ
23.Re-enter new password: <-- ПАРОЛЬ
24.Password updated successfully!
25.Reloading privilege tables..
26. ... Success!
27. 
28. 
29.By default, a MySQL installation has an anonymous user, allowing anyone
30.to log into MySQL without having to have a user account created for
31.them.  This is intended only for testing, and to make the installation
32.go a bit smoother.  You should remove them before moving into a
33.production environment.
34. 
35.Remove anonymous users? [Y/n] <-- ENTER
36. ... Success!
37. 
38.Normally, root should only be allowed to connect from 'localhost'.  This
39.ensures that someone cannot guess at the root password from the network.
40. 
41.Disallow root login remotely? [Y/n] <-- ENTER
42. ... Success!
43. 
44.By default, MySQL comes with a database named 'test' that anyone can
45.access.  This is also intended only for testing, and should be removed
46.before moving into a production environment.
47. 
48.Remove test database and access to it? [Y/n] <-- ENTER
49. - Dropping test database...
50. ... Success!
51. - Removing privileges on test database...
52. ... Success!
53. 
54.Reloading the privilege tables will ensure that all changes made so far
55.will take effect immediately.
56. 
57.Reload privilege tables now? [Y/n] <-- ENTER
58. ... Success!
59. 
60.Cleaning up...
61. 
62. 
63. 
64.All done!  If you've completed all of the above steps, your MySQL
65.installation should now be secure.
66. 
67.Thanks for using MySQL!
68. 
69. 
70.[root@server1 ~]#

4 Установка Nginx

Nginx доступен в виде пакета для CentOS 6.0 (от EPEL), который можно установить следующим образом:

1.yum install nginx
Затем мы создаем связь для Ngnix в автозапуске и запустим его:

1.chkconfig --levels 235 nginx on
2./etc/init.d/nginx start
Введите IP-адрес вашего веб-сервера или хоста в браузере (например, http://192.168.0.100), и вы должны увидеть страницу приветствия Nginx

Установка PHP 5 c PHP-FPM

Мы можем сделать работу PHP5Nginx через PHP-FPM (PHP-FPM (FastCGI Process Manager) является альтернативой PHP FastCGI реализации с некоторыми дополнительными функциями полезна для сайтов любого размера, особенно cайтов с большой нагрузкой). Мы можем установить PHP-FPM вместе с PHP-CLI в PHP5 и некоторые модули, как PHP-MySQL которой вам нужно, если вы хотите использовать MySQL следующим образом:

1.yum install php-fpm php-cli php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-eaccelerator php-magickwand php-magpierss php-mbstring php-mcrypt php-mssql php-shout php-snmp php-soap php-tidy
Затем откройте /etc/php.ini и установите cgi.fix_pathinfo=0:

1.nano /etc/php.ini

01.[...]
02.; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
03.; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
04.; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
05.; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting
06.; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
07.; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
08.; http://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo
09.cgi.fix_pathinfo=0
10.[...]
В дополнение к этому, для того, чтобы избежать ошибки, такие как: 

1.[08-Aug-2011 18:07:08] PHP Warning: phpinfo(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/Moscow' for 'CEST/2.0/DST' instead in /usr/share/nginx/html/info.php on line 2
В /var/log/php-fpm/www-error.log при вызове PHP-скрипта в вашем браузере, вы должны установить date.timezone в /etc/php.ini

1.nano /etc/php.ini

1.[...]
2.[Date]
3.; Defines the default timezone used by the date functions
4.; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
5.date.timezone = "Europe/Moscow"
6.[...]
Вы можете узнать правильный часовой пояс для вашей системы, выполните: 

1.cat /etc/sysconfig/clock

1.[root@server1 nginx]# cat /etc/sysconfig/clock
2.ZONE="Europe/Moscow"
3.[root@server1 nginx]#
Затем мы создаем связь для php-fpm в автозапуске и запустим его:

1.chkconfig --levels 235 php-fpm on
2./etc/init.d/php-fpm start
PHP-FPM является демоном (с сценарием инициализации /etc/init.d/php-fpm), который работает FastCGI сервером через порт 9000.

6 Настройка Ngnix

Nginx конфигурации находится в /etc/nginx/nginx.conf который мы открываем сейчас:

1.nano /etc/nginx/nginx.conf
Увеличить количество рабочих процессов и установить keepalive_timeout до разумного значения:

1.[...]
2.worker_processes  5;
3.[...]
4.    keepalive_timeout  2;
5.[...]
Виртуальные хосты определяются в сервере {} контейнеры. Давайте изменим умолчанию виртуальный хост (в /etc/nginx/nginx.conf) следующим образом: 

01.[...]
02.    server {
03.        listen       80;
04.        server_name  _;
05. 
06.        #charset koi8-r;
07. 
08.        #access_log  logs/host.access.log  main;
09. 
10.        location / {
11.            root   /usr/share/nginx/html;
12.            index  index.php index.html index.htm;
13.        }
14. 
15.        error_page  404              /404.html;
16.        location = /404.html {
17.            root   /usr/share/nginx/html;
18.        }
19. 
20.        # redirect server error pages to the static page /50x.html
21.        #
22.        error_page   500 502 503 504  /50x.html;
23.        location = /50x.html {
24.            root   /usr/share/nginx/html;
25.        }
26. 
27.        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
28.        #
29.        #location ~ \.php$ {
30.        #    proxy_pass   http://127.0.0.1;
31.        #}
32. 
33.        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
34.        #
35.        location ~ \.php$ {
36.            root           /usr/share/nginx/html;
37.            fastcgi_pass   127.0.0.1:9000;
38.            fastcgi_index  index.php;
39.            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
40.            include        fastcgi_params;
41.        }
42. 
43.        # deny access to .htaccess files, if Apache's document root
44.        # concurs with nginx's one
45.        #
server_name _; делает этот виртуальный хост по умолчанию всеохватывающий (конечно, вы можете также указать имя хоста здесь, как www.example.com). В location, я добавил index.php на index строки. root /usr/share/nginx/html;, означает, что документ корень директории /usr/share/nginx/html. Важной частью для PHP является расположение ~ \. PHP $ {} строки. Уберите его, чтобы включить его. Изменение root линии в корневом каталоге веб-сайта (например, root /usr/share/nginx/html;). Пожалуйста, убедитесь, что вы изменили fastcgi_param линии fastcgi_param SCRIPT_FILENAME $ DOCUMENT_ROOT $ fastcgi_script_name, потому что в противном случае интерпретатор PHP не найдете скрипт, который вы вызываете в Вашем браузере ($ DOCUMENT_ROOT переводится в usr/share/nginx/html, потому что это то, что мы ставим корнем документа). 
PHP-FPM прослушивает порт 9000 на 127.0.0.1 по умолчанию, поэтому мы говорим Nginx для подключения к 127.0.0.1:9000 с линией fastcgi_pass 127.0.0.1:9000;. Это также можно сделать PHP-FPM использовать сокет Unix - описано это в главе 7.
Теперь сохраните файл и перезагрузите Nginx:

1./etc/init.d/nginx restart
Создайте следующий файл PHP в корневой документ /usr/share/nginx/html/
nano /usr/share/nginx/html/info.php



<?php

// Show all information, defaults to INFO_ALL
phpinfo();

?>
Теперь мы вызываем этот файл в браузере (например, http://192.168.0.100/info.php):

Как видите, PHP5 работает, и работает через FPM / FastCGI, как показано на линии API Server. Если вы прокрутите дальше вниз, вы увидите все модули, которые уже включены в PHP5, включая модуль MySQL




7 Создание PHP-FPM использование сокета 

По умолчанию PHP-FPM прослушивает порт 9000 на 127.0.0.1. Это также можно сделать PHP-FPM использовать Unix сокет, который позволяет избежать накладных расходов TCP. Чтобы сделать это, откройте файл /etc/php-fpm.d/www.conf ...

1.nano /etc/php-fpm.d/www.conf
и измените линия listen следующим образом:

1.[...]
2.;listen = 127.0.0.1:9000
3.listen = /tmp/php5-fpm.sock
4.[...]
Затем перезагрузите PHP-FPM:

1./etc/init.d/php-fpm restart
Дальше идите через Nginx конфигурации и всех ваших виртуальных доменов и изменения линии fastcgi_pass 127.0.0.1:9000; на fastcgi_pass UNIX: / tmp/php5-fpm.sock;, например, следующим образом:

1.nano /etc/nginx/nginx.conf

01.[...]
02.        location ~ \.php$ {
03.            root           /usr/share/nginx/html;
04.            fastcgi_pass   unix:/tmp/php5-fpm.sock;
05.            fastcgi_index  index.php;
06.            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
07.            include        fastcgi_params;
08.        }
09.[...]
Наконец перезагрузите Nginx: 

1./etc/init.d/nginx restart



No comments:

Post a Comment