avatar Ubuntu Настройка связки Nginx+Apache с PHP5, MySQL на Ubuntu

Давно собирался написать мануал по установке и настройке высокопроизводительного сервера.
Думаю что для многих эта статься окажется полезной и прольет свет на многие неясности в этом вопросе.

Сама задача не очень сложная, единственная проблема в том, что последний раз мне приходилось заниматься подобным-почти год назад, а многие вещи имеют свойство забываться.
В общем было решено установить Nginx как прокси-сервер для Apache, энджинск будет лопатить статику, а индеец, будет работать со скриптами.
Чтобы все это выглядело более понятно, прилагаю схему:

Общая схема работы связки Nginx-Apache-Mysql

Все запросы приходят на сервер Nginx -он отдает статические данные (изображения (jpg, png, html и т.п.), далее он передает запрос на обработку скриптов WEB серверу Apache (PHP,cgi,pl и т.п.), скрипты выполняют запросы к MySQL и получив оттуда данные, возвращают их Nginx, тот, в свою очередь, отдает готовую страницу пользователям. Все просто.
Данный мануал подходит для всех версий Ubuntu и Debian
На этом с теорией все, переходим к практике.

Установка Nginx


В репозиториях Ubuntu/Debian лежит старая версия пакета 0.7.65, ставить все из репозиториев и довольствоваться тем что есть, это для слабоков, мы соберем более свежую версию, для этого будем компилить исходники, в данный момент доступна версия nginx 1.0.4, ее мы и будем ставить.
Существует 2 варианта установки nginx:
1) Установка поверх установленной ранее, более старой версии будет рассмотрен в данной статье.
2) Установка Nginx из исходных кодов в чистом виде.

Установка Nginx, поверх более старой версии


sudo su

Устанавливаем необходимые для компиляции пакеты и версию nginx из репозиториев:
aptitude install libpcre3-dev libcurl4-openssl-dev gcc nginx


Останавливаем демон:
/etc/init.d/nginx stop

Качаем исходники:
wget sysoev.ru/nginx/nginx-1.0.4.tar.gz

Распаковываем:
tar -zxvf nginx-1.0.4.tar.gz

Переходим в директорию с распакованными исходниками:
cd nginx-1.0.4

Собираем и устанавливаем:
./configure --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --pid-path=/var/run/nginx.pid \
--user=www-data \
--group=www-data \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_gzip_static_module \
--with-mail \
--with-mail_ssl_module
make
make install


Запускаем полученное:
/etc/init.d/nginx start


Переходим по адресу httр://ip_server и видим окно приветствия nginx набираем имя произвольной директории например httр://ip_server/nopage и видим страницу с ошибкой 404, в низу которой указана версия WEB сервера, которая ее сгенерировала, если там указана та версия, исходники которой вы выкачивали, значит все в норме.

Переходим к настройке конфигурационного файла

nano /etc/nginx/nginx.conf


user www-data;
worker_processes  2; # Обычно устанавливается по количеству ядер в процессоре

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
    # multi_accept on;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    server_names_hash_bucket_size 64;
    access_log  /var/log/nginx/nginx.access.log;

    proxy_buffers 8 16k;
    proxy_buffer_size 32k;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nodelay        on;


    gzip                on; #Использование сжатия статики (Пример: CSS)
    gzip_proxied        any;
    gzip_min_length     1100;
    gzip_http_version   1.0;
    gzip_buffers        4 8k;
    gzip_comp_level     4; #Степень сжатия (больше ставить смысла нет, нагрузка на ЦПУ растет, а файлы меньше не практически становятся)
    gzip_types          text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;


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


Установка Apache-mpm-itk

Немного теории:
Мы будем устанавливать Web сервер Apache, нам необходимо установить сборку Apache2-mpm-itk, ее отличие от обычной, заключается в возможности Apache, запускать виртуальные хосты сервера с правами разных пользователей, это позволяет, при грамотной расстановке прав доступа на директории, избежать перехода из корневой директории одного сайта в другую. Если кратко, то на обычной сборке apache все хосты работают от пользователя www-data, а эта, позволяет запускать от разных пользователей, не имеющих доступа в корневые директории соседей по серверу.

sudo su
aptitude install apache2-mpm-itk libapache2-mod-rpaf

Дожидаемся окончания установки, после завершения apache выдаст ошибку, такого содержания:

* Starting web server apache2 (98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs


Которая говорит нам о том, что 80й порт занят и он запуститься не может-это нормально, на восьмидесятом порту у нас висит nginx. Нам необходимо перенести Apache на другой порт, традиционно его переносят на порт 8080 (хотя можно на любой не занятый выше 1024го порта).

Для начала поправим порты:
nano /etc/apache2/ports.conf


По умолчанию там указано
NameVirtualHost *:80
Listen 80


Мы делаем:
NameVirtualHost *:8080
Listen 127.0.0.1:8080


Во многих мануалах предлагается после переноса порта, зарубить к нему доступ через iptables-это НЕ правильно и является, по сути, костыльным решением. Для чего его блокировать, если можно совсем не выставлять, мы сделаем так, чтобы Apache начал принимать и обрабатывать запросы только от localhost и одновременно стал недоступным снаружи, вот по этому мы и добавляем в Listen 127.0.0.1:8080

Сделаем настройки, чтобы апач, меньше выдавал о себе информации
nano /etc/apache2/conf.d/security


Находим там строку:
ServerTokens OS
Меняем ее на:
ServerTokens Prod

Далее строку:
ServerSignature On
Меняем на:
ServerSignature Off

Сохраняем изменения, пробуем запустить Apache
/etc/init.d/apache2 start


Установка PHP5
aptitude install php5 libapache2-mod-php5 php5-mysql php5-snmp php5-gd php5-memcache php5-imagick php5-recode php5-xmlrpc php5-xsl php5-mcrypt php5-curl php-pear php5-imap -y


Устанавливаем MySQL

aptitude install mysql-server mysql-client


Указываем новый пароль и его подтверждение для пользователя root (это администратор MySQL, а не системный пользователь)

Настройка виртуального хоста Nginx
Теперь создадим первый виртуальный хост, для этого нам понадобится выполнить ряд действий:
  • 1-создать нового пользователя
  • 2-создать виртуальный хост Nginx
  • 3-создать виртуальный хост Apache

Создаем пользователя нашего тестового сайта example.org
sudo useradd example -b /home/ -m -U -s /bin/false

В домашней директории создадим каталоги для файлов сервера, логов и временных файлов.

sudo mkdir -p -m 754 /home/example/www
sudo mkdir -p -m 777 /home/example/tmp
sudo mkdir -p -m 754 /home/example/logs


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


Т.к. у нас Nginx работает от пользователя www-data, то он не сможет получить доступ к содержимому домашней директории пользователя example, но при создании была создана одноименная группа, в нее нам необходимо добавить пользователя www-data.
usermod -a -G example www-data

Таким образом, в будущем при создании нового виртуального хоста нам необходимо добавить пользователя www-data в группу с именем нового пользователя.

Основным симптомом что вы этого не сделали-отсутствие изображений на странице, которую вы запрашиваете с вашего сервера т.к. Nginx читает только графические файлы, то из-за отсутствия прав доступа к ним, он сделать этого не сможет, и страница генерируется без изображений-решение, добавить пользователя www-data (от имени которого работает Nginx) в одноименною группу пользоваться, от имени которого работает виртуальный хост Apache!

Лирическое отступление.
Если не добавить пользователя www-data в группу example, то после того, как любая CMS будет залита на сервер, сайт будет отображаться без графики (т.е. графические файлы выдаваться не будут, потому что не достаточно прав доступа). Для устранения этой проблемы необходимо добавить пользователя www-data в группу пользователя, от имени которого работает виртуальный хост и перезапустить nginx. Попробуйте на досуге, понимание этого приходит после первого коряво выглядящего дизайна ;) в дальнейшем вопросов не возникает.

Создаем виртуальный хост Nginx

sudo nano /etc/nginx/sites-available/example.org

И вставляем в него то, что указано ниже, в вашем случае пути необходимо указывать свои:

server {
listen 80;
server_name example.org www.example.org;
access_log /home/example/logs/nginx_access.log;
error_log /home/example/logs/nginx_error.log;
location ~* \.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|swf|ico|flv|txt|docx|xlsx)$ {
root /home/example/www/;
index index.html index.php;
access_log off;
expires 30d;
}
location ~ /\.ht {
deny all;
}

location / {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-for $remote_addr;
proxy_set_header Host $host;
proxy_connect_timeout 60;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_redirect off;
proxy_set_header Connection close;
proxy_pass_header Content-Type;
proxy_pass_header Content-Disposition;
proxy_pass_header Content-Length;
}
}

Сохраняем изменения и выходим.
Теперь нам необходимо создать символическую ссылку, для того чтобы наш виртуальный хост заработал:
sudo ln -s /etc/nginx/sites-available/example.org /etc/nginx/sites-enabled/

И перезапустим Nginx:
sudo /etc/init.d/nginx restart


Настройки виртуального хоста Apache

sudo nano /etc/apache2/sites-available/example.org


<VirtualHost *:8080>
   DocumentRoot /home/example/www
   ServerAdmin admin@example.org
   ServerName example.org
   ServerAlias www.example.org
   ErrorLog /home/example/logs/apache_error.log
   CustomLog /home/example/logs/apache_access.log combined
<Directory />
#Order Deny,Allow
#Deny from all
Options -ExecCGI -Indexes -Includes +FollowSymLinks
AllowOverride All
  <Limit GET POST>
  Order allow,deny
  Allow from all
  </Limit>
  <LimitExcept GET POST>
  Order deny,allow
  Deny from all
  </LimitExcept>
</Directory>

AssignUserId www-data example

php_admin_value open_basedir "/home/example/:."
php_admin_value upload_tmp_dir "/home/example/tmp"
php_admin_value session.save_path "/home/example/tmp"
</VirtualHost>


Также создадим символическую ссылку на файл example.org
sudo ln -s /etc/apache2/sites-available/example.org /etc/apache2/sites-enabled/


Перезапустим Apache:
/etc/init.d/apache2 restart


Теперь нам необходимо проверить работоспособность сервера, создадим в корневой директории сайта файл test.php с содержимым:

<?php
phpinfo();
?>


Должно выдать нечто подобное:

Это говорит о том что PHP5 на нашем сервере работает, дальше остается наращивать функционал, под нужные вам задачи.
Если на сервере необходимо организовать доступ по FTP, то рекомендую прочитать статью по настройке FTP сервера vsFTPd
На этом все.

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

avatar
Спасибо! Очень познавательная статья и сайт вцелом ;) Буду Вашим читателем
avatar
aptitude install php5 libapache2-mod-php5 php5-mysql php5-snm php5-gd php5-memcache php5-imagick php5-recode php5-xmlrpc php5-xsl php5-mcrypt php5-curl php-pear php5-imap -y

вот здесь ошибка, нужно указать вместо php5-snm — php5-snmp
avatar
Спасибо, исправил!
avatar
Спасибо. Не могли бы Вы дополнить статью описанием настройки php.ini (для каждого отдельного сайта).
avatar
Посмотрите статью по настройке на Fast-CGI+Apache на OpenSUSE, в Ubuntu все делается аналогичным образом
avatar
Почему-то не хочет работать php :(
[Sun Jan 08 11:15:39 2012] [notice] caught SIGTERM, shutting down
Failed loading /usr/local/ioncube/ioncube_loader_lin_5.3.so:  /usr/local/ioncube/ioncube_loader_lin_5.3.so: wrong ELF class: ELFCLASS64
PHP Deprecated:  Comments starting with '#' are deprecated in /etc/php5/apache2/conf.d/imagick.ini on line 1 in Unknown on line 0
PHP Deprecated:  Comments starting with '#' are deprecated in /etc/php5/apache2/conf.d/imap.ini on line 1 in Unknown on line 0
PHP Deprecated:  Comments starting with '#' are deprecated in /etc/php5/apache2/conf.d/mcrypt.ini on line 1 in Unknown on line 0
[Sun Jan 08 11:17:53 2012] [notice] Apache/2.2.14 (Ubuntu) PHP/5.3.2-1ubuntu4.11 with Suhosin-Patch configured -- resuming normal operations
avatar
Судя по логам, проблемы с модулем ioncube, переустановите его.
avatar
Переустановил все с 0, вроде все работает. Спасибо.
Очепятка есть
Сохраняем изменения, пробуем запустить Apache
/etc/init.d/apache start

Исправьте на apache2
avatar
Спасибо-исправил.
avatar
А как настроить nginx так, чтобы виртуальные хосты создавать только в апаче? Т.е. чтобы nginx только передавал запросы апачу, а сам ничего не отдавал?
avatar
Не совсем понял вопроса, вся идея состоит в том чтобы Nginx отдавал статику, т.к. медленные клиенты будут создавать много процессов Apache которые отжерают много ресурсов, а Nginx тратит на это меньше ресурсов.

Nginx может работать в режиме прокси-сервера, подробнее об этом можно прочитать в документации, на сайте разработчиков nginx.org
avatar
Ну так даже если nginx будет в режиме прокси — всё равно это позволит апачу отработать и завершиться, в то время как nginx будет отдавать файлы посетителям.
avatar
Собственно, ради этого все и затевалось…
avatar
Кстати, вычитал, что для пакетных дистрибутивов лучше не собирать пакеты вручную. Так что я просто добавил репозитории nginx в sources.list и обновился штатно. Как это сделать, описано на оф. сайте: nginx.org/ru/download.html
avatar
После пункта
Перезапустим Apache:
/etc/init.d/apache2 restart
сервер выдает ошибку
root@server:/home/evgeniy# /etc/init.d/apache2 restart
* Restarting web server apache2 Action 'start' failed.
The Apache error log may have more information.
avatar
Ubuntu 11.10 server.
avatar
Ну вот он и пишет что «больше информации в логе ошибок» а что в нем?
avatar
/var/log/apache2/error.log

[Mon Apr 16 22:49:46 2012] [notice] Apache/2.2.20 (Ubuntu) configured — resuming normal operations
[Mon Apr 16 22:51:17 2012] [notice] Graceful restart requested, doing restart
[Mon Apr 16 22:51:17 2012] [warn] NameVirtualHost *:8080 has no VirtualHosts
[Mon Apr 16 22:51:17 2012] [notice] Apache/2.2.20 (Ubuntu) configured — resuming normal operations
[Mon Apr 16 23:15:22 2012] [notice] caught SIGTERM, shutting down
(2)No such file or directory: apache2: could not open error log file /home/blog/logs/apache_error.log.
Unable to open logs
(2)No such file or directory: apache2: could not open error log file /home/blog/logs/apache_error.log.
Unable to open logs
(2)No such file or directory: apache2: could not open error log file /home/blog/logs/apache_error.log.
Unable to open logs
(2)No such file or directory: apache2: could not open error log file /home/blog/logs/apache_error.log.
Unable to open logs
(2)No such file or directory: apache2: could not open error log file /home/blog/logs/apache_error.log.
Unable to open logs
(2)No such file or directory: apache2: could not open error log file /home/blog/logs/apache_error.log.
Unable to open logs
(2)No such file or directory: apache2: could not open error log file /home/blog/logs/apache_error.log.
Unable to open logs
(2)No such file or directory: apache2: could not open error log file /home/blog/logs/apache_error.log.
Unable to open logs
(2)No such file or directory: apache2: could not open error log file /home/blog/logs/apache_error.log.
Unable to open logs
(2)No such file or directory: apache2: could not open error log file /home/blog/logs/apache_error.log.
Unable to open logs
(2)No such file or directory: apache2: could not open error log file /home/blog/logs/apache_error.log.
Unable to open logs
avatar
Вот вам и ответ:
No such file or directory:

директории по пути /home/blog/logs/ существуют?
Права на запись пользователю ww-data есть?
avatar
Все было так просто))) Создал /home/blog/logs, сервер запустился. Спасибо!))
avatar
Читайте логи, в них вы найдете до 99% ответов на свои вопросы. =) Просто возьмите себе за правило, сразу лезть туда, по неопытности начинаешь искать везде, кроме того места-где надо…
avatar
Так я прочитал, погуглил, но суть проблемы не понял и потому решение не нашел. Пришлось вопрос здесь задать.
avatar
бывает )
avatar
Снова я :)

Пытаюсь поставить livestreet. Кое-как сделал, чтобы шаблон отображался, осталась проблема — не работает ЧПУ. При заходе куда угодно, кроме главной страницы, выдает ошибку 500.
Демонстрирую свою настройку nginx
server {
listen 80;
server_name localsite.ru www.localsite.ru;
access_log /home/localsite.ru/logs/nginx_access.log;
error_log /home/localsite.ru/logs/nginx_error.log;
location ~* \.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|
swf|ico|flv|txt|docx|xlsx)$ {

root /home/localsite.ru/www/;
index index.php  

access_log off;
expires 30d;
}
location / {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_connect_timeout 60;
proxy_store on;
proxy_store_access   user:rw  group:rw  all:r;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_redirect off;
proxy_set_header Connection close;
proxy_pass_header Content-Type;
proxy_pass_header Content-Disposition;
proxy_pass_header Content-Length;
client_max_body_size 40m;
client_body_buffer_size 256k;

if (!-e $request_filename) {
        rewrite ^(.*)$  /index.php;
    }
}
}



avatar
на сайте Livestreet.ru был пример конфига nginx
avatar
Пол дня вчера потратил, попробовал все, что там нашел — толку 0.
avatar
Так стоп!
Nginx тут совершенно не причем, он работает как прокси сервер.
У вас выдает ошибку 500 Apache, mod_rewrite подключен?
Что написано в логах?
avatar
mod_rewrite включен. Логи чего именно?

Вот частично файл nginx.error из папки logs
2012/05/10 11:53:34 [error] 1745#0: *30 rewrite or internal redirection cycle while processing "/index.php", client: 192.168.1.10, server: localsite, request: «GET /people/ HTTP/1.1», host: «localsite», referrer: «localsite/»
2012/05/10 11:53:34 [error] 1745#0: *31 open() "/home/localsite/www/favicon.ico" failed (2: No such file or directory), client: 192.168.1.10, server: localsite, request: «GET /favicon.ico HTTP/1.1», host: «localsite»
2012/05/10 11:53:38 [error] 1745#0: *31 rewrite or internal redirection cycle while processing "/index.php", client: 192.168.1.10, server: localsite, request: «GET /search/opensearch/ HTTP/1.1», host: «localsite»
2012/05/10 11:55:25 [error] 1745#0: *34 rewrite or internal redirection cycle while processing "/index.php", client: 192.168.1.10, server: localsite, request: «GET /people/ HTTP/1.1», host: «localsite», referrer: «localsite/»
2012/05/10 11:55:27 [error] 1745#0: *35 open() "/home/localsite/www/favicon.ico" failed (2: No such file or directory), client: 192.168.1.10, server: localsite, request: «GET /favicon.ico HTTP/1.1», host: «localsite»
2012/05/10 11:55:27 [error] 1745#0: *35 rewrite or internal redirection cycle while processing "/index.php", client: 192.168.1.10, server: localsite, request: «GET /templates/cache/new-jquery/0d3848a7530f9e2a580753a6fe88b02e.js HTTP/1.1», host: «localsite», referrer: «localsite/»
2012/05/10 11:55:28 [error] 1745#0: *37 rewrite or internal redirection cycle while processing "/index.php", client: 192.168.1.10, server: localsite, request: «GET /search/opensearch/ HTTP/1.1», host: «localsite»
2012/05/10 11:55:36 [error] 1745#0: *39 rewrite or internal redirection cycle while processing "/index.php", client: 192.168.1.10, server: localsite, request: «GET /templates/cache/new-jquery/0d3848a7530f9e2a580753a6fe88b02e.js HTTP/1.1», host: «localsite», referrer: «localsite/»
2012/05/10 11:55:37 [error] 1745#0: *38 rewrite or internal redirection cycle while processing "/index.php", client: 192.168.1.10, server: localsite, request: «GET /people/ HTTP/1.1», host: «localsite», referrer: «localsite/»
2012/05/10 11:55:38 [error] 1745#0: *42 open() "/home/localsite/www/favicon.ico" failed (2: No such file or directory), client: 192.168.1.10, server: localsite, request: «GET /favicon.ico HTTP/1.1», host: «localsite»
2012/05/10 11:56:26 [error] 1917#0: *1 rewrite or internal redirection cycle while processing "/index.php", client: 192.168.1.10, server: localsite, request: «GET /search/opensearch/ HTTP/1.1», host: «localsite»

Вот файл apache_error.log из той же директории
[Thu May 10 01:33:12 2012] [error] [client 192.168.1.10] File does not exist: /home/localsite/www/blogs
[Thu May 10 01:33:12 2012] [error] [client 192.168.1.10] File does not exist: /home/localsite/www/favicon.ico
[Thu May 10 01:33:27 2012] [error] [client 192.168.1.10] File does not exist: /home/localsite/www/top
[Thu May 10 01:33:27 2012] [error] [client 192.168.1.10] File does not exist: /home/localsite/www/favicon.ico
[Thu May 10 01:33:38 2012] [error] [client 192.168.1.10] File does not exist: /home/localsite/www/registration
[Thu May 10 01:33:38 2012] [error] [client 192.168.1.10] File does not exist: /home/localsite/www/favicon.ico

А вот файл error_log от туда же
2012/05/10 00:39:22 [error] 2137#0: *1 rewrite or internal redirection cycle while processing "/index.php", client: 192.168.1.10, server: localsite, request: «GET /blogs/ HTTP/1.1», host: «localsite», referrer: «localsite/»
2012/05/10 00:39:22 [error] 2137#0: *2 open() "/home/localsite/www/favicon.ico" failed (2: No such file or directory), client: 192.168.1.10, server: localsite, request: «GET /favicon.ico HTTP/1.1», host: «localsite»
2012/05/10 00:39:25 [error] 2137#0: *2 rewrite or internal redirection cycle while processing "/index.php", client: 192.168.1.10, server: localsite, request: «GET / HTTP/1.1», host: «localsite»
2012/05/10 00:39:25 [error] 2137#0: *3 open() "/home/localsite/www/favicon.ico" failed (2: No such file or directory), client: 192.168.1.10, server: localsite, request: «GET /favicon.ico HTTP/1.1», host: «localsite»
2012/05/10 00:39:27 [error] 2137#0: *3 rewrite or internal redirection cycle while processing "/index.php", client: 192.168.1.10, server: localsite, request: «GET / HTTP/1.1», host: «localsite»
2012/05/10 00:39:27 [error] 2137#0: *4 open() "/home/localsite/www/favicon.ico" failed (2: No such file or directory), client: 192.168.1.10, server: localsite, request: «GET /favicon.ico HTTP/1.1», host: «localsite»
2012/05/10 00:40:09 [error] 2146#0: *1 rewrite or internal redirection cycle while processing "/index.php", client: 192.168.1.10, server: localsite, request: «GET / HTTP/1.1», host: «localsite»
2012/05/10 00:40:10 [error] 2146#0: *2 open() "/home/localsite/www/favicon.ico" failed (2: No such file or directory), client: 192.168.1.10, server: localsite, request: «GET /favicon.ico HTTP/1.1», host: «localsite»
2012/05/10 00:40:17 [error] 2153#0: *1 rewrite or internal redirection cycle while processing "/index.php", client: 192.168.1.10, server: localsite, request: «GET / HTTP/1.1», host: «localsite»
2012/05/10 00:40:18 [error] 2153#0: *2 open() "/home/localsite/www/favicon.ico" failed (2: No such file or directory), client: 192.168.1.10, server: localsite, request: «GET /favicon.ico HTTP/1.1», host: «localsite»
avatar
p.s. ошибка 500 выглядит так:

500 Internal Server Error


nginx/1.0.4
avatar
Кто у вас обрабатывает скрипты apache или nginx?
закопипастите мой конфигурационный файл и добейтесь работы с ним
avatar
Не знаю, как проверить. По-идее, apache2 должен, если я правильно понял работу nginx.
Конфигурационный файл и так ваш использую, не знаю, что не так. Или файл не тот..?)
avatar
Чего? ;)
avatar
Тооже была ошибка 500, исправил так:

sudo a2enmod (потом там же пишешь и рестартуешь сервак)
rewrite
sudo service apache2 restart

ps :D
avatar
если не пашет создать .htaccess в корне сайта такого содержания
AddDefaultCharset UTF-8
Options -Indexes
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./index.php
<Files «plugins.dat»>
order allow,deny
deny from all
avatar
подскажите как привязать phpmyadmin? А то при установке через apt-get install phpmyadmin у меня не работает. Где копать настройки?
avatar
Да его даже устанавливать не нужно, просто скачать свежую версию и распаковать в любую директорию сайта, перейдя по адресу httр://доменное_имя_сайта/директоря__phpmyadmin он запустится оттуда, по умолчанию он конектится к локалхоту, от вас только требуется указать логин и пароль для подключения к mysql
avatar
Спасибо. Еще один вопрос. Если установить cms то через нее невозможно создавать и загружать файлы и папки, как это можно поправить?
avatar
Дать права на запись, пользователю под которым работает web сервер
avatar
дать права группе владельца папки куда добавлен пользователь nginx (chmod -g -R 777 user /home/user/web)?
avatar
как вариант
avatar
Как можно сюда поставить EACCELERATOR и MEMCACHE?
А то у меня VPS слабый, даже в такой связке подтормаживает.
avatar
Вопрос отпал сам собой
EACCELERATOR заменил на xcache и установил с помощью apt-get install
MemCache установил так же
Теперь вместо 1-1.5 секунды страница загружается 0.25-0.5 секунд. Это очень хороший прирост!
Artful если сочтёте нужным добавьте вот это в статью
apt-get install memcached php5-memcached php5-xcache

apache2ctl restart
avatar
так сама идея подразумевает создание заготовки, на которую можно навешивать необходимый функционал. Все засунуть в статью не возможно да и не нужно.
Но тенденция мне нравится, читатели, понемногу, начали думать, как можно улучшить функционал!
avatar
Настроил практически все по инструкции, но все равно есть проблема с правами. nginx не хочет отдавать статику, в логах пишет:
[error] 22050#0: *8 open() "/home/site.ru/public_html/uploads/images/screenshots/ic0.4.png" failed (13: Permission denied), client: 91.149.148.177, server: site.ru, request: "GET /uploads/images/screenshots/ic0.4.png HTTP/1.1", host: "site.ru"

Какие все-таки права необходимо ставить на папки? www-data добавлен в группу пользователя, права рекурсивно 754 на директории, 644 на сам файл, владелец site.ru:site.ru
avatar
1) От имени какого пользователя работает виртуальный хост apache?
2) Пользователь www-data добавлен в группу, от имени которой запускается вирт. хост?
3) Какие права на файл, который вы пытаетесь запросить с web севрера?
avatar
nginx запускается от www-data, apache как site:site, владелец файлов и директорий site:site, права на папки 755, на файлы 644. Вот настройки nginx.conf:
user www-data;
worker_processes 1;
worker_priority -5;
pid /var/run/nginx.pid;

events {
	worker_connections 768;
	# multi_accept on;
	#use epoll;
}

http {

	##
	# Basic Settings
	##

	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	keepalive_timeout 65;
	types_hash_max_size 2048;
	server_tokens off;

	# server_names_hash_bucket_size 64;
	# server_name_in_redirect off;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	##
	# Logging Settings
	##
	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;

	##
	# Gzip Settings
	##

	gzip on;
	gzip_disable "msie6";

	gzip_vary on;
	gzip_min_length 1100;
	gzip_proxied any;
	gzip_comp_level 3;
	gzip_buffers 64 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;
	include /etc/nginx/sites-enabled/*;
}

Виртуальный хост nginx:
server { 
	listen 80; 
	server_name site.ru www.site.ru;
	server_tokens off;
	disable_symlinks off;

	access_log /home/site/logs/nginx-access.log; 
	error_log /home/site/logs/nginx-error.log;
		
	location ~ \.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|swf|ico|flv|txt|docx|xlsx)$ { 
		try_files $uri /uri =404;
		root /home/site/public_html;
		index  index.html index.htm index.php;
		access_log off;
		log_not_found  off;
		expires 30d;
		add_header Cache-Control public;
	}

	location ~ /.svn/ { 
		deny all; 
	}


    	location ~ /.cvs/ {
        	deny all;
    	}

 	location = /favicon.ico {
  		allow all;
		log_not_found off;
  		access_log off;
 	}
 	location = /robots.txt {
  		allow all;
  		log_not_found off;
  		access_log off;
 	}

	location / {
		proxy_pass http://127.0.0.1:9090/;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-for $remote_addr;
		proxy_set_header Host $host;
		proxy_connect_timeout 60;
		proxy_send_timeout 90;
		proxy_read_timeout 90;
		proxy_redirect off;
		proxy_set_header Connection close;
		proxy_pass_header Content-Type;
		proxy_pass_header Content-Disposition;
		proxy_pass_header Content-Length;
	}
}

Виртульаный хост apache:
<VirtualHost *:9090>
	ServerAdmin mark@site.ru
	AssignUserId site site
	ServerName	site.ru
	ServerAlias	www.site.ru
	DocumentRoot /home/site/public_html

	<Directory />
		Options -ExecCGI -Indexes -Includes +FollowSymLinks
		AllowOverride All
  		
		<Limit GET POST>
 			Order allow,deny
  			Allow from all
  		</Limit>
 		
		<LimitExcept GET POST>
  			Order deny,allow
  			Deny from all
  		</LimitExcept>
	</Directory>

	ErrorLog /home/site/logs/apache-error.log

	LogLevel warn

	CustomLog /home/site/logs/apache-access.log combined

	php_admin_value open_basedir "/home/site/:."
	php_admin_value upload_tmp_dir "/home/site/tmp"
	php_admin_value session.save_path "/home/site/tmp"
</VirtualHost>

cat /etc/group :
www-data:x:33:
site:x:1000:www-data

При такой конфигурации Apache работает отлично, с правами проблем нет, а вот nginx не хочет отдавать статитику не обращаясь к apache.
avatar
По кофигу у меня вопросов нет.
Но вот судя по строке из лога попробуйте дать права 655 на файлы
avatar
Пробовал менять права. В том числе ставил 7777, не помогло. Менял владельца на site:www-data, так же не помогло. Пока статика и динамика работают через apache, при такой работе нету смысла в лишнем звене.
Используемые версии: Apache 2.2.22, nginx 1.2.1 (из репозитория самого nginx). Есть ли смысл пробовать откатить nginx, в надежде, что проблема в нем?
avatar
Проверьте доступы по пути /home/site.ru/public_html/uploads/images/screenshots/ic0.4.png скорее всего в одну их папок не дает залезть пользователю входящему в группу site
avatar
Спасибо вам. Проблему решил. Оказывается nginx необходимо иметь права на выполнение (chmod g+x) для группы, у меня на одну из папок стояли права 766, как оказалось одних прав для записи и чтения для nginx мало.
avatar
Рад что ВЫ разобрались!
avatar
Здравствуйте, Artful. Недавно вот решил попробовать свои силы в установке и конфигурации веб-сервера на основе Ubuntu Server 12.04 LTS. Всё настраивал по вашей статье. В итоге доступ к mysql есть, phpinfo выводится нормально. Установил phpmyadmin — открывается форма для ввода логина и пароля, однако почему-то никак не хотят отображаться изображения.

В логах apache пишется следующее:

[Sun Jul 08 14:44:10 2012] [notice] caught SIGTERM, shutting down
[Sun Jul 08 14:44:11 2012] [notice] Apache/2.2.22 (Ubuntu) PHP/5.3.10-1ubuntu3.2 with Suhosin-Patch configured — resuming normal operations
[Sun Jul 08 15:12:29 2012] [error] [client 127.0.0.1] phpmyadmin: Failed to load /etc/phpmyadmin/config-db.php. Check group www-data has read access., referer: test.mysite.com/phpmyadmin/

В логах nginx пишется следующее:

2012/07/08 14:46:33 [error] 22201#0: *37 "/usr/share/nginx/html/phpmyadmin/index.html" is not found (2: No such file or directory), client: 127.0.0.1, server: localhost, request: «GET /phpmyadmin/ HTTP/1.1», host: «127.0.0.1»
directory), client: 192.168.1.1, server: test.mysite.com, request: «GET /phpmyadmin/themes/pmahomme/jquery/jquery-ui-1.8.custom.css HTTP/1.1», host: «test.mysite.com», referrer: «test.mysite.com/phpmyadmin/»
2012/07/08 15:12:29 [error] 22201#0: *109 open() "/var/www/test.mysite.com/www/phpmyadmin/themes/pmahomme/img/logo_right.png" failed (2: No such file or directory), client: 192.168.1.1, server: test.mysite.com, request: «GET /phpmyadmin/themes/pmahomme/img/logo_right.png HTTP/1.1», host: «test.mysite.com», referrer: «test.mysite.com/phpmyadmin/»
2012/07/08 15:12:29 [error] 22201#0: *113 open() "/var/www/test.mysite.com/www/phpmyadmin/themes/pmahomme/img/b_help.png" failed (2: No such file or directory), client: 192.168.1.1, server: test.mysite.com, request: «GET /phpmyadmin/themes/pmahomme/img/b_help.png HTTP/1.1», host: «test.mysite.com», referrer: «test.mysite.com/phpmyadmin/»
2012/07/08 15:12:29 [error] 22201#0: *112 open() "/var/www/test.mysite.com/www/phpmyadmin/themes/pmahomme/img/logo_right.png" failed (2: No such file or directory), client: 192.168.1.1, server: test.mysite.com, request: «GET /phpmyadmin/themes/pmahomme/img/logo_right.png HTTP/1.1», host: «test.mysite.com», referrer: «test.mysite.com/phpmyadmin/»
2012/07/08 15:12:30 [error] 22201#0: *105 open() "/var/www/test.mysite.com/www/phpmyadmin/themes/pmahomme/img/input_bg.gif" failed (2: No such file or directory), client: 192.168.1.1, server: test.mysite.com, request: «GET /phpmyadmin/themes/pmahomme/img/input_bg.gif HTTP/1.1», host: «test.mysite.com», referrer: «test.mysite.com/phpmyadmin/»

При обращении к test.mysite.com/phpmyadmin — выводится форма с запросом логина и пароля, НО БЕЗ ИЗОБРАЖЕНИЙ.
При обращении к 127.0.0.1//phpmyadmin — выводится ошибка 404 Not Found.

Выходит, nginx пытается выдавать статику с адреса 127.0.0.1//phpmyadmin, но так как там 404 Not Found, то выдавать-то и нечего.

Подскажите, пожалуйста, что я делаю не так и/или что нужно сделать дополнительно к уже содеянному, дабы картинки нормально выводились на phpmyadmin и всём прочем?

С уважением, Геннадий.
avatar
Здравствуйте Геннадий.
Вы решительный, но не внимательный! Посмотрите в статье, там этот момент освящен.
Т.к. у нас Nginx работает от пользователя www-data, то он не сможет получить доступ к содержимому домашней директории пользователя example, но при создании была создана одноименная группа, в нее нам необходимо добавить пользователя www-data.
usermod -a -G example www-data


Таким образом, в будущем при создании нового виртуального хоста нам необходимо добавить пользователя www-data в группу с именем нового пользователя.

Все пропускают этот абзац, я его теперь еще и выделил… :)
Основным симптомом что вы этого не сделали-отсутствие изображений на странице, которую вы запрашиваете с вашего сервера т.к. Nginx читает только графические файлы, то из-за отсутствия прав доступа к ним, он сделать этого не сможет, и страница генерируется без изображений-решение, добавить пользователя www-data (от имени которого работает Nginx) в одноименною группу пользоваться, от имени которого работает виртуальный хост Apache!

Возьмите себе за правило, сначала залезать в логи web сервера, из них можно узнать 99% информации, если бы вы это сделали, то там удивили что у nginx не хватает прав доступа, на чтение файлов. Error.log-очень полезная штука…
avatar
Artful, как Вам сказать… Читая Вашу статью, я как раз-таки обратил своё внимание на команду usermod -a -G example www-data и её вводил. При установке Ubuntu Server я создал пользователя Webuser (дабы не сидеть под root'ом). Соответственно, была создана одноимённая директория в home — /home/Webuser/. DocumentRoot веб-сервера настроен как /var/www/test.mysite.com/www/, а не /home/example/www. Правильно ли я понимаю, что для успеха мне понадобится переконфигурировать nginx и apache так, чтобы DocumentRoot стал /home/webuser/ (соответственно, команда будет usermod -a -G webuser www-data)?

P.S. Прошу прощения, я запутался.
avatar
Корневая директория сайта у Nginx и Apache, должна находиться в одном месте, в вашем случае /var/www/test.mysite.com/www/
С добавлением в группу-именно так.

Прочитав ваш комментарий я сам запутался… :)
avatar
Попробую изъясниться яснее. При установке убунты я создал пользователя webuser (/home/webuser). Руководствуясь Вашей статьёй я всё выполнил дословно, только вместо пути /home/webuser/test.mysite.com/www, я использовал путь /var/www/test.mysite.com/www. Соответственно, в моём случае команда была usermod -a -G webuser www-data. Итог — я остался без картинок. Надобно переделать конфигурацию, чтобы всё сводилось к пути /home/webuser/test.mysite.com с подачей команды usermod -a -G webuser www-data?
avatar
нет, разберитесь с путями к корневой директорий сайта и правами доступа.
avatar
Большое спасибо, всё получилось с 1 раза :D
avatar
буду теперь мозговать над memcache + apc + sphinx
avatar
Дело за малым… :)
avatar
Блин, бред какой то, создал изначально 2 виртуальных хоста под кохану и под лс. Сейчас птаюсь так же добавить виртуальный хост — нифига не отображает, никак не пойму в чём дело уже по 1000 раз все ребутил — не помогает. Но началось это после включения мод реврайта и по локальному ипшнеку сразу отображает сайт на лс.
avatar
dl.dropbox.com/u/99332327/img/xenti.png вообще очень смущает точка после org, но смотрел все во всех enabled и availble нуту её.
avatar
в логах /home/xenti/logs ничего нет, я даже делал chmod -R 0777 нифига никаких ошибок типа, но при этом не открвает xenti.org
avatar
У вас создана А запись в DNS?
avatar
Неа, я на локалхосте все делал для теста, установить — установил) Настроил 2 виртуальных хоста и вот решил сделать 3 чтобы проверить, как справится новый ls с переходом с 0.51 до 1.01 + новый шаблон. В итоге тупил часа 3 ничего не получилось, ну я и сделал задуманное на одном из вхостов, но тема ещё актуальна :D
avatar
Конфиг, проблемного хоста, в студию…
avatar
avatar
А символические ссылки созданы?
avatar
Да)
avatar
А что говорят логи по данному вопросу?
avatar
На диру/home/xenti/logs стоят права 0777 но в логах ничего нет! специально щяс почистил логи апача и энжиникса рестартнул всё посмотрел:

в /home/xenti/logs -везде пустота
в /var/log/apache/error.log — [Wed Sep 05 22:32:42 2012] [notice] caught SIGTERM, shutting down
[Wed Sep 05 22:32:43 2012] [notice] Apache/2.2.22 (Ubuntu) PHP/5.3.10-1ubuntu3.2 with Suhosin-Patch configured — resuming normal operations
в /var/log/nginx/error.log — пустота
avatar
а по этому пути логов не создалось?
/home/xenti/logs/nginx_error.log
avatar
В основном клнфиге nginx.comf, есть секция:
server {
listen 80;
location / {
root /home/www;
}

Попробуйте ее комментировать.
avatar
Прошу прощения что давно не появлялся, переводил свой сайт на ls с 0.51 yf 1.01 в связи с этим появилось много второстепенных задач. Завтра по возможности попробую и отпишу о результате.
avatar
Здравствуйте уважаемый. подскажите пожалуйста, у меня проблема с модулем libapache2-mod-rpaf, на сайте все ip отображаются как 127,0,0,1 может быть я где то что то пропустил?
avatar
Поспешил :) Почитал в просторах инета
Открываем sudo nano /etc/apache2/sites-available/example.org

И добавляем перед

<IfModule rpaf_module>
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1
RPAFheader X-Real-IP


Перезапускаем Апач
avatar
Здорово, что ВЫ сами разобрались!
avatar
Здравствуйте.Заказал я у хостера Vps Linux на нем стоит nginx 0.5.3, подскажите как обновить nginx до версии 1.2.4 или 1.0.1
P.S Я новичек в этом деле
avatar
Здравствуйте.
Вот посмотрите в статье howitmake.ru/blog/ubuntu/80.html там был пример подключения сторонних репозиториев, от nginx.com
avatar
как быть если при перезагрузке апач выдает
apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
 ... waiting apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName

при заходе по доменному имени выводит
Forbidden

You don't have permission to access / on this server.

явно апач работает.
а если заходить по ип то
404 Not Found

nginx/1.0.4

работает nginx, также не могу ничего открыть с закинутых файлов сайта. Хотя вывод test.php выводило.
avatar
Здравствуйте.
По поводу Apapche добавьте в apache2.conf следующее:
ServerName localhost


По второму пункту:
Нет прав доступа к директории, посмотрите error.log виртуального хоста, там все написано.
По третьему пункту:
виртуальный хост создан, но думаю что-то путями, также обычно все написано в логах виртуального хоста nginx.
avatar
Я так же присвоил права
usermod -a -G dima www-data

а какие права должны быть непосредственно на файлах ?
dima:www-data или dima:dima?
avatar
пользователь www-data должен иметь права на чтение в директории dima, но права на запись иметь только в те что непосредственно разрешены.
Эти вопросы поднимались не сколько раз в комментариях, посмотрите комемнты выше…
avatar
спасибо, а как теперь прикрутить phpmyadmin?
читал у вас статью где описывается как прикрутить если установлен nginx но там не соответствие с данными настройками. Тут как то по другому?
avatar
а Apapche прикручивается намного легче, выбираете из списка apache и ставите, остальное настроится автоматически
avatar
значит вот тут проблема, я по этому ману делал howitmake.ru/blog/ubuntu/93.html
Там указано было не выбирать. Теперь нужно приложить ума ))
avatar
Вы почитайте название статьи, это многое объясняет.
Кстати про Apache там тоже есть, даже картинка присутствует… :)
avatar
установил я phpmyadmin но столкнулся с проблемой. После захода в phpmyadmin мы в низу видим.

какие то ошибки и как решать а не в курсе, пока что обучаюсь.
в углу видно что картинка не отображается. Думаю права, но куда их ставить то?
phpmyadmin запускается по адресу example.org/phpmyadmin Но ясно дело что в директории example/www/нету phpmyadmin

вот как то так.
странички сайта загружаются, фото видны.
подскажите куда капать?
avatar
По поводу отображения картинок, посмотрите комментарии к статье, вопрос поднимался пару раз точно-проблема с правами доступа.
По поводу путей к phpmyadmin посмотрите в конфигах Apache, там все есть.
А по поводу допиливания phpmyadmin так вам и ссылки приложены, что делать и даже ссылка на документацию.
avatar
Artful — у меня к Вам вопрос: как организовать https при связке apache2-mpm-itk + Nginx? — у меня по какой то причине не получается. Есть строки
SSLProtocol all
SSLSessionCacheTimeout 600
SSLSessionCache shmcb:/tmp/apache/ssl_gcache_data(1048576)
php_admin_value open_basedir "none"
в файле
/etc/apache2/httpd.conf
Также есть Virtual host вида:
<VirtualHost _default_:443 127.0.0.1:8081>
	ServerAdmin admin@site.ru
	DocumentRoot /var/www/site.ru
	ServerName site.ru
    ServerAlias www.site.ru *.site.ru
	AssignUserId www-data www-data

	 <Directory /var/www/site.ru>
	 	allow from all
	 	Order allow,deny
	 	Options -Indexes +FollowSymLinks -MultiViews
	 	AllowOverride all
	 </Directory>
	 	 <Directory /usr/share/phpmyadmin>
	 	allow from all
	 	Order allow,deny
	 	Options -Indexes +FollowSymLinks -MultiViews
	 	AllowOverride all
	 </Directory>
	  Alias /phpmyadmin /usr/share/phpmyadmin
	ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
	<Directory "/usr/lib/cgi-bin">
		AllowOverride None
		Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
		Order allow,deny
		Allow from all
	</Directory>
	ErrorLog ${APACHE_LOG_DIR}/site.ru.error.log
	# Possible values include: debug, info, notice, warn, error, crit,
	# alert, emerg.
	LogLevel warn
	CustomLog ${APACHE_LOG_DIR}/site.ru.access.log combined
</VirtualHost>

В файле
/etc/apache2/ports.conf
Указал:
Listen 127.0.0.1:8081
Listen 127.0.0.1:443
однако Nginx не проксирует, почему — непонятно…
avatar
Вам не нужно навастривать https в Apache, у вас ведь Nginx наружу торчит настраиваете https на нем, согласно документации к нему
avatar
Я попробовал, но почему то страница зашифрована лишь частично (на Drupal 7) — видимо что то не сделал, при php-FPM всё чётко работало.
avatar
Что вы имеете в виду под- зашифрована лишь частично?
https соединение или установлено или не установлено, третьего варианта нет…
avatar
Вот скриншот сообщения из Mozilla Firefox:
avatar
Воспользовался советом добавить в локейшн код
proxy_set_header X-Url-Scheme      $scheme;
однако теперь стили страницы — не отображаются. Я вероятно не настроил Mod_RPAF или есть что то ещё. приведу свои конфиги: Apache Vhost:
<VirtualHost 127.0.0.1:8081>
	ServerAdmin admin@site.ru
	DocumentRoot /var/www/site.ru
	ServerName site.ru
    ServerAlias www.site.ru *.site.ru
	AssignUserId www-data www-data
	# SSLEngine on
	# SSLCertificateFile /etc/ssl/certs/site.ru.crt
    # SSLCertificateKeyFile /etc/ssl/private/site.ru.key
	 <Directory /var/www/site.ru>
	 	allow from all
	 	Order allow,deny
	 	Options -Indexes +FollowSymLinks -MultiViews
	 	AllowOverride all
	 </Directory>
	     SetEnvIf X-Forwarded-Proto https HTTPS=on
	     RewriteEngine on
	 	# <Directory /usr/share/phpmyadmin>
	 	# allow from all
	 	# Order allow,deny
	 	# Options -Indexes +FollowSymLinks -MultiViews
	 	# AllowOverride all
	 #</Directory>
	 # Alias /phpmyadmin /usr/share/phpmyadmin
	ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
	<Directory "/usr/lib/cgi-bin">
		AllowOverride None
		Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
		Order allow,deny
		Allow from all
	</Directory>
	ErrorLog ${APACHE_LOG_DIR}/site.ru.error.log
	# Possible values include: debug, info, notice, warn, error, crit,
	# alert, emerg.
	LogLevel warn
	CustomLog ${APACHE_LOG_DIR}/site.ru.access.log combined
</VirtualHost>


Nginx Vhost:

server {
       listen 443 ssl;
       listen 80;
       ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
       ssl_prefer_server_ciphers on;
       ssl_ciphers ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
       ssl_certificate /etc/ssl/certs/site.ru.crt;
       ssl_certificate_key /etc/ssl/private/site.ru.key;
       ssl_session_cache shared:SSL:10m;
       ssl_session_timeout 10m;
       server_name site.ru www.site.ru;
       access_log /var/log/nginx/access.log main;
       root /var/www/site.ru;
       index index.php;
       if ($http_host != "site.ru") {
       rewrite ^(.*) $scheme://site.ru$1 permanent;
       }
        client_body_buffer_size 1m;
        proxy_buffering on;
        proxy_buffer_size   128k;
        proxy_buffers   4 256k;
        proxy_busy_buffers_size   256k;
        # Avoid image hotlinking from other sites and allow browsers to cache
        location ~* \.(js|css|jpg|jpeg|gif|png|svg|ico)$ {
                valid_referers www.example.com blocked none ;
                if ($invalid_referer) {
                        return 403;
                        break;
                }
                if (-f $request_filename) {
                        expires      30d;
                        add_header Cache-Control public;
                        break;
                }
        }
        # Make sure files with the following extensions do not get loaded by nginx because nginx would display the source code, and these files can contain PASSWORDS!
        location ~* \.(engine|inc|info|install|make|module|profile|test|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)$|^(\..*|Entries.*|Repository|Root|Tag|Template)$|\.php_ {
                deny all;
        }
        # Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
        location ~ /\. {
                deny all;
                access_log off;
                log_not_found off;
        }
        # Pass on all PHP requests to the Apache backend
        location ~* \.php$ {
         proxy_pass http://localhost:8081;
         proxy_set_header Host              $http_host;
         proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
         proxy_set_header X-Forwarded-Proto $scheme;
         proxy_set_header X-Real-IP         $remote_addr;
         proxy_set_header X-Url-Scheme      $scheme;
         proxy_max_temp_file_size 0;
         proxy_redirect off;
        }
        location / {
                try_files $uri @cache;
        }
        location @cache {
                if ($query_string ~ ".+") {
                        return 405;
                }
				# pass requests from logged-in users to Apache
                if ($http_cookie ~ "DRUPAL_UID" ) {
                        return 405;
                } # pass POST requests to Apache
                if ($request_method !~ ^(GET|HEAD)$ ) {
                        return 405;
                }
                error_page 405 = @drupal;
                # do not allow browsers to cache HTML
                add_header Expires "Sun, 19 Nov 1978 05:00:00 GMT";
                add_header Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0";
                # serve requested content from the cache if available, otherwise pass the request to Apache
                try_files /cache/normal/$host/${uri}_.html /cache/perm/$host/${uri}_.css /cache/perm/$host/${uri}_.js /cache/$host/0$uri.html /cache/$host/0${uri}/index.html @drupal;
        }
        # This sends the php to Apache, running on port 8080
        location @drupal {
         proxy_pass http://localhost:8081;
         proxy_set_header Host              $http_host;
         proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
         proxy_set_header X-Forwarded-Proto $scheme;
         proxy_set_header X-Real-IP         $remote_addr;
         proxy_set_header X-Url-Scheme      $scheme;
         proxy_max_temp_file_size 0;
         proxy_redirect off;
        }
        error_page 404 = index.php;
        # redirect server error pages to the static page /50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
                root   html;
        }
}
avatar
права доступа дают возможность web серверу доступ к сертификатам?
что в логах по этому поводу?
avatar
В логах пусто, с правами доступа всё в порядке. Возможно проблема в самом Drupal — на php-FPM с этим всё было в порядке но была проблема: при стандартных тестах часто появлялась ошибка 500 и сообщение «путь /путь? аргументы не найден» — при этом конфигурация виртуального хоста была практически идеальной — то есть видимых причин не было и в логах — ничего вразумительного.
avatar
нет php-fpm тут не причем, как и движок сайта, они не участвуют в установлении соединения.
у проблемы может быть 2 варианта:
1) нет доступа к ключу
2) глючит сам web сервер
avatar
В общем почитал здесь: www.metaltoad.com/blog/running-drupal-secure-pages-behind-proxy и всё стало ясно. также моя невнимательность виновата: вместо
# Avoid image hotlinking from other sites and allow browsers to cache
        location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf|js)$ {
                valid_referers www.example.com blocked none ;
                if ($invalid_referer) {
                        return 403;
                        break;
                }
                if (-f $request_filename) {
                        expires      30d;
                        add_header Cache-Control public;
                        break;
                }
        }


Требовалось указать:
# Avoid image hotlinking from other sites and allow browsers to cache
        location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf|js)$ {
                valid_referers site.ru blocked none ;
                if ($invalid_referer) {
                        return 403;
                        break;
                }
                if (-f $request_filename) {
                        expires      30d;
                        add_header Cache-Control public;
                        break;
                }
        }
А именно: site.ru — мой сайт, вместо www.example.com (стили страниц стали отображаться корректно) ещё по части прокси нашёл здесь: brainstorm.name/node/462.html в принципе всё теперь работает, что и требовалось доказать. Просто было необходимо проявить внимание к деталям. Https в Apache настраивать не стал, чтобы nginx мог слушать порт 443 я настроил в файле
/etc/apache2/ports.conf
Listen 0.0.0.0:444 (по причине того что иначе apache занимает порт 443 под нужды ip v6 и данный порт становится для nginx'a недоступен), как скомпилировать apache без ip v6 можно почитать здесь: www.apachelounge.com/viewtopic.php?p=14560
avatar
В целом решение годное, вот только компиить из исходников в пакетном дистрибутиве-не очень правильно.
avatar
ваши статьи — супер!
но у меня тоже есть вопрос :)
при команде — /etc/init.d/apache2 restart
выдает:

Syntax error on line 23 of /etc/apache2/sites-enabled/teamspeak.danfis.eu:
Invalid command 'AssignUserId', perhaps misspelled or defined by a module not included in the server configuration
Action 'configtest' failed.
The Apache error log may have more information.
...fail!
avatar
Пишет что синтаксическая ошибка.
Вы точно установили apache2-mpm-itk, просто обычная версия Apache не поддерживает данную директиву.
Правда статья писалась довольно давно и что-то могло измениться, проверить не могу т.к. я от данной схемы отказался, оставив только Nginx.
avatar
сделала все по инструкции, но при установке Joomla у меня проблема такого плана:
запускаю инсталятор site.ru, картинки отображаются, а вот кнопка «Далее» не срабатывает, если обратиться напрямую к апачу — в адресной строке прописать порт апача: site.ru:81, то кнопка «Далее» начинает действовать
avatar
что в логах Nginx?
avatar
перед пробой вычистила /home/site.ru/logs/nginx_error.log, после попытки установить Joomla файл nginx_error.log остался чистым
avatar
а в /var/log/nginx?
avatar
честно говоря не знаю какой файл тут смотреть, но последний измененный access.log вот что поведал:

[16/Mar/2013:10:12:26 +0400] "-" 400 0 "-" "-" "-"
[16/Mar/2013:10:12:26 +0400] "-" 400 0 "-" "-" "-"
[16/Mar/2013:10:12:26 +0400] "-" 400 0 "-" "-" "-"
avatar
Все должно работать, судя по логам у вас полный порядок
avatar
если нажать на кнопку, что появляется в access логе nginx и apache?
avatar
а может быть проблема в том, что я закачала инсталлятор joomla под рутом и разархивировала тоже?
avatar
к сожалению, я не умею получать информацию телепатическим путем, попробуйте задать права на файлы под тем пользователем, под которым у вас работает web сервер.
avatar
У меня такая же проблема как и у вас. У вас получилось её решить?
Кстати данные сообщения "-" 400 0 "-"… в access.log показываются при обращении с chrome, в случае же Firefox таких сообщений нет, однако всё равно не получается продолжить установку joomla 3
avatar
Лично я вам, вообще рекомендую отказаться от подобной связки и поставить Nginx+php+Mysql-hf, работает намного лучше.
Просто данная статья писалась довольно давно и имеет смысл только в крайне-специфическом круге задач.
Рекомендую ознакомится с соответствующей статьёй по настройке Nginx+php-fpm+mysql+memcahed все это работает шустрее чем на Apache
avatar
Привет, в данный момент у меня установлен debian minimal от хостинга, с ихним лампом. Хочу перед апачем поставить nginx, но не понимаю одного ньюанса в phpinfo.php прописано Server API Apache 2.0 Handler



Вопрос может показатся слегка туповатым — прокатит ли вариант просто поставить nginx из репозитория, без php5-fpm и повесить апач на 8080 а икс на 80? Я почему спрашиваю, как то уже хотел так сделать sudo aptitude install nginx php5-fpm но там появилось сообщение хотите ли вы что то удалить, я решил тогда не рисковать ибо времени было в притык. Вроде fpm нужен только есть используется голый апач? Или можно смело ставить nginx + php5-fpm не опасаясь, что он потрет этот апаче хэндлер?
avatar
Другими словами я хочу просто поставить nginx перед апачем особо не вмешиваясь в работу самого апача. Использовать nginx как прокси для статики и заодно защитится от слоулори лимитировав кол подключений.
avatar
Поставил, если будете гуглить ни за что не следуйте этому гайду, убил час, только потом догадался отсюда взять, настройки nginx.
avatar
Семён Семёныч… ;)
avatar
Доброе утро! я что запнулся после настройки nginx после как все сделал по инструкции перезапуска и он мне дает вот эту ошибку nginx: [emerg] open() "/var/log/nginx/error.log" failed (2: No such file or directory). Я так понимаю это вторая строчка файла, в разделе [emerg], но такого раздела выше указанных настройках нету… и где мне эту раздел искать? и вообще есть какая не будь утилита которая ищет слова в файлах, как это к примеру делает тотал коммандер
avatar
/var/log/nginx/ -путь существует?
avatar
Да создал его, но потом пишет вот что
Restarting nginx: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
nginx.
avatar
Что тут написано?
avatar
попробуйте воспользоваться переводчиком, решение проблемы на 99% у вас уже есть. Вы справитесь!
avatar
Хорошо нашел я где не дописал я порт 8080, теперь пишет вот что мне пишет
Restarting nginx: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
nginx.

перевод
Перезапуск nginx: nginx: файл конфигурации /etc/nginx/nginx.conf синтаксис ok
nginx: файл конфигурации /etc/nginx/nginx.conf проверка прошла успешно
nginx.

далее делаю команду
echo '<?php phpinfo(); ?>' > /home/mysite/www/index.php

выдает ошибку 404((
avatar
Да не надо мне переводить я это и так знаю :)
Я хочу чтобы вы сами догадались ;)
Ошибка 404 что означает?
avatar
то что страницы не существует
avatar
вот что мне отвечает на команду nmap
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 5.9p1 Debian 5ubuntu1 (protocol 2.0)
80/tcp open http nginx 1.0.4
8080/tcp open http Apache httpd
Service Info: OS: Linux

Меня смущает вот это (httpd) это так и должно быть?
avatar
Файл в директори создан?
Права доступа позволяют его читать пользователю www-data?
httpd это нормально!
avatar
да создан права дал 777
-rwxrwxrwx 1 root root 22 марта 22 13:27 index.php
avatar
значит права есть, все должно выполняться.
Смотрите логи, там все написано, почему скрипт не отрабатывает
avatar
Может что-то я напутал, я с начала установил чистую nginx, а потом стал исправлять…
а эту инструкцию можно использовать в качестве то что у меня чистый сервер установлен только SSH и все
avatar
Я ничего не понял
avatar
ладно проехали)) построю по другому вопрос, эта инструкция для локального сервера или для выхода в интенет, а то я не вижу тут внешних ip адресов только самого компа 127.0.0.1
avatar
Камаз отличная машина, но собаки, в упряжке, быстро выдыхаются… © Бородатый анекдот.
Какой IP укажите, тот и будет работать.
avatar
хм спасибо)) а DNS откуда брать? вот просто мои сайты сейчас на платном хостинге вертятся и у них там нужно писать, к примеру dns1.site.ru и dns2.site.ru а у моего роутера прописано статический IP и ДНС к примеру ДНС 8.8.8.8 и ДНС 8.8.8.9 и перед моим сервером стоит роутер, мне вместо 127, нужно везде прописывать 192.168.1.100 адрес статичекского ip сервера? извините за может тупые вопросы, просто мне хочется понять принцып работы
avatar
Для ознакомления
howitmake.ru/blog/FAQ/108.html
сами DNS сервера можно легко нагуглить.
avatar
А это означает что помимо установок nginx + apache2 + mysql + php5 + phpmyadmin + ftpserver мне нужно еще и bind9? это ппц(( я еще не как немогу настроит nginx c apachem))
avatar
нет вам нужно привязать домен, можно воспользоваться коммерческим сервисом или бесплатным например dnsexit.com там кажется 3 домена можно прикрутить, остальное за деньги.
avatar
спасибо)) а вот у меня возникла проблема с этим мануалом по настройки nginx + apache я набираю ip адреса 192.168.1.100 у меня выскакивает Welcome to nginx! но по вашей инструкции путь к сайту лежит /home/mysite/www но там нету не каких файлов в чем причина, хоть все делал как у вас описано выше
avatar
дефонтный конфиг виртуального хоста nginx
avatar
ну я удалил Файл default из /etc/nginx/sites-available/ и из /etc/nginx/sites-enabled/ перезапустил сайт результат тот же ((( Welcome to nginx!
avatar
попробуйте разобраться сами, проблема пустяковая.
avatar
все таки не могу разобраться в чем проблема((
вот настройки nginx
/etc/nginx/sites-available/mysite

listen 80;
server_name homehosts.ru [url]www.homehosts.ru;[/url]
access_log /home/mysite/logs/nginx_access.log;
error_log /home/mysite/logs/nginx_error.log;
location ~* \.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|swf|ico|flv|txt|docx|xlsx)$ {
root /home/mysite/public_html/;
index index.html index.php;
access_log off;
expires 30d;
}
location ~ /\.ht {
deny all;
}
 
location / {
proxy_pass [url]http://192.168.1.100:82/;[/url]
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-for $remote_addr;
proxy_set_header Host $host;
proxy_connect_timeout 60;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_redirect off;
proxy_set_header Connection close;
proxy_pass_header Content-Type;
proxy_pass_header Content-Disposition;
proxy_pass_header Content-Length;
}
}

а это настройки apache2
/etc/apache2/sites-available/mysite

<VirtualHost *:82>
   DocumentRoot /home/mysite/public_html
   ServerAdmin [email]admin@homehosts.ru[/email]
   ServerName homehosts.ru
   ServerAlias [url]www.homehosts.ru[/url]
   ErrorLog /home/mysite/logs/apache_error.log
   CustomLog /home/mysite/logs/apache_access.log combined
<Directory />
#Order Deny,Allow
#Deny from all
Options -ExecCGI -Indexes -Includes +FollowSymLinks
AllowOverride All
  <Limit GET POST>
  Order allow,deny
  Allow from all
  </Limit>
  <LimitExcept GET POST>
  Order deny,allow
  Deny from all
  </LimitExcept>
</Directory>
 
AssignUserId www-data bismuth
 
php_admin_value open_basedir "/home/mysite/:."
php_admin_value upload_tmp_dir "/home/mysite/tmp"
php_admin_value session.save_path "/home/mysite/tmp"
</VirtualHost>

В чем загвоздка?
avatar
Ну вы ведь по IP подключаетесь, подключитесь по имени, все должно работать.
Ваш запрос не содержит имя виртуального хоста, вот вас и перебрасывает на дефортный хост.
avatar
У меня получилось сделать с первого раза с сайта itblog.by/articles/46-ustanovka-i-nastroyka-vebservera-nginx-apache-php-mysql.html

А по этому уроку хоть лбом бейся не работало(((
avatar
Ну слава богу!!! :)
avatar
Все сделал по инструкции, — на php тесте белый экран. Ubuntu 12.04 LTS Precise Pangolin + nginx/1.4.1 + PHP 5.3.10-1ubuntu3.6mysql + mysql Ver 14.14 Distrib 5.5.31
Перечитал все возможные варианты, результат 0
avatar
Значит не все!
Смотрите логи по поводу файла test.php
avatar
Отличная статья. Все сделал. Заработало. Тесты все ок. Залил сайт — все ок, кроме одного скрипта. Из 50 php файликов все открываются нормально, только один выдает 500 (internal server error) ошибку. Права у всех файлов одинаковые. В логах ошибок нет. В access.log —
11.2.1.4 — - [25/Jun/2013:13:11:09 +0300] «GET /context.php?key=75b417c81730a9015547e6926e813997&type=index&format=JSON HTTP/1.1 500 5 „87.222.144.116:81/index.php“ „Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36“
из index.php делается аякс запрос. Гдебы копнуть-то?
avatar
Вы реврайты не прописывали? Просто Nginx делает 10 попыток обработать скрипт и если не получилось, отваливается с 500й ошибкой.
Ну или вариант номер 2-сам скрипт кривой.
avatar
Здравствуйте! Спасибо за толковую статью. Настраивал сервер по вашей статье…все работает как часы…хотелось бы узнать как добавлять поодомены… если можно небольшой мануальчик…

Заранеее благодарен
avatar
А что там сложного, создаете новые виртуальные хосты, и указываете там поддомены (в nginx и apache) перезапускаете web сервера и все должно работать, при условии что у вас созданы записи DNS.
Шаблоны конфигурационных файлов виртуальных хостов, уже есть в статье, просто поменяйте указанные в них доменные имена, на те что нужны вам, ну путь к корневым директориям сайтов-если требуется…
avatar
извините… еще вопрос… не отображает картинки в phpmyadmin
комментарий был удален
avatar
установил без nginx и естественно, apache на 80 порту. Ubuntu 10. Устанавливал Joomla. 754 недостаточно для записи конфигурации. Минимум 755, как исправить?
avatar
Ответ уже в вашем вопросе
дать права…
avatar
т.е. права 755? не каснется ли это безопастности?
avatar
конечно коснется, а у вас есть идеи по лучше?!
Самый безопасный сервер-который выключен из розетки.
А если серьезно, почитайте что дают эти права…
avatar
Я добралась до комманды top )
Вижу несколько процессов apache2 запущенных от рута. Это правильно что от рута?
avatar
update И это до обращения пользователя к сайта, как начинаются обращения, появляются процессы apache от www-data, поэтому меня смущают «рутовские апачи» )
avatar
Все нормально, так и должно быть!
avatar
Есть еще классный пакет htop, он намного удобнее, но его нужно установить…
avatar
Почитала интернет, советуют ставить mod_ruid вместо mpm-itk. Что можете сказать?
avatar
Могу сказать что я ставлю Nginx без Apache :)
avatar
Здравствуйте Artful. Установил сервер по вашей статье, всё работает отлично, но только на одном виртуальном хосте и сайте. проблемы возникают после добавления следующего хоста и сайта. Проблемы такие: 1) либо не работает 2-ой сайт и выводит ошибку 403 или просто пустую страницу, 2) либо аналогичная ситуация со всеми сразу добавленными сайтами! помогите разобраться!
avatar
Да и ещё сайты на cms Wordpress
avatar
смотрите логи ошибок, там обычно написана причина глюков
avatar
смотрел логи нжинкса и апач они пусты. возможно не там смотрел! подскажите где посмотреть
avatar
да и при этих проблемах свободно отображается test.php
avatar
Если вы делали по статье, то логи виртуального хоста должны лежать
nginx
access_log /home/example/logs/nginx_access.log;
error_log /home/example/logs/nginx_error.log;


apache
ErrorLog /home/example/logs/apache_error.log
CustomLog /home/example/logs/apache_access.log combined


Естественно, пути к файлам логов указываем свои.
avatar
спасибо переустановлю гляну
avatar
Зачем переустанавливать, просто поправьте пути в конфигах и перезапустите сервера.
avatar
Здравствуйте, уважаемый автор.

Спасибо за хорошую статью.
Возникла проблемка с php директивой include_path.
Юзаю Yii и php 5.4.
Выдает ошибку


Полагаю, надо для каждого хоста прописывать еще include_path. Посоветуете что в данном случае будет являться решением проблемы?
avatar
Сам спросил, сам отвечаю.

При создании виртуального хоста строка с open_basedir не нужна.
avatar
Вот, я вам крайне рекомендую прочитать про назначение open_basedir — весьма полезная штука…
Есть что добавить? Регистрируйся и оставляй комментарии!