Apache HTTP + NGINX на CentOS

Материал из Webko Wiki
Версия от 21:19, 21 апреля 2015; Sol (обсуждение | вклад) (Новая страница: «'''''HTTP + NGINX на CentOS''''' == Установка Apache + PHP == Устанавливаем набор (+ модули php по своему вкус…»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску

HTTP + NGINX на CentOS


Установка Apache + PHP

Устанавливаем набор (+ модули php по своему вкусу):

# yum -y install httpd php-common mod_fcgid php-cgi php

Проверяем:

# rpm -qa | grep -iE "http|mod_fcgid|php*"
  php-common-5.3.3-27.el6_5.x86_64
  php-5.3.3-27.el6_5.x86_64
  php-cli-5.3.3-27.el6_5.x86_64
  httpd-tools-2.2.15-30.el6.centos.x86_64
  httpd-2.2.15-30.el6.centos.x86_64
  mod_fcgid-2.3.9-1.el6.x86_64
# php-cgi -v
  PHP 5.3.3 (cgi-fcgi) (built: Dec 11 2013 03:28:11)
  Copyright (c) 1997-2010 The PHP Group
  Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
# php -v
  PHP 5.3.3 (cli) (built: Dec 11 2013 03:29:57)
  Copyright (c) 1997-2010 The PHP Group
  Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
# httpd -v
  Server version: Apache/2.2.15 (Unix)
  Server built: Apr 3 2014 23:56:16

Добавляем Apache HTTP в автозагрузку:

# chkconfig httpd on
# chkconfig --list | grep httpd
  httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off

И приступаем к настройке.

Так как мы не будем использоваться mod_php — убираем его конфигурационный файл, что бы Apache не загружал этот модуль:

# mv /etc/httpd/conf.d/php.conf /etc/httpd/conf.d/php.conf.bkp

Помимо других настроек — php.conf добавлял index.php как индексный файл для сайтов, что мы хотим схранить.

Редактируем файл /etc/httpd/conf.d/fcgid.conf, и в него добавляем:

DirectoryIndex index.php

И строку:

PHP_Fix_Pathinfo_Enable 1

Кроме того, редактируем файл /etc/php.ini, находим и раскомментируем в нём строку:

cgi.fix_pathinfo=1

Настраиваем обработчик («wrapper«, тут скорее не обработчик, а правильнее «обёртка», но так проще) FastCGI.

Проверяем настройки suEXEC:

# suexec -V
  -D AP_DOC_ROOT="/var/www"
  -D AP_GID_MIN=100
  -D AP_HTTPD_USER="apache"
  -D AP_LOG_EXEC="/var/log/httpd/suexec.log"
  -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
  -D AP_UID_MIN=500
  -D AP_USERDIR_SUFFIX="public_html"

Кратко — suEXEC позволяет Apcahe HTTP серверу запускать CGI и SSI сценарии под пользователем, отличным от пользователя самого веб-сервера (в данном случае — Apache HTTP работает под пользователем apache, тогда как файлы будут принадлежать пользователю setevoy).

Параметр AP_DOC_ROOT указывает на рабочую директорию suEXEC. Тогда как php-cgi расположен в директории /usr/bin:

# which php-cgi
  /usr/bin/php-cgi

Следовательно — suEXEC не сможет напрямую вызывать php-cgi.

Для того, что бы он смог корректно работать — создадим обработчик.

Так как для каждого пользователя (aka сайта) потребуется файл отдельный файл-обработчик (т.к. он должен приндалжеать пользователю, php-скрипты которого будут обрабатываться FastCGI) - то создадим отдельную директорию, в которой будем хранить эти файлы:

# mkdir /var/www/php-cgi

И в ней — каталог для первого сайта:

# mkdir /var/www/php-cgi/setevoy.org.ua

В каталоге создаём файл /var/www/php-cgi/setevoy.org.ua/php.cgi с таким содержанием:

 #!/bin/sh
 PHPRC=/etc/
 export PHPRC
 export PHP_FCGI_MAX_REQUESTS=500
 exec /usr/bin/php-cgi

Строка PHPRC тут задаёт путь поиска файла php.ini. Можно изменить её на /var/www/php-cgi/setevoy.org.ua/ и создать в нём отдельную копию php.ini с настройками под этот конкретный сайт.

В некоторых документах рекомендуется устанавливать параметр export PHP_FCGI_CHILDREN=4, но пока решено обойтись без него (вот тут>>> есть интересные наблюдения на эту тему).

Обязательно устанавливаем права и владельца:

 # chmod 755 /var/www/php-cgi/setevoy.org.ua/php.cgi
 # chown -R setevoy:setevoy /var/www/php-cgi/setevoy.org.ua

Создаём каталоги и файлы

Предполагается, что пользователь у нас уже есть.

Нам нужен каталог для файлов сайта:

# mkdir -p /var/www/vhosts/setevoy.org.ua

В каталог /var/www/vhosts/setevoy.org.ua помещаем пока один файл — index.php с таким содержимым:

<?php echo phpinfo(); ?>

Меняем пользователя:

# chown -R setevoy:setevoy /var/www/vhosts/setevoy.org.ua

Создаём файлы логов:

# touch /var/log/httpd/setevoy.org.ua-error.log
# touch /var/log/httpd/setevoy.org.ua-access.log

Создаём файл описания виртаулхоста /etc/httpd/conf.d/setevoy.org.ua.conf с таким содержимым:

       <VirtualHost 77.***.***.20:80>

DocumentRoot /var/www/vhosts/setevoy.org.ua

ServerName setevoy.org.ua

ServerAlias www.setevoy.org.ua

CustomLog /var/log/httpd/setevoy.org.ua-access.log vcombined

ErrorLog /var/log/httpd/setevoy.org.ua-error.log

<IfModule mod_fcgid.c>

SuexecUserGroup setevoy setevoy

<Directory /var/www/vhosts/setevoy.org.ua>

Options +ExecCGI

AllowOverride All

AddHandler fcgid-script .php

FCGIWrapper /var/www/php-cgi/setevoy.org.ua/php.cgi .php

Order allow,deny

Allow from all

</Directory>

</IfModule>

</VirtualHost>

Проверяем синтаксис:

 # httpd -t
 Syntax OK

Запускаем:

 # service httpd start
 Starting httpd: [ OK ]

И вспоминаем, что забыли открыть 80 порт на фаерволе :-)

Проверяем текущий список правил:

 # iptables -L -n --line-numbers
Chain INPUT (policy ACCEPT)
...
5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

REJECT у нас идёт под номером 5, значит правило добавляем перед ним — то есть с тем же номером:

# iptables -I INPUT 5 -p tcp --dport 80 -m state --state NEW -j ACCEPT

Сохраняем:

 # service iptables save
 iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]

И проверяем сайт, логи:

# tail -f /var/log/httpd/setevoy.org.ua-error.log

и:

 # tail -f /var/log/httpd/error_log
 [Thu Jul 03 19:33:46 2014] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
 [Thu Jul 03 19:33:46 2014] [notice] Digest: generating secret for digest authentication ...
 [Thu Jul 03 19:33:46 2014] [notice] Digest: done
 [Thu Jul 03 19:33:46 2014] [notice] Apache/2.2.15 (Unix) DAV/2 mod_fcgid/2.3.9 configured -- resuming normal operations

suEXEC mechanism enabled — работает, ошибок нет.

оригинал RTFM


Установка NGINX

Для установки NGINX подключим его родной репозиторий:

 # rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
 Retrieving http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
 warning: /var/tmp/rpm-tmp.K7nOMw: Header V4 RSA/SHA1 Signature, key ID 7bd9bf62: NOKEY
 Preparing... ########################################### [100%]
 1:nginx-release-centos ########################################### [100%]

Проверяем:

 # yum repolist | grep nginx
 nginx nginx repo 56

Устанавливаем NGINX:

 # yum -y install nginx --enablerepo="nginx"

Проверяем:

 # yum list installed | grep nginx
 nginx.x86_64 1.6.0-1.el6.ngx @nginx
 nginx-release-centos.noarch

Редактируем файл /etc/nginx/nginx.conf, устанавливаем:

 user nginx; # пользователь, под которым будет работать nginx;
 worker_processes 1; # кол-во процессов nginx, по кол-ву ядер/процессоров;
 pid /var/run/nginx.pid;	 
 events {
    worker_connections 1024; # макс. кол-во одновременно обслуживаемых соединений, считается макс. клиентов = worker_processes * worker_connections
        }
    
    http {
       include /etc/nginx/mime.types;
       default_type application/octet-stream;
        log_format main '$remote_addr - $remote_user [$time_local] "$request" '
               '$status $body_bytes_sent "$http_referer" '
               '"$http_user_agent" "$http_x_forwarded_for"';    
         access_log /var/log/nginx/access.log main;
         error_log /var/log/nginx/error.log;
       # немного тюнинга
    sendfile on;
    tcp_nopush on;
    server_tokens off;
    keepalive_timeout 65;
 
    # сжатие некоторых данных перед отправкой
    gzip on;
    gzip_static on;
    gzip_comp_level 5;
    gzip_min_length 1024;	 
    # ограничиваем кол-во подключений с одного IP ко всем сайтам;
    # что бы установить различные ограничения для каждого отдельного виртуалхоста - перенесите limit_conn perip в блок server каждого конфига;
      limit_zone myzone $binary_remote_addr 2m;
      limit_conn perip 5;
 	 
          # для Apache
          proxy_redirect off;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
     # подключем директорию для файлов конфигурации виртуалхостов
  	    include /etc/nginx/conf.d/*.conf;  	 
 	    # описываем сервер по-умолчанию
	    server {
           listen 80 default;

           location ~ /\.ht {
           deny all;
 	    }
           location / {
           proxy_pass http://127.0.0.1:8080;
 	    }  	   

error_page 404 /404.html;

  	       location = /404.html {
 	       root /usr/share/nginx/html;
 	    }
     
   error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        root /usr/share/nginx/html;
        }
        }
        }

Убираем ненужный теперь конфиг сервера по-умолчанию:

   # mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bkp

Проверяем синтаксис:

   # nginx -t
     nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
     nginx: configuration file /etc/nginx/nginx.conf test is successful

Редактируем /etc/httpd/conf/httpd.conf, меняем:

Listen 80

На:

       Listen 127.0.0.1:8080

Редактируем файл виртуалхоста /etc/httpd/conf.d/setevoy.org.ua.conf, меняем:

      <VirtualHost 77.***.***.20:80>

На:

      <VirtualHost 127.0.0.1:8080>

Проверяем конфиг:

   # httpd -t
     Syntax OK

Создаём файл конфигу виртуалхоста для NGINX — /etc/nginx/conf.d/setevoy.org.ua.conf:

server {

          listen 80;
          server_name setevoy.org.ua wwww.setevoy.org.ua;
  
           location ~ /\.ht {
           deny all;
           }
   
           location ~* \.(jpg|swf|jpeg|gif|png|css|js|ico)$ {
           root /var/www/vhosts/setevoy.org.ua;
           }

           location / {
           proxy_pass http://127.0.0.1:8080;
           }
      }

Ещё раз проверяем:

   # nginx -t
     nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
     nginx: configuration file /etc/nginx/nginx.conf test is successful

Останавливаем Apache:

      # service httpd stop
      Stopping httpd: [ OK ]

И запускаем NGINX:

      # service nginx start
      Starting nginx: [ OK ]

Запускаем Apache:

      # service httpd start
      Starting httpd: [ OK ]

Проверяем порты:

     # netstat -anp | grep -E "nginx|httpd"
      tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 4597/httpd
      tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4584/nginx

И отдельно — установим mod_rpaf, что бы в логе Apache отображались корректные IP, а не 127.0.0.1:

    127.0.0.1 - - [06/Jul/2014:19:48:26 +0300] "GET / HTTP/1.0" 200 16781 "http://setevoy.org.ua/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36"

Во многих (да почти всех) мануалах говорится про репозиторий CentALT, который сейчас отдаёт 403 при любом запросе. Потому — установим вручную.

Ставим набор утилит http-devel и компилятор gcc:

  # yum -y install httpd-devel gcc

Переходим в директорию src:

  # cd /usr/local/src

Качаем архив и устанавливаем mod_rpaf:

  # wget http://drupion.com/sites/default/files/mod_rpaf-0.6.tar_.gz
  # tar zxvf mod_rpaf-0.6.tar_.gz
  # cd mod_rpaf-0.6
  # apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

Ждём появления:

      Libraries have been installed in:
      /usr/lib64/httpd/modules

Всё установилось.

Создаём файл /etc/httpd/conf.d/mod_rpaf.conf с таким содержимым:

  LoadModule rpaf_module modules/mod_rpaf-2.0.so
  # mod_rpaf configuration	 
    RPAFenable On
    RPAFsethostname On
    RPAFproxy_ips 127.0.0.1
    RPAFheader X-Forwarded-For

Перезапускаем Apache:

    # service httpd restart
    Stopping httpd: [ OK ]
    Starting httpd: [ OK ]

И проверяем логи:

view source

  37.***.***.56 - - [06/Jul/2014:19:49:10 +0300] "GET / HTTP/1.0" 200 16781 "http://setevoy.org.ua/wp-admin/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36"

оригинал RTFM