Быстрая настройка Nginx+Apache на Centos 5.x с использованием VirtualHost

И так, начинаем с установки Nginx. Для этого нам будет необходим CentAlt репозитарий, инструкция по установке тут. После установки репозитария:

yum install nginx

Теперь перенастроим Apache, для этого открываем etc/httpd/conf/httpd.conf и меняем там NameVirtualHost на:

NameVirtualHost 127.0.0.1:8080

так же меняем открывающий таг каждого виртуального хоста:

<VirtualHost 127.0.0.1:8080>

В принципе с Apache-м все, переходим в /etc/naginx и открываем nginx.conf. И так, общие параметры:

user nginx;
worker_processes 4;
error_log /var/log/nginx/error.log debug;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}

Параметры http сервера:

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main ‘$remote_addr — $remote_user [$time_local] $status ‘
‘»$request» $body_bytes_sent «$http_referer» ‘
‘»$http_user_agent» «http_x_forwarded_for»‘;
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
#Архивирование контента
gzip on;
gzip_min_length 1100;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain application/xml application/x-javascript text/javascript text/css;
gzip_disable «msie6»;
gzip_disable Firefox/([0-2]\.|3\.0);
gzip_disable Chrome/2;
gzip_disable Safari;
gzip_comp_level 3;

И теперь для каждого Виртуального хоста должна быть следующая запись:

server {
listen 80;
server_name teaseo.ru www.teaseo.ru;
access_log /var/log/nginx/host.access.log main;
location / {
proxy_pass http://127.0.0.1:8080/;
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;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 10m;
}

Если вы ходите кешировать какой-то контен, то просто добавьте в описание:

location /uploads/files {
add_header Content-type application/octet-stream;
internal;
}
location /uploads/img {
#Кеширум картинки месяца на 4
expires 4M;
#Кешируем везде (и на прокси и на клиентах)
add_header Cache-Control public;
}
location /cache/tumb/ {
#Кеширум картинки месяца на 4
expires 4M;
#Кешируем везде (и на прокси и на клиентах)
add_header Cache-Control public;
}

Теперь полный конфиг, что бы не запутаться что куда и как:

user nginx;
worker_processes 4;
error_log /var/log/nginx/error.log debug;
pid /var/run/nginx.pid; events {
worker_connections 1024;
}
## Timeouts
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main ‘$remote_addr — $remote_user [$time_local] $status ‘
‘»$request» $body_bytes_sent «$http_referer» ‘
‘»$http_user_agent» «http_x_forwarded_for»‘;
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
gzip on;
gzip_min_length 1100;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain application/xml application/x-javascript text/javascript text/css;
gzip_disable «msie6»;
gzip_disable Firefox/([0-2]\.|3\.0);
gzip_disable Chrome/2;
gzip_disable Safari;
gzip_comp_level 3; server {
listen 80;
server_name teaseo.ru www.teaseo.ru;
access_log /var/log/nginx/host.access.log main;
location / {
proxy_pass http://127.0.0.1:8080/;
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;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 10m;
}
}
server {
listen 80;
server_name wot-news.com www.wot-news.com;
access_log /var/log/nginx/host.access.log main;
root /var/www/vhosts/wot-news.com/http;
expires epoch;
location / { proxy_pass http://127.0.0.1:8080/;
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;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 10m;
}
location /uploads/files {
add_header Content-type application/octet-stream;
internal;
}
location /uploads/img {
#Кеширум картинки месяца на 4
expires 4M;
#Кешируем везде (и на прокси и на клиентах)
add_header Cache-Control public;
}
location /cache/tumb/ {
#Кеширум картинки месяца на 4
expires 4M;
#Кешируем везде (и на прокси и на клиентах)
add_header Cache-Control public;
}
}
}

PHP Warning: PHP Startup: fileinfo: Unable to initialize module

Вот такое предупреждение я стал получать при выполнении команды php -v:

PHP Warning: PHP Startup: fileinfo: Unable to initialize module

решение оказалось банально простым, необходимо выполнить :

pecl install fileinfo memcache

Php Устанавливаем потдержку Firebird

Сижу значиться я, никого не трогаю, что-то програмлю и тут звонок, «Нужно срочно установить модуль interbase.so» на одном из сервер под управлением CentOS 5.5. Ну дело не хитрое, google быстро дает короткий FAQ и по нему начинаю устанавливать. Устанавливаю php-devel, без него phpize нету:

yum install php-devel

Узнаем текущую версию php, для этого в командной строке:

php -v

В моем случаи оказалась 5.2.17. При помощи того же Google находим исходник PhP(Я скачивал ТУТ), скачиваем и разархивируем. Переходим в папку ext/interbase, и запускаей - 

phpize

затем

./configure —with-interbase=shared,/opt/firebird

и тут произошла вот такая ошибка:

configure: error: libgds, libib_util or libfbclient not found!

поиски в Google не дали конкретного решения но натолкнули на мысль, что не хватает библиотек Firebird. Ну, что же, давайте их установим:

yum install firebird firebird-devel

после этого копируем /usr/lib/firebird в /opt/firebird и снова запускаем

./configure —with-interbase=shared,/opt/firebird

в моем случаи команда прошла, после чего я скомпилировал модуль:

make

Затем копируем файл interbase.so из папки .libs(эта папка находиться в ext/interbase) в папку /usr/lib/php/modules/ и добавил в /etc/php.d файл interbase.ini с таким содержимым:

extension=interbase.so
 

libphp5.so: cannot enable executable stack as shared object requires: Permission denied

При загрузке Apache появилась вот такая ошибка :

[root@localhost apache2]# service httpd restart
Stopping httpd:                                            [FAILED]
Starting httpd: httpd: Syntax error on line 210 of /etc/httpd/conf/httpd.conf: 
Syntax error on line 6 of /etc/httpd/conf.d/zendserver_php.conf: 
Cannot load /usr/local/zend/lib/apache2/libphp5.so into server: 
/usr/local/zend/lib/apache2/libphp5.so: 
cannot enable executable stack as shared object requires: Permission denied
                                                           [FAILED]
[root@localhost apache2]#

Даная ошибка возникает из-за включеного SELINUX. Для того что бы отключить SELinux прочтите вот эту статью — Как выключить SELinux

Apache + mount.cifs

Появилась необходимость примаунтить разшариную папку Windows и сделать ее папкой на одном из вебсайтов. Задача не сложная, использовал я для нее mount.cifs:

mount.cifs <путь к папке Windows> <Локальная папка куда маунтим> -o username=<Имя пользователя, который имеет право доступа к папке Windows>,password=<пароль>

как пример:

mount.cifs //10.10.10.1/ext_share /var/www/vhosts/dataroom/http/ -o username=apache,password=123123,uid=48,gid=48

uid и gid — id группа и пользователь с которому будет принадлежать примаунченая папка и ее содержимое, в моем примере это пользователь apache и группа apache. Что бы просмотреть uid или gid, воспользуйтесь командой:

id

И все бы хорошо, папка примаунчена, файлы читабельны, но вот при попытки скачать их через Web, размер их равен 0, при этом никаких ошибок в логах Apache нет. Проблема решалась очень просто, все что необходимо сделать это добавить в hhtpd.conf:

EnableSendfile off

Apache mod_ssl

mod_ssl модуль, при помощи протоколов SSL и TLS, дает мощные криптографические возможности Apache веб серверу. Вы можете использовать само подписанные сертификаты или SSL сертификаты третьих лиц. Этот модуль поддерживает SSL v2/v3 и TLS v1. Начнем установку с инстоляции модуля:

yum install mod ssl

Создадим SSL сертификат:

cd /etc/pki/tls/certs
openssl genrsa -des3 -out apachekey.pem 2048

Важно! Используйте сложный пароль для защиты вашего сертификата.

Теперь подпишем наш сертификат:

openssl req -new -key apachekey.pem -out apachekey.csr

На выходе должно быть что-то такое:

Enter pass phrase for apachekey.pem:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
——
Country Name (2 letter code) [GB]:UA
State or Province Name (full name) [Berkshire]:Kiev
Locality Name (eg, city) [Newbury]:Kiev
Organization Name (eg, company) [My Company Ltd]:Eddnet

Common Name (eg, your name or your server’s hostname) []:teaseo.ru
Email Address []:info@teaseo.ru

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Вам необходимо предоставить запрашиваемую информацию и нажать Enter для подтверждения.

Для создания сертификата Web сервера вам необходимо подписать CSR:

openssl ca -in apachekey.csr -out apachecert.pem

Теперь мы можем скопировать сертификаты в отдельную папку /etc/pki/tls/http/:

cp apachecert.pem /etc/pki/tls/http/
cp apachekey.pem /etc/pki/tls/http/

Перейдем к настройке Apache-а. Редактируем /etc/httpd/conf.d/ssl.conf:

Listen 80.91.175.92:443
SSLRandomSeed startup file:/dev/urandom 1024
SSLRandomSeed connect file:/dev/urandom 1024

И добавляем виртуальный хост:

<VirtualHost teaseo.ru:443>
SSLEngine On
SSLCertificateFile /etc/pki/tls/http/apachecert.pem
SSLCertificateKeyFile /etc/pki/tls/http/apachekey.pem
SSLProtocol All -SSLv2
SSLCipherSuite HIGH:MEDIUM:!aNULL:+MD5
DocumentRoot «/var/www/html/ssl»
ServerName teaseo.ru:443
</VirtualHost>

Убедитесь, что папка /var/www/html/ssl существует:

mkdir -p /var/www/html/ssl

настраиваем директорию /var/www/html/ssl. Для этого откройте /etc/httpd/conf/httpd.conf и добавьте:

<Directory /var/www/html/ssl>
SSLRequireSSL
SSLOptions +StrictRequire
SSLRequire %{HTTP_HOST} eq «teaseo.ru»
ErrorDocument 403 https://teaseo.ru/sslerror.html
</Directory>

Не забудьте перезапустить Apache и открыть 443 порт на фаерволе

XCache ускоряем работу вебсервера

XCache – быстрый, стабильный PHP optcode кеш. Предполагаеться, что Apache и PhP уже установлены и настроены для работы. В начале нам необходимо удалить eaccelerator или apc если таковые имеются. Скачиваем и распаковываем xcache:

wget http://xcache.lighttpd.net/pub/Releases/1.3.0/xcache-1.3.0.tar.gz
tar xvfz xcache-1.3.0.tar.gz
cd xcache-1.3.0

И далее:

phpize
./configure —enable-xcache
make
make install

копируем xcache.ini в /etc/php.d:

cp xcache.ini /etc/php.d

Произведем некоторые до настройки xcache:

[xcache-common]
extension = xcache.so
;; or win32:
; extension = php_xcache.dll
[…]
xcache.size = 60M
[…]

осталось лишь перезапустить apache

Apache mod_status

mod_status — модуль, который создает страницу с информацией про веб-сервер, системные ресурсы, текущие запросы и скорость их обработки.

Добавьте в httpd.conf следующее:

<VirtualHost *:80>
ServerName status.mydomain.com
<Location />
SetHandler server-status
Order deny,allow
Deny from all
# ваши ип, с которых можно будет смотреть статус
Allow from 172.16.1.1
Allow from localhost
</Location>
</VirtualHost>

Active Directory аутентификация в Apache через Ldap

В принципе ничего сложного в этом нет, но все же есть кое какие нюансы. Покажу вам пример конфигурации в котором буду необходимые комментарии что бы понять что к чему. Права доступа я выставляю на папку /var/www/vhosts/weather.teaseo.ru/httpdocs/

SuexecUserGroup demo demo
ServerAdmin admin@localhost
DocumentRoot /var/www/vhosts/weather.teaseo.ru/httpdocs
ServerName weather.teaseo.ru
ScriptAlias /cgi-bin/ «/var/www/vhosts/weather.teaseo.ru/cgi-bin/»
DirectoryIndex index.php index.html index.shtml
ErrorLog /var/www/vhosts/weather.teaseo.ru/logs/error.log
CustomLog /var/www/vhosts/weather.teaseo.ru/logs/access.log common DirectoryIndex index.php index.htm index.html
Options +Indexes // распространяется на файлы в /var/www/vhosts/weather.teaseo.ru/httpdocs/ и все другие папки и файлы в этой директории
AllowOverride all
AuthName «Weather Access»
AuthType Basic
AuthBasicProvider ldap // Собственно включаем ldap аутентификацию
AuthzLDAPAuthoritative Off //означает, что впоследствии модуль может разрешать доступ даже в тех случаях, если LDAP отклоняет авторизацию
AuthLDAPUrl ldap://ip адрес AD сервера:порт(как пример 192.168.1.1:389)/ou=организейшен юнит,dc=домен(как пример demo),dc=домен(как пример ua)?sAMAccountName?sub?(objectClass=*) // Сдесь есть маленький нюанс, как видите путь начинается с организационного юнита и это не спроста, иначе работать ничего не хочет, причину к сожалению обнаружить не удалось
AuthLDAPBindDN demo@teaseo.ru // имя пользователя который имеет право смотреть в АД
AuthLDAPBindPassword «пароль» // Тут пароль на доступ в домен в кавычках обязательно
Require ldap-group cn=wm,ou=users_ITDepartment,ou=ITDepartment,ou=myou,dc=osticket,dc=org // Тут полный путь к группе в которую будут входить пользователи имеющие доступ