avatar CentOS Настраиваем web-сервер на CentOS ( Nginx + php-fpm + MySQL )

В этой статье я расскажу как настроить Web сервер на CentOS, эта ОС является одной из самых популярных и только недавно она уступила лидерство Debian, что как-бы намекает. Она имеет довольно большое сообщество и информация о ее настройке будет весьма полезна людям, да и не понятно как это я ее обошел своим вниманием, в общем, этот досадный недостаток нужно исправить, чем я сейчас и займусь.

Предполагается что система установлена и настроена как вам нужно.
Устанавливаем Nginx
Первым делом нам необходимо добавить родной репозиторий Nginx, сделать это можно двумя путями:
1) Скачать пакет который добавит настройки репозитория в конфигурационные файлы
2) Руками поправить файлы конфигурации

мы буем использовать стабильный релиз для CentOS 6.0
Любое из решений имеет право на жизнь, как это сделать можно прочитать на сайте Nginx nginx.org/en/linux_packages.html#stable
Мы сделаем более просто, качнем пакет он сам все добавит в конфиги.

Качнем файл с настройками репозитория Nginx и сразу установим его:
rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm


Переходим к установке Nginx, тут все просто:
yum install nginx


Добавим Nginx в автозагрузку при старте системы и запустим его:
chkconfig --levels 235 nginx on
/etc/init.d/nginx start


Если мы попытаемся подключиться к Nginx, то у нас ничего не получится т.к. правила фаерволла блокируют доступ к 80му порту.
Добавим правила для Nginx:
nano /etc/sysconfig/iptables


Содержимое файла примерно следующее:
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT


Тут видно что разрешен доступ к порту 22, остальные порты заблокированы, возьмем за основу данное правило и немного переделаем его, чтобы оно открывало доступ к порту 80

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

И добавим его под разрешающее правило для SSH
Тогда содержимое примет вид:

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

Применим правила, чтобы Nginx стал доступен для подключения:

service iptables restart


Проверяем, зайдя по адресу httр://IP_вашего_серрвера
Видим приветственную страницу Nginx, значит web-сервер доступен для внешних подключений:

Welcome to Nginx

Немножко «допилим» Nginx, чтобы он не выдавал информацию о себе.
Для примера, попробуем перейти по адресу httр://ip_адрес_сервера/test
Сервер выдаст страницу с ошибкой, в низу которой будет видна версия nginx, что не очень хорошо.
нам нужно ее скрыть, а для этого мы идем в:
nano /etc/nginx/nginx.conf

и в секции http мы добавим директиву server_tokens off;

Сразу под записью #tcp_nopush on; заодно сняв с нее комментарий, чтобы директивы имели вид:

  sendfile        on;
  tcp_nopush     on;
  server_tokens       off;
  keepalive_timeout  65;


Сохраним изменения и перезапустим Nginx
service nginx restart

Обновляем страницу с ошибкой и видим что версия Nginx больше не отображается.

Создадим пользователя для работы с виртуальным хостом
Назовем его example:
При создании пользователя, отключим ему доступ к шеллу, так безопаснее.
useradd example -b /home -m -U -s /bin/false


также, при создании пользователя, мы завели одноименную группу example, она нам также пригодится.

Придумаем для пользователя example пароль:
passwd example


Создадим необходимые, для работы WEB сайта, директории:
mkdir -p -m 755 /home/example/www
mkdir -p -m 754 /home/example/logs


Предоставляем пользователю example права на них:
chown -R example: /home/example/www/
chown -R example: /home/example/logs/


Предоставим Nginx доступ в домашнюю директорию пользователя example, добавив пользователя nginx в группу example
usermod -a -G example nginx


А также предоставим группе example, в которую входит пользователь nginx, права на чтение и выполнение внутри домашней директории пользователя example:
chmod 750 /home/example/


Создадим виртуальный хост Nginx
Настаиваем первый виртуальный хост Nginx, назовем его example.org
nano /etc/nginx/conf.d/example.org.conf


С содержимым:
(Здесь я привожу только базовые настройки, чтобы работало, если нужно добавить что-то дополнительно, то вы сделаете это сами, исходя из ваших задач )
server {
        listen   80;
        root /home/example/www;
      
        access_log /home/example/logs/nginx.access.log; #расположение логов данного хоста

        server_name example.org www.example.org;

        location / {
                index index.php index.html index.htm;
        }

        location ~ \.php$ {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include        fastcgi_params;
        }
}

Сохраняем изменения и выходим

Переходим к установке php-fpm
yum install php-fpm php-pecl-apc php-cli php-pear php-pdo php-mysqlnd php-pecl-memcache php-pecl-memcached php-gd php-mbstring php-mcrypt php-xml


Переходим к конфигурационном файлу:
nano /etc/php.ini

находим строку ;cgi.fix_pathinfo=1 и снимаем с нее комментарий, это закрывает уязвимость с произвольным выполнением кода, чтобы выглядело:
cgi.fix_pathinfo=0


Нам также требуется перенастроить php-fpm на работу по пользователя Nginx т.к. у пользователя nginx, который входит в в группу example, есть права на выполнение скриптов, но для этого нам требуется изменить пользователя и группу под которой работает php-fpm, по умолчанию, это группа и пользователь apache нам это надо изменить, переходим к файлу:

nano /etc/php-fpm.d/www.conf


Находим строки
; RPM: apache Choosed to be able to access some dir as httpd
user = apache
; RPM: Keep a group allowed to write in log dir.
group = apache

Меняем apache на nginx чтобы выглядело

; RPM: apache Choosed to be able to access some dir as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx


Сохраняем изменения и выходим

Добавим php-fpm в автозагрузку и запустим:
chkconfig --levels 235 php-fpm on
/etc/init.d/php-fpm start


Создадим тестовый файл, чтобы проверить работоспособность PHP5:
nano /home/example/www/test.php


С содержимым:
<?php
phpinfo();
?>


Чтобы подключиться к нашему серверу по имени example.org требуется иметь настроенную DNS ону для данного домен, но можно просто добавить запись в файл hosts.

переходим по адресу httр://example.org/test.php
Получаем вот такую страницу, нас интересует строка Server API (на скриншоте подчеркнуто красным) там видно кто обработал данный файл.
centos+php-fpm

Все отлично PHP обрабатывается, сайт открывается, переходим к установке MySQL

Устанавливаем Mysql сервер
yum install mysql mysql-server


chkconfig --levels 235 mysqld on
/etc/init.d/mysqld start


Настроим MySQL

mysql_secure_installation



NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!


In order to log into MySQL to secure it, we'll need the current
password for the root user.  If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): #Нажимаем Enter#

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

Set root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] 
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] 
 ... Success!

By default, MySQL comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] 
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n]
 ... Success!

Cleaning up...



All done!  If you've completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!


На этом, с настройкой основного функционала web сервера на CentOS, можно и закончить, если есть вопросы прошу в комментарии, нашли ошибку, пишите в личку.

0 комментариев

Есть что добавить? Регистрируйся и оставляй комментарии!