Pull to refresh

Мультидоменный сервер nginx -> apache

Reading time3 min
Views9.5K
Приветствую! Размещаю по просьбе друга статью.
У него к сожалению пока нет регистрации на хабе, а у меня мало кармы что бы выслать приглашение.
Если есть возможность и понравились статья вышлите ему инвайт, или можно попробовать поднять мне карму что бы я мог выслать ему инвайт.

Итак задача:
Организовать удобное администрирование многодоменного web сервера.
Модель системы: linux -> nginx -> apache -> php -> mysql.

Раньше у меня для каждого домена были отдельные конфиги для nginx и apache,
и для добавления нового хоста требовалось добавить как минимум 2 конфига.

Работа была организована удобно. По сути, были 2 скрипта. 1 для добаления хоста к nginx, другой для apache. (ещё есть скрипт добавления хоста в bind но это другая история).

Но и это было не удобно в условия добавления удаления хостов… иногда забыл nginx прописать, иногда в апаче чтото не то…
Решено было следующим образом:



Принято за правило ввести следующую структуру сервера:

/home/htdocs/[имя домена]/www

И учитывая этот факт были разработаны универсальные конфиги для nginx и apache:

nginx
user www-data;
worker_processes 2;

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

events {
worker_connections 1024;
}

http {

include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;

# log options
log_format main '$host: $remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';

# nginx options
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65 20;

# fastcgi
#fastcgi_intercept_errors on;

server {
listen 80;

location / {
proxy_pass 127.0.0.1:81/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
}

# Static files location
location ~* \.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|swf)$
{
if (!-d /home/htdocs/$host/www ) {
set $cur_host "default";
access_log '/var/log/nginx/default.log' main;
}
if (-d /home/htdocs/$host/www ) {
set $cur_host $host;
access_log '/var/log/nginx/host_access.log' main;
}
root /home/htdocs/$cur_host/www;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.ht {
deny all;
}
}
}


Притом в случае необнаружения хоста данные берётся из /home/htdocs/default/www

Универсальный ВиртуалХост для apache:
NameVirtualHost *
<VirtualHost *>
ServerAdmin support@gmail.com
UseCanonicalName Off

VirtualDocumentRoot /home/htdocs/%-2+/www
php_admin_value auto_prepend_file /home/htdocs/fix_doc_root.php

DirectoryIndex index.php index.html index.htm
<Directory />
Options FollowSymLinks
AllowOverride All

<Directory /home/htdocs/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all


ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all


ErrorLog /var/log/apache2/error.log

# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn

CustomLog /var/log/apache2/access.log combined
ServerSignature On

Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128






За основу взят стандартный шаблон виртуалхоста.
отдельное внимание обращаю на следующее:
1. необходимо подключить модуль vhost_alias
# a2emod vhost_alias

2. VirtualDocumentRoot /home/htdocs/%-2+/www
%-2+ означает по сути последние 2 части доменного имени из запроса.
т.е. если запрос идёт на sub.domain.ru то DocRoot будет /home/htdocs/domain.ru
если нужно полное имя запрошенного домена просто заменяем %-2+ на $0

3. Всё бы было замечательно, но при такой конфигурации Апач отдаёт в скрипты неверный $_SERVER[«DOCUMENT_ROOT»]!!!
Для исправления этой досадной штуки используем директиву
php_admin_value auto_prepend_file /home/htdocs/fix_doc_root.php

Содержание скрипта /home/htdocs/fix_doc_root.php:
<?
$l = explode("/",$_SERVER['SCRIPT_FILENAME']);
$DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"] = implode("/",Array( $l[0], $l[1], $l[2], $l[3], $l[4]));
?>


Благодарю за внимание.

Данный пост размещён по моей просьбе. Сам я не имею регистрации. Если понравилась статья — glukas.lss@gmail.com.
Сергей Ляпко
Tags:
Hubs:
Total votes 88: ↑72 and ↓16+56
Comments79

Articles