Как установить Apache2+Nginx*+PHP(FactCGI+eAccelerator)+MySQL+Postfix на Ubuntu 8.0.4 или как ускорить работу сайтов в разы.

Все написанное ниже доступно к применению только на своем сервере либо на виртуальном сервере vps(vds).

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

Имеем «сервер» конфигурации: Материнка S370 на чипсете VIA 693A, Pentium3-1000мгц, ОЗУ 1гб, жесткий диск IDE 80гб

Что было вначале: Голая система Ubuntu, Apache 2.2.28, PHP5.2.4, exim (для почты. нихрена он не работал как надо).
Какая была производительность: Загрузка страниц локально была 5-10секунд, а на объемных страницах до 30секунд. Использование суперкэша давало прирост около 50%, но в админке в WP 2.5+ было работать не очень шустро, особенно в окне создания записей, да и на сайте когда залогинен был суперкэш не работал естественно. ДА и вообще апач «кушал» практически все ресурсы системы (процессор, память) и сайты на сервере легко мог я «положить» сам за пару минут, что и было периодически.

Первая попытка модификация ПО — что было проверено ранее на Debian4 и позволяло ускорить выполнение скриптов php раза в два — это установка PHP акселератора. Я перепробовал различные акселераторы php, но почти все они давали какие то сбои — не работали какие то части кода в WP, не работало сжатие gzip для страниц, просто не прибавлялось скорости либо было даже медленнее. После проб и ошибок был выбран этот вариант, как наиболее производительный и не имевший глюков.

Вторая попытка модификация ПО — попытка заменить апач более легкими серверами. Были опробованы lighthttpd, litespeed, nginx с использованием php в режиме fastcgi. Не помню уже точно но ни один вариант так полноценно и не заработал. Либо некорректно работал реврайт(rewrite), либо не работал php более чем на одном сайте и т.д. единственный плюс был это заметный прирост раза в 1,5 на nginx. После того как глюки не поборолись, решил связать все таки установить apache+nginx в режиме прокси. Тут возникло несколько проблем. Не хватало каких то модулей апача, не хватало доступных для понимания инструкций по nginx. Все сначала делалось методом тыка и попутного поиска более внятной конфигурации в Сети. Конфиг nginx и apache с сервера федоры не подходил. все глючило и вообще не запускалось иногда. И вот более менее внятное руководство нашлось здесь. Для меня потребовалось лишь немного изменить конфиг, т.к. с этим у меня после перезапуска сервера были баги с незапуском nginx.
После того как все настроилось я так все и оставил на несколько месяцев. Вроде этого и хватало, но все же не давал покоя факт очень медленной загрузки скриптов, файлов стилей и картинок. Очень заметно это было в окне создания поста намоем «нагруженном» всем подряд блоге. Настроил я апача на порт 8080, а нгинкс на 80 и все виртуальные хосты отдавались так при всего одном описанном в конфиге нгинкса «сервере». Это было несколько некорректно на мой взгялд, но работало.

Наконец почитав на неделе еще другие статьи на эту тему и порывшись в другом конфиге (с федоры) понял что нужно изменить у себя чтобы все работало корректно и более быстро. По описанному выше методу (по ссылке на жж) были указаны параметр для статических файлов, но так не работало ничего если было несколько виртульных сайтов. Еще немного поправил конфиги сайтов в апаче и рассадил все сайты на разные порты. В конфиге нгинкса сделал различные блоки для каждого сайта и все заработало. И заработало в разы быстрее чем было. Так например полностью закешированные страницы отдаваться стали за 1-2секунды(локально) вместе с графикой и за 3-6секунд извне. Простые картинки и файлы стали отдаваться тоже быстрее и не было при этом наплыва процессов апача и лишней загрузки процессора. Больше всего конечно поразила загрузка страницы создания записи. Время сократилось в несколько раз, кроме того комментарии в админке стали отправляться быстрее раза в несколько раз — не стало непонятной задумчивости, возникающей когда я отправлял быстрый ответ в панели управления комментариями. Доходило иногда это и до зависания сайта и принудительной перезагрузки апача.

Что касается почты, то изначально у меня стоял exim4 который почту конечно отплавлял, только «на деревню бабушке», т.е. просто скидывал в файл на диске. Так что если кто то мне писал через форму на сайте с апреля по июнь 2008 года и я не ответил, то ваши письма просто не попадали мне в почту, а обнаружил я их только на неделе этой. После замены на Postfix и настройки по подробному мануалу, найденному Гуглом все заработало практически с полоборота. И двухлетней проблеме с неотправкой почты штатными средствами пришел конец.

В общем если я что то пропустил в конфигах ниже, то добавлю потом когда вспомню/найду. Линукс все таки запутанная система и некоторые очевидные вещи приходится иногда долго искать (особенно если их поправил один раз и забыл).

Все вышеописанное подойдет к системе Ubuntu 8.0.4, а так возможно к Ubuntu 7*, Debian и другим системам на аналогичной общей платформе. Для установки разного софта использовалась aptitude и источники программ в исходниках на просторах Сети

Other
memcached
Apache2
apache2-mpm-prefork
apache2-utils
apache2.2-common
libapache2-mod-php5
libapache2-mod-rpaf

PHP
php-pear
php5-cgi
php5-cli
php5-common
php5-curl
php5-gd
php5-gmp
php5-mysql
php5-xmlrpc
php-cache-lite
php5-memcache
php5-json
phpapi-20060613+lfs

Mysql
mysql-community-server-5.0
mysql-community-client-5.0
virtual-mysql-server
virtual-mysql-client
libmysqlclient15off
mysql-common

Postfix
postfix

Nginx
nginx source

eAccelerator
eaccelerator source

Возможно тут перечислены не все зависимости, но при установке программ из aptitude они на 100% решаются сами, а при компиляции исходников все что от вас могут «попросить» будет также доступно через apt-get (aptitude). Сейчас уже просто все не вспомню что требовалось, но проблем с поиском не было.

Образец конфигурации apache2
/etc/apache2/apache2.conf

ServerRoot "/etc/apache2"
LockFile /var/lock/apache2/accept.lock
PidFile /var/run/apache2.pid
Timeout 15
KeepAlive On
MaxKeepAliveRequests 400
KeepAliveTimeout 15
#SecRequestBodyLimit 1310720

<IfModule prefork.c>
StartServers 1
MinSpareServers 2
MaxSpareServers 10
MaxClients 60
MaxRequestsPerChild 1000
</IfModule>

<IfModule worker.c>
StartServers 2
MaxClients 60
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 1000
</IfModule>

<IfModule perchild.c>
NumServers 1
StartThreads 1
MinSpareThreads 1
MaxSpareThreads 5
MaxThreadsPerChild 20
MaxRequestsPerChild 1000
AcceptMutex fcntl
</IfModule>

User www-data
Group www-data

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

ErrorLog /var/log/apache2/error.log

Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf
Include /etc/apache2/httpd.conf
Include /etc/apache2/ports.conf
Include /etc/apache2/conf.d/[^.#]*
#Alias /icons/ "/usr/share/apache2/icons/"

<IfModule mod_mem_cache.c>
CacheEnable mem /
MCacheSize 4096
MCacheMaxObjectCount 100
MCacheMinObjectSize 1
MCacheMaxObjectSize 2048
</IfModule>

<Directory "/usr/share/apache2/icons">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>

ErrorDocument 404 /404.php
ErrorDocument 403 /403.php

<Directory "/vhosts/web/site1">
AllowOverride All
Options -Indexes
</Directory>

Header unset ETag
FileETag None

<IfModule mod_negotiation.c>
<IfModule mod_include.c>
Alias /error/ "/usr/share/apache2/error/"

<Directory "/usr/share/apache2/error">
AllowOverride None
Options IncludesNoExec
AddOutputFilter Includes html
AddHandler type-map var
Order allow,deny
Allow from all
LanguagePriority en es de fr
ForceLanguagePriority Prefer Fallback
</Directory>

ErrorDocument 400 /error/HTTP_BAD_REQUEST.html.var
ErrorDocument 401 /error/HTTP_UNAUTHORIZED.html.var
# ErrorDocument 403 /error/HTTP_FORBIDDEN.html.var
# ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var
ErrorDocument 405 /error/HTTP_METHOD_NOT_ALLOWED.html.var
ErrorDocument 408 /error/HTTP_REQUEST_TIME_OUT.html.var
ErrorDocument 410 /error/HTTP_GONE.html.var
ErrorDocument 411 /error/HTTP_LENGTH_REQUIRED.html.var
ErrorDocument 412 /error/HTTP_PRECONDITION_FAILED.html.var
ErrorDocument 413 /error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var
ErrorDocument 414 /error/HTTP_REQUEST_URI_TOO_LARGE.html.var
ErrorDocument 415 /error/HTTP_SERVICE_UNAVAILABLE.html.var
ErrorDocument 500 /error/HTTP_INTERNAL_SERVER_ERROR.html.var
ErrorDocument 501 /error/HTTP_NOT_IMPLEMENTED.html.var
ErrorDocument 502 /error/HTTP_BAD_GATEWAY.html.var
ErrorDocument 503 /error/HTTP_SERVICE_UNAVAILABLE.html.var
ErrorDocument 506 /error/HTTP_VARIANT_ALSO_VARIES.html.var

</IfModule>
</IfModule>

DirectoryIndex index.html index.cgi index.pl index.php index.xhtml

AccessFileName .htaccess

<Files ~ "^\.ht">
Order allow,deny
Deny from all
</Files>

UseCanonicalName Off

TypesConfig /etc/mime.types
DefaultType text/plain

HostnameLookups Off

IndexOptions FancyIndexing VersionSort

AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip

AddIconByType (TXT,/icons/text.gif) text/*
AddIconByType (IMG,/icons/image2.gif) image/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*

AddIcon /icons/binary.gif .bin .exe
AddIcon /icons/binhex.gif .hqx
AddIcon /icons/tar.gif .tar
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
AddIcon /icons/a.gif .ps .ai .eps
AddIcon /icons/layout.gif .html .shtml .htm .pdf
AddIcon /icons/text.gif .txt
AddIcon /icons/c.gif .c
AddIcon /icons/p.gif .pl .py
AddIcon /icons/f.gif .for
AddIcon /icons/dvi.gif .dvi
AddIcon /icons/uuencoded.gif .uu
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
AddIcon /icons/tex.gif .tex
AddIcon /icons/bomb.gif core

AddIcon /icons/back.gif ..
AddIcon /icons/hand.right.gif README
AddIcon /icons/folder.gif ^^DIRECTORY^^
AddIcon /icons/blank.gif ^^BLANKICON^^

DefaultIcon /icons/unknown.gif

ReadmeName README.html
HeaderName HEADER.html

IndexIgnore .??* *~ *# HEADER* RCS CVS *,t

AddEncoding x-compress Z
AddEncoding x-gzip gz tgz

AddLanguage da .dk
AddLanguage nl .nl
AddLanguage en .en
AddLanguage et .et
AddLanguage fr .fr
AddLanguage de .de
AddLanguage el .el
AddLanguage it .it
AddLanguage ja .ja
AddLanguage pl .po
AddLanguage ko .ko
AddLanguage pt .pt
AddLanguage no .no
AddLanguage pt-br .pt-br
AddLanguage ltz .ltz
AddLanguage ca .ca
AddLanguage es .es
AddLanguage sv .se
AddLanguage cz .cz
AddLanguage ru .ru
AddLanguage tw .tw
AddLanguage zh-tw .tw

LanguagePriority en da nl et fr de el it ja ko no pl pt pt-br ltz ca es sv tw

AddDefaultCharset UTF-8

# For russian, more than one charset is used (depends on client, mostly):
AddCharset WINDOWS-1251 .cp-1251 .win-1251
AddCharset UTF-8 .utf8

AddType application/x-tar .tgz

<FilesMatch "\.shtml(\..+)?$">
SetOutputFilter INCLUDES
</FilesMatch>

BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
BrowserMatch "RealPlayer 4\.0" force-response-1.0
BrowserMatch "Java/1\.0" force-response-1.0
BrowserMatch "JDK/1\.0" force-response-1.0

BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully
BrowserMatch "^WebDrive" redirect-carefully
BrowserMatch "^gnome-vfs" redirect-carefully
BrowserMatch "^WebDAVFS/1.[012]" redirect-carefully

Include /etc/apache2/sites-enabled/[^.#]*

Далее идет внутри директория /etc/apache2/mods-enabled с файлами
alias.conf
alias.load
auth_basic.load
authn_file.load
authz_default.load
authz_groupfile.load
authz_host.load
authz_user.load
autoindex.conf
autoindex.load
cache.load
deflate.conf
deflate.load
dir.conf
dir.load
env.load
expires.load
fastcgi.conf
fastcgi.load
headers.load
mime.conf
mime.load
negotiation.conf
negotiation.load
php5.conf
php5.load
rewrite.load
rpaf.conf
rpaf.load
setenvif.conf
setenvif.load
status.conf
status.load

Все файлы скопированы(частично просто символьные ссылки) из mods-availible и изменен в них только файл rpaf.conf

<IfModule mod_rpaf.c>
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 realip [relaip1]
</IfModule> 

также в файле /etc/apache2/ports.conf описано

Listen 127.0.0.1:8080
Listen 127.0.0.1:8081
Listen 127.0.0.1:8082
Listen 127.0.0.1:8083
Listen 127.0.0.1:8084
Listen 127.0.0.1:8085

в папке /etc/apache2/sites-enabled находятся отдельные файлы с конфигурациями сайтов. Все это можно конечно прописать в один конфиг, но так удобнее их добавлять-убирать.
Описанные выше порты 8080-8085 предназначены для различных сайтов. Вот пример одного из сайтов:

<VirtualHost 127.0.0.1:8080>
ServerAdmin vashemylo@server.ru
ServerName site1.ru
DocumentRoot /vhosts/web/site1
ServerAlias www.site1.ru

ErrorLog /vhosts/web/logs/site1-error.log
CustomLog /vhosts/web/logs/site1-access.log common
LogLevel error
php_admin_value open_basedir /vhosts/web/site1/:/tmp/:/opt/eaccelerator/:/vhosts/web/site1/wp-content/plugins/firestats/fs_sessions/:/dev/urandom
</VirtualHost> 

Конфигурация php5 (все комментарии убраны чтобы не захламлять страницу. если захотите вы их все увидите в своем стандартном конфиге) /etc/php5/apache2/php.ini

[PHP]

;;;;;;;;;;;;;;;;;;;
; About this file ;
;;;;;;;;;;;;;;;;;;;
; All the values in the php.ini-dist file correspond to the builtin
; defaults (that is, if no php.ini is used, or if you delete these lines,
; the builtin defaults will be identical).

;;;;;;;;;;;;;;;;;;;;
; Language Options ;
;;;;;;;;;;;;;;;;;;;;

engine = On
zend.ze1_compatibility_mode = Off
short_open_tag = On
asp_tags = Off
precision = 12
y2k_compliance = On
output_buffering = Off
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func=
serialize_precision = 100
allow_call_time_pass_reference = On
safe_mode = Off
safe_mode_gid = Off
safe_mode_include_dir =
safe_mode_exec_dir =
safe_mode_allowed_env_vars = PHP_
;в следующем параметры перечислено все что не надо показывать различным вредителям и просто ненужные функции. у вас это может отличаться.
disable_functions = "apache_get_modules,apache_get_version,apache_getenv,apache_note, apache_setenv,disk_free_space,diskfreespace,dl,highlight_file,ini_alter,ini_restore,openlog, passthru,phpinfo,proc_nice,shell_exec,show_source,system,exec"
disable_classes =
expose_php = On
max_execution_time = 30 ; Maximum execution time of each script, in seconds
max_input_time = 90 ; Maximum amount of time each script may spend parsing request data
memory_limit = 128M ; Maximum amount of memory a script may consume (16MB)
error_reporting = E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR
display_errors = off
display_startup_errors = Off
log_errors = off
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
track_errors = Off
variables_order = "EGPCS"
register_globals = Off
register_long_arrays = On
register_argc_argv = On
auto_globals_jit = On
post_max_size = 40M
magic_quotes_gpc = On
magic_quotes_runtime = Off
magic_quotes_sybase = Off
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
doc_root =
user_dir =
enable_dl = On
cgi.force_redirect = 1
discard_path -1
file_uploads = On
;upload_tmp_dir =
upload_max_filesize = 40M
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60

extension=mysql.so
extension=gd.so

[Syslog]
define_syslog_variables = Off

[mail function]
; For Win32 only.
SMTP = localhost
smtp_port = 25

[SQL]
sql.safe_mode = Off

[ODBC]
odbc.allow_persistent = On
odbc.check_persistent = On
odbc.max_persistent = -1
odbc.max_links = -1
odbc.defaultlrl = 4096
odbc.defaultbinmode = 1

[MySQL]
mysql.allow_persistent = On
mysql.max_persistent = -1
mysql.max_links = -1
mysql.default_port =
mysql.default_socket =
mysql.default_host =
mysql.default_user =
mysql.default_password =
mysql.connect_timeout = 60
mysql.trace_mode = Off

[MySQLi]
mysqli.max_links = -1
mysqli.default_port = 3306
mysqli.default_socket =
mysqli.default_host =
mysqli.default_user =
mysqli.default_pw =
mysqli.reconnect = Off

[mSQL]
msql.allow_persistent = On
msql.max_persistent = -1
msql.max_links = -1

[PostgresSQL]
pgsql.allow_persistent = On
pgsql.auto_reset_persistent = On
pgsql.max_persistent = -1
pgsql.max_links = -1
pgsql.ignore_notice = 0
pgsql.log_notice = 0

[Sybase]
sybase.allow_persistent = On
sybase.max_persistent = -1
sybase.max_links = -1
sybase.min_error_severity = 10
sybase.min_message_severity = 10
sybase.compatability_mode = Off

[Sybase-CT]
sybct.allow_persistent = On
sybct.max_persistent = -1
sybct.max_links = -1
sybct.min_server_severity = 10
sybct.min_client_severity = 10

[bcmath]
bcmath.scale = 0

[Informix]
ifx.default_host =
ifx.default_user =
ifx.default_password =
ifx.allow_persistent = On
ifx.max_persistent = -1
ifx.max_links = -1
ifx.textasvarchar = 0
ifx.byteasvarchar = 0
ifx.charasvarchar = 0
ifx.blobinfile = 0
ifx.nullformat = 0

[Session]
session.save_handler = files
session.use_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_divisor = 100
session.gc_maxlifetime = 1440
session.bug_compat_42 = 1
session.bug_compat_warn = 1
session.referer_check =
session.entropy_length = 0
session.entropy_file =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 4
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=,fieldset="

[MSSQL]
mssql.allow_persistent = On
mssql.max_persistent = -1
mssql.max_links = -1
mssql.min_error_severity = 10
mssql.min_message_severity = 10
mssql.compatability_mode = Off
mssql.secure_connection = Off

[gd]
gd.jpeg_ignore_warning = 0

[Tidy]
tidy.clean_output = Off

[soap]
soap.wsdl_cache_enabled=1
soap.wsdl_cache_dir="/tmp"
soap.wsdl_cache_ttl=86400

extension=imagick.so

zend_extension="/usr/lib/php5/20060613+lfs/eaccelerator.so"
;другой вариант строки выше extension="eaccelerator.so"
eaccelerator.shm_size="64"
eaccelerator.cache_dir="/opt/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="0"
eaccelerator.compress_level="5"

кроме этого остальные части конфигурации php есть в /etc/php5/conf.d/
приведу общий текст активных модулей. в принципе можно все это вписать и в php.ini

# configuration for php GMP module
extension=gmp.so
# configuration for php XML-RPC module
extension=xmlrpc.so
# configuration for php CURL module
extension=curl.so
# configuration for php GD module
extension=gd.so
# configuration for php MySQL module
extension=mysql.so
# configuration for php MySQL module
extension=mysqli.so
# configuration for php MySQL module
extension=mysqli.so
# configuration for php MySQL module
extension=pdo_mysql.so

Компиляция eaccelerator стандартная:

# ./configure
# make
# make install

при этом выдаст путь куда установлено и его надо будет вписать вместо моего пути в php.ini

Более детально расписано здесь

Компиляция nginx (проверено на версии 0.6.30 и 0.7.17)

./configure --prefix=/usr/local \
--sbin-path=/usr/local/bin \
--conf-path=/usr/local/etc/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/spool/nginx/client_body_temp \
--http-proxy-temp-path=/var/spool/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/spool/nginx/fastcgi_temp \
--pid-path=/var/run/nginx.pid \
--user=www-data \
--group=www-data
# make
# make install

Как написано по инструкции в ЖЖ, создаем вручную папки до выполнения make install
/var/log/nginx/
/var/run/nginx/
/var/spool/nginx/proxy_temp
/var/spool/nginx/fastcgi_temp
/var/spool/nginx/client_body_temp
(если не создались сами)
если ошибки после конфигурации есть то ставим необходимые модули. какие точно я не помню, напишу только если буду ставить еще раз его на чистый тестовый сервер (возможно скоро, но не обещаю).

И собственно образец 100% рабочего конфига nginx (приведен полностью, но изменены пути на вымышленные).


user www-data;
worker_processes 2;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;

events {
worker_connections 1024;
}

http {
include /usr/local/etc/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;

#keepalive_timeout 0;
keepalive_timeout 65;

gzip             on;
gzip_min_length  1000;
gzip_proxied     expired no-cache no-store private auth;
gzip_types       text/plain application/xml application/x-pointplus application/x-javascript text/css;
gzip_comp_level 3;

server {
listen 80;
server_name site1.ru www.site1.ru;

#charset koi8-r;

access_log /vhosts/web/logs/site1-nginx.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 40m;
client_body_buffer_size 256k;

proxy_connect_timeout 120;
proxy_send_timeout 120;
proxy_read_timeout 120;

proxy_buffer_size 64k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#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|html|flv|mp3)$ {
root /vhosts/web/site1; }

}

server {
listen 80;
server_name site2.ru;

#charset koi8-r;

access_log /vhosts/web/logs/site2-nginx.access.log main;

location / {
proxy_pass http://127.0.0.1:8081/;
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 40m;
client_body_buffer_size 256k;

proxy_connect_timeout 120;
proxy_send_timeout 120;
proxy_read_timeout 120;

proxy_buffer_size 64k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#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|html|flv|mp3)$ {
root /vhosts/web/site2;
}
}
server {
listen 80;
server_name site3.ru www.site3.ru;

#charset koi8-r;

access_log /vhosts/web/logs/site3-nginx.access.log main;

location / {
proxy_pass http://127.0.0.1:8082/;
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 40m;
client_body_buffer_size 256k;

proxy_connect_timeout 120;
proxy_send_timeout 120;
proxy_read_timeout 120;

proxy_buffer_size 64k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#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|html|flv|mp3)$ {
root /vhosts/web/site3;
}
}
server {
listen 80;
server_name site4.ru;

#charset koi8-r;

access_log /vhosts/web/logs/site4-nginx.access.log main;

location / {
proxy_pass http://127.0.0.1:8083/;
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 40m;
client_body_buffer_size 256k;

proxy_connect_timeout 120;
proxy_send_timeout 120;
proxy_read_timeout 120;

proxy_buffer_size 64k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#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|html|flv)$ {
root /vhosts/web/site4;
}
}

server {
listen 80;
server_name site5.ru;

#charset koi8-r;

access_log /vhosts/web/logs/site5-nginx.access.log main;

location / {
proxy_pass http://127.0.0.1:8084/;
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 40m;
client_body_buffer_size 256k;

proxy_connect_timeout 120;
proxy_send_timeout 120;
proxy_read_timeout 120;

proxy_buffer_size 64k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#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|html|flv|mp3)$ {
root /vhosts/web/site5;
}
}

server {
listen 80;
server_name site6.ru;

#charset koi8-r;

access_log /vhosts/web/logs/site6-nginx.access.log main;

location / {
proxy_pass http://127.0.0.1:8085/;
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 40m;
client_body_buffer_size 256k;

proxy_connect_timeout 120;
proxy_send_timeout 120;
proxy_read_timeout 120;

proxy_buffer_size 64k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#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|html)$ {
root /vhosts/web/site6;
}
}

}

После того как проверяем что апач и нгинкс стартуют вручную без ошибок и сайт(ы) работает(ют), добавляем в /etc/rc.local строки

/usr/local/bin/nginx
exit 0

С настройкой почты было все просто когда я нашел подробный мануал. Насколько помню после этого все заработало на 99%, только еще немного погуглил и поправил конфиги, чтобы некоторые почтовые сервера не ругались на письма:

/etc/mail/@aliaces

root: myusername
smmsp: myusername
www-data: myusername

myusername — имя вашего юзера в убунте
после правки выполните команду

# newaliases

и в /etc/postfix/main.cf
изменил дефолтный конфиг на такой (у вас будет просто другое имя домена):

# See /usr/share/postfix/main.cf.dist for a commented, more complete version

# Debian specific: Specifying a file name will cause the first
# line of that file to be used as the name. The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# TLS parameters
smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.crt
smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key
smtpd_use_tls = yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

myhostname = lecactus.ru
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
#myorigin = /etc/mailname
myorigin = lecactus.ru
mydestination = ubuntu.lecactus.ru, localhost.localdomain, localhost
relayhost =
mynetworks = 127.0.0.0/8
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all
smtpd_sasl_local_domain =
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_tls_auth_only = no
smtp_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_CAfile = /etc/postfix/ssl/cacert.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

Мой конфиг mysql (не претендует на идеальность, но работает корректно и быстро) с сайтами на wordpress и галереей gallery2

[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock

[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0

[mysqld]

user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
tmp_table_size = 5000
language = /usr/share/mysql/english
skip-external-locking

bind-address = 127.0.0.1
key_buffer = 2M
max_allowed_packet = 16M
thread_stack = 128K
thread_cache_size = 8
max_connections = 200
table_cache = 2000
myisam_sort_buffer_size = 64M

wait_timeout=60
query_cache_type =1
query_cache_limit = 5M
query_cache_size = 20M

log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 5
log-queries-not-using-indexes

expire_logs_days = 10
max_binlog_size = 100M

skip-bdb

[mysqldump]
quick
quote-names
max_allowed_packet = 16M

[mysql]
#no-auto-rehash # faster start of mysql but no tab completition

[isamchk]
key_buffer = 128M

!includedir /etc/mysql/conf.d/

Если что то упустил — дополню (самому нужно). Собирал долго по крупицам, сам модифицировал потом большую часть конфигов под себя — методом тыка.
В целом должно быть все понятно для более менее «продвинутого» пользователя. Главная цель выполнена — нагрузка на сервер снижена, отдача файлов ускорилась в разу.
Глупых вопросов (в стиле «а что это и зачем») просьба не задавать. Комментари не по теме удаляются без разбирательств. Дополнения (улучшения конфигов) приветствуются.

Связанные записи

47 комментариев на запись “Как установить Apache2+Nginx*+PHP(FactCGI+eAccelerator)+MySQL+Postfix на Ubuntu 8.0.4 или как ускорить работу сайтов в разы.”

  1. флу 27 сентября 2008 в 7:09

    хочеш быстродействия? ставь bsd

  2. Lecactus 27 сентября 2008 в 10:04

    @флу: думаю холивар линукс-бсд тут неуместен. я видел сервера более «производительные по железу» где работало бсд и все «ползала» при аналогичной конфигурации и наборе софта. и вчера кстати тоже видел такое на одном сервере, да и тут среди моих читателей есть те у кого сайты работают на BSD (Daemony насколько помнится точно использует) и сверхпроизводительности я не замечал.

  3. Элвин 30 сентября 2008 в 11:12

    Пригодится, отличная статейка! А то я всё сам хотел у тебя поинтересоваться, как ты что настроил…

  4. Goodle 30 сентября 2008 в 15:37

    Да без разницы что стоит — Linux или *BSD, если руки прямые и из нужного места растут, то всё летать будет и даже винда! А остальное дело привычки и не более. ИМХО конечно

  5. Daemony 16 октября 2008 в 15:31

    да и тут среди моих читателей есть те у кого сайты работают на BSD (Daemony насколько помнится точно использует) и сверхпроизводительности я не замечал.

    Знал бы ты:
    — сколько разного гавнеца запущено на этом бедном сервере помимо хостинга;
    — насколько галимой бывает исходящая связь у моего провайдера в мир.

    Хотя с этим

    хочеш быстродействия? ставь bsd

    я тоже не совсем согласен. Скорее вот с этим:

    Да без разницы что стоит — Linux или *BSD, если руки прямые и из нужного места растут…

  6. gled 6 ноября 2008 в 2:14

    как вариант у меня заработало следуюшее шаменство

    в файле /etc/hosts добавил
    127.0.0.1 yourorel.ru

    в итоге в апаче прописал
    Listen 8080
    а также в виртуальных постах указал 8080

    и не пришлось для каждого сайта указывать свой порт
    в nginx
    proxy_pass http://yourorel.ru:8080/;

  7. Lecactus 6 ноября 2008 в 8:23

    @gled: у меня тоже раньше был «один порт на всех», но так не работает отдача картинок и другой статики напрямую Nginx-ом

  8. cocucka 7 ноября 2008 в 20:32

    еще бы в my.cnf не помешало бы добавить параметр благодаря которому mysql прекратит смотреть в инет.

    skip-networking

  9. wd 7 декабря 2008 в 4:15

    Машинка бегает на Ubuntu Server 8.10. Сделал всё как написано в статье, но в итоге лишился доступа к phpmyadmin, и на другие вирт хосты просто отказываются работать. Игрался с настройками, в лучшем случае получал php сурс. Не подскажите в чём может быть моя ошибка?

  10. Lecactus 7 декабря 2008 в 9:52

    @wd, откуда я могу знать как у вас было настроено до этого? и что значит лишился доступа к пхпмайдмину? он лежит где то в папке сайта или где то снаружи через алиас цепляется?

  11. wd 7 декабря 2008 в 15:44

    Lecactus, я всё сделал по инструкции.
    Допустим добавил только 1 vhost ктр работает с Nginx как фронтэндом и Apache на бэке.
    Так вот — поидеи — по адресу 127.0.0.1/phpmyadmin я должен же попасть на phpmyadmin, но nginx возвращает 404
    Пробовал настраивать /usr/share/phpmyadmin как base folder для vhost — тоже ошибка

  12. Lecactus 7 декабря 2008 в 16:07

    @wd, правильно возвращает 404. будет работать только если укажете domain/phpmyadmin и никак иначе

    попробуйте через алиас в апаче пусть прописать или вообще просто папку пхпмайдмина скопируйте в папку сайта

  13. wd 8 декабря 2008 в 3:27

    Скопировал как вы и говорили, в vhost у ктр рабочий php.. Всё равно php код не выполняется из phpmyadmin, а другие скрипты работают
    Кажется это всё из-за специфичности работы phpmyadmin
    Не подскажите как пустить vhost напрямую через php обработчик Nginx’a, а не проксирующего Apache?

  14. Lecactus 8 декабря 2008 в 8:24

    @wd, гугл подскажет. пробовал — работает не ахти напрямую и мудрено запускается через сторонние скрипты. не парьте мозг — просто скопируйте папку пхпмайдмина в подпапку сайта и ограничьте к ней доступ через запрос пароля мускула + htpasswd и все будет работать

  15. wd 8 декабря 2008 в 18:00

    Копировал, к сожалению не помогает

  16. Lecactus 8 декабря 2008 в 18:50

    wd похоже вы все же что то путаете в путях или настройках. у меня так работает безупречно

  17. wd 8 декабря 2008 в 20:11

    Скажите, а возможен доступ к проксирующему апачу напрямую по порту в браузере?

  18. Lecactus 9 декабря 2008 в 11:22

    wd а попробуйте вот так поставить всё http://df-yz.org/blog/?p=29

  19. wd 11 декабря 2008 в 4:27

    Lecactus, огромное спасибо! Ваши советы помогли.
    Столкнулся с новой проблемой. Поддомены…

  20. wd 12 декабря 2008 в 1:27

    Скажите, а у вас с вашей конфигурацией не было проблем с X-Accel-Redirect?

  21. Lecactus 12 декабря 2008 в 1:36

    wd, а что это и с чем едят? не сталкивался

  22. wd 12 декабря 2008 в 2:32

    Php код header("Location: someurl") не будет работать при проксирующем Nginx.
    Для этого придумали передавать в header X-Accel-Redirect, что является заменой Location, и сигналом для Nginx сделать редирект.

  23. Lecactus 12 декабря 2008 в 2:35

    Php код header(«Location: someurl») не будет работать при проксирующем Nginx.

    ок завтра обсудим детально. любопытно стало

    я так понял это про это идет речь http://blog.kovyrin.net/2006/11/01/nginx-x-accel-redirect-php-rails/

  24. wd 12 декабря 2008 в 2:50

    Да, всё верно. Читал эту статью. Может из-за моих кривых рук ничего не выходит… Ну не редиректит и всё… Если будет время и желание, поглядите, может проблема не в руках

  25. Mikhailov Anatoly 18 декабря 2008 в 11:09

    Article about mod_deflate settings like on Amazon EC2 AMI
    http://railsgeek.com/2008/12/16/apache2-httpd-improving-performance-mod_deflate-gzip

  26. Дима 12 февраля 2009 в 15:48

    Спасибо за ман. У вас в конфиге mysql указан query_cache_size размером 20Мб, а key-buffer — 2 Мб. Я уверен, что кеш запросов заполняется максимум на четверь, а key-buffer следует ставить от 128Мб (в идеале — чуть больше, чем вес всех файлов с индексами).

  27. Lecactus 12 февраля 2009 в 15:50

    ок. попробуем поиграться с параметрами :) посмотрим что будет

  28. Damien 28 апреля 2009 в 1:12

    Строки 50 и 62 конфига nginx одинаковы и т.д.,- это так нужно?

  29. stas 7 мая 2009 в 2:28

    Подскажи, а с такой траблой не сталкивался?

    # sudo /etc/init.d/apache2 restart
    * Restarting web server htcacheclean
    apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName
    [Thu May 07 03:24:03 2009] [warn] VirtualHost 192.168.0.10:80 overlaps with VirtualHost 192.168.0.10:80, the first has precedence, perhaps you need a NameVirtualHost directive
    [Thu May 07 03:24:03 2009] [warn] VirtualHost 192.168.0.10:80 overlaps with VirtualHost 192.168.0.10:80, the first has precedence, perhaps you need a NameVirtualHost directive
    [Thu May 07 03:24:03 2009] [warn] VirtualHost 192.168.0.10:80 overlaps with VirtualHost 192.168.0.10:80, the first has precedence, perhaps you need a NameVirtualHost directive
    [Thu May 07 03:24:03 2009] [warn] VirtualHost 192.168.0.10:80 overlaps with VirtualHost 192.168.0.10:80, the first has precedence, perhaps you need a NameVirtualHost directive
    [Thu May 07 03:24:03 2009] [warn] VirtualHost 192.168.0.10:80 overlaps with VirtualHost 192.168.0.10:80, the first has precedence, perhaps you need a NameVirtualHost directive
    [Thu May 07 03:24:03 2009] [warn] VirtualHost 192.168.0.10:80 overlaps with VirtualHost 192.168.0.10:80, the first has precedence, perhaps you need a NameVirtualHost directive
    [Thu May 07 03:24:03 2009] [warn] VirtualHost 192.168.0.10:80 overlaps with VirtualHost 192.168.0.10:80, the first has precedence, perhaps you need a NameVirtualHost directive
    [Thu May 07 03:24:03 2009] [warn] VirtualHost 192.168.0.10:80 overlaps with VirtualHost 192.168.0.10:80, the first has precedence, perhaps you need a NameVirtualHost directive
    [Thu May 07 03:24:03 2009] [warn] VirtualHost 192.168.0.10:80 overlaps with VirtualHost 192.168.0.10:80, the first has precedence, perhaps you need a NameVirtualHost directive
    [Thu May 07 03:24:03 2009] [warn] VirtualHost 192.168.0.10:80 overlaps with VirtualHost 192.168.0.10:80, the first has precedence, perhaps you need a NameVirtualHost directive
    [Thu May 07 03:24:03 2009] [warn] VirtualHost 192.168.0.10:80 overlaps with VirtualHost 192.168.0.10:80, the first has precedence, perhaps you need a NameVirtualHost directive
    [Thu May 07 03:24:03 2009] [warn] VirtualHost 192.168.0.10:80 overlaps with VirtualHost 192.168.0.10:80, the first has precedence, perhaps you need a NameVirtualHost directive
    [Thu May 07 03:24:03 2009] [warn] VirtualHost 192.168.0.10:80 overlaps with VirtualHost 192.168.0.10:80, the first has precedence, perhaps you need a NameVirtualHost directive
    [Thu May 07 03:24:03 2009] [warn] VirtualHost 192.168.0.10:80 overlaps with VirtualHost 192.168.0.10:80, the first has precedence, perhaps you need a NameVirtualHost directive
    … waiting apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName
    [Thu May 07 03:24:04 2009] [warn] VirtualHost 192.168.0.10:80 overlaps with VirtualHost 192.168.0.10:80, the first has precedence, perhaps you need a NameVirtualHost directive
    [Thu May 07 03:24:04 2009] [warn] VirtualHost 192.168.0.10:80 overlaps with VirtualHost 192.168.0.10:80, the first has precedence, perhaps you need a NameVirtualHost directive
    [Thu May 07 03:24:04 2009] [warn] VirtualHost 192.168.0.10:80 overlaps with VirtualHost 192.168.0.10:80, the first has precedence, perhaps you need a NameVirtualHost directive
    [Thu May 07 03:24:04 2009] [warn] VirtualHost 192.168.0.10:80 overlaps with VirtualHost 192.168.0.10:80, the first has precedence, perhaps you need a NameVirtualHost directive
    [Thu May 07 03:24:04 2009] [warn] VirtualHost 192.168.0.10:80 overlaps with VirtualHost 192.168.0.10:80, the first has precedence, perhaps you need a NameVirtualHost directive
    [Thu May 07 03:24:04 2009] [warn] VirtualHost 192.168.0.10:80 overlaps with VirtualHost 192.168.0.10:80, the first has precedence, perhaps you need a NameVirtualHost directive
    [Thu May 07 03:24:04 2009] [warn] VirtualHost 192.168.0.10:80 overlaps with VirtualHost 192.168.0.10:80, the first has precedence, perhaps you need a NameVirtualHost directive
    [Thu May 07 03:24:04 2009] [warn] VirtualHost 192.168.0.10:80 overlaps with VirtualHost 192.168.0.10:80, the first has precedence, perhaps you need a NameVirtualHost directive
    [Thu May 07 03:24:04 2009] [warn] VirtualHost 192.168.0.10:80 overlaps with VirtualHost 192.168.0.10:80, the first has precedence, perhaps you need a NameVirtualHost directive
    [Thu May 07 03:24:04 2009] [warn] VirtualHost 192.168.0.10:80 overlaps with VirtualHost 192.168.0.10:80, the first has precedence, perhaps you need a NameVirtualHost directive
    [Thu May 07 03:24:04 2009] [warn] VirtualHost 192.168.0.10:80 overlaps with VirtualHost 192.168.0.10:80, the first has precedence, perhaps you need a NameVirtualHost directive
    [Thu May 07 03:24:04 2009] [warn] VirtualHost 192.168.0.10:80 overlaps with VirtualHost 192.168.0.10:80, the first has precedence, perhaps you need a NameVirtualHost directive
    [Thu May 07 03:24:04 2009] [warn] VirtualHost 192.168.0.10:80 overlaps with VirtualHost 192.168.0.10:80, the first has precedence, perhaps you need a NameVirtualHost directive
    [Thu May 07 03:24:04 2009] [warn] VirtualHost 192.168.0.10:80 overlaps with VirtualHost 192.168.0.10:80, the first has precedence, perhaps you need a NameVirtualHost directive
    …done.

  30. Lecactus 7 мая 2009 в 13:11

    stas, попробуй напиши первой строкой в конфиге апача
    ServerName ubuntu (короче название компа)

    и еще тут http://www.lexa.ru/nginx-ru/msg18650.html вроде что то про это

  31. stas 7 мая 2009 в 18:19

    Точно :-)

    ServerName убили —
    «apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName «,

    а удаление не спроксированых на джинкс хостов (ненужных:) убрали вары.

    В целом все встало ровно, но связка virtualmin lamp немного ругалась, хотя сейчас все работает просто отлично. сенк за ман :-)

  32. webdev 15 мая 2009 в 1:02

    Гм, а где результаты замеров производительности? До и после настройки? Очень интересно потому что «Загрузка страниц локально была 5-10секунд, а на объемных страницах до 30секунд» — для меня звучит как страшный сон :)))
    У меня на старом домашнем компе с Debian Lenny довольно тяжелая Joomla1.5 с отключенным кешем и всеми настройками по дефолту рожает страничку целую секунду! и это ОЧЕНЬ долго!!! Надеюсь, вам удалось после всего вышеописанного кошмара добиться обработки хотя бы 2-3 запросов в секунду?

  33. Lecactus 15 мая 2009 в 6:55

    webdev, какие имеются ввиду 2-3 запроса в секунду? все грузится и «рожается» гораздо быстрее

  34. webdev 16 мая 2009 в 0:06

    Насчет 2-3 запросов в секунду — это был мой вопрос, а не утверждение. Я верю что все стало гораздо быстрее. Интересно было насколько именно…

  35. Lecactus 16 мая 2009 в 0:10

    где то тут в постах я неоднократно писал сравнение до и после. сейчас трудно найти уже

  36. Damien 27 мая 2009 в 1:42

    Я так понимаю, что в своём примере вы ставите fastcgi. А зачем он здесь нужен? Вот здесь об этом говорилось. И как на счёт моего предыдущего коментария?

  37. Lecactus 27 мая 2009 в 10:17

    Damien, насколько помню переключил в этот режим я потому что так apache потреблял в свое время намного меньше ресурсов. надо провести новые эксперименты

  38. Lecactus 27 мая 2009 в 10:38

    Строки 50 и 62 конфига nginx одинаковы и т.д.,- это так нужно?

    это очепятка

  39. Lecactus 29 мая 2009 в 16:26

    2Damien по вышеприведенной ссылке почитал про настройки акселератора, для теста пару дней назад переключил на «кэширование только в памяти» и сегодня полчаса не мог понять почему после правки шаблона у меня отдавало в браузер старый. рестартанул апач — стало нормально. при дисковом кэше таких глюков я не замечал. вернул назад. разницы в скорости никакой все равно

  40. zorggg 5 июня 2009 в 19:42

    Спасибо автору за статью — очень полезная!
    А у кого-нить получилось по этой статье настроить отдачу статических файлов через сам nginx?
    Я тестировал,у меня не вышло.Если я набираю несуществующий файл с расширением jpg,то его должен отдавать nginx,а сообщение об ошибке приходит от apache => все отдается через apache+nginx а это неправильно!(+логи то же говорят)
    Кто-нибудь вообще проверял?

  41. Lecactus 5 июня 2009 в 19:51

    у меня точно все нормально отдается, а если у вас отдается апачевская страница 404 то настройте 404 страницу в нгинксе с нужным расширением которое тоже должен отдавать нгинкс. например 404.html (у меня html файлы он отдает)

  42. zorggg 5 июня 2009 в 20:29

    to Lecactus
    Спасибо за оперативный ответ!)))
    Но nginx должен отдавать свою страницу об ошибке если сам обрабатывает запрос на статику (ведь по умолчанию все сервера выдают свою страницу сообщения об ошибке),иначе он передается apache,тот его обрабатывает и соответственно отдает свою ошибку.
    Да дело не только в странице 404,я по логам смотрел что на статику nginx все равно запрос передает на apache.
    Просто я тестировал nginx на статику без apache и он выдавал свое сообщение об ошибке!
    Кстати,как вообще в принципе проверить кто отдает статику?Я вот только по сообщениям об ошибках и по логам проверял!
    А где у nginx хранятся его сообщения об ошибках?Я вот пока не нашел…

    P.S. Lecactus а у вас действительно все нормально?Вы по логам смотрели?

  43. Александр 11 июля 2009 в 19:53

    Может не совсем в тему, но нашел в пакетах FreeBSD… WordPress! (+mu)

  44. Александр 29 декабря 2009 в 16:23

    Приветствую!
    Данные настройки только для обычного WordPress, для MU нужно кое что править
    + по MySQL не совсем удачные настройки.. кстати — количество максимально разрешенных подключений к БД — это максимальное количество подключений к серверу +2 (для администрирования запасик)

  45. Vladimir 4 января 2010 в 12:57

    Дополнения (улучшения конфигов) приветствуются.

    MySQL:

    1. Увеличить размер буфера ключей (key_buffer). У нас (с 8 GB RAM) key_buffer = 512M. Для приблизительной оценки нужно посчитать размер всех .MYI-файлов и смотреть статичтику использования буфера.

    2. Задать tmp_table_size. У нас стоит 10M. При сложных запросах (с GROUP BY) и малом размере MySQL будет сбрасывать временную таблицу на диск (преобразовывать HEAP в MyISAM). Нужно смотреть значение SHOW STATUS LIKE ‘Created_tmp_disk_tables’. При большом значении увеличивать размер переменной.

    3. Задать кэш запросов, например:

    query_cache_limit = 1M
    query_cache_size = 32M

    Значение можно подстраивать, используя данные SHOW STATUS LIKE ‘Qcache_free_memory’ и SHOW STATUS LIKE ‘Qcache_lowmem_prunes’.

    Ну и в конфиг nginx к


    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|html)$ {
    root /vhosts/web/site6;
    }

    Я бы добавил expires 96h; (после root) — если статические файлы редко изменяются, имеет смысл задавать заголовок Expires, который позволит браузеру сэкономить на запросах к серверу.

    В gzip_types добавил бы еще text/javascript. И директиву gzip_disable «MSIE [1-6]»;

    В php.ini:
    register_long_arrays = Off
    enable_dl = Off
    magic_quotes_gpc = Off
    register_argc_argv = Off

    Еще убрал бы лишние extension.

    Вроде бы всё.

  46. CyberMax 5 февраля 2010 в 22:41

    До Nginx ещё не добрался, вот с кодировкой писем разбираюсь. Стоит Apache2+PHP+MySQL+Postfix на Debian. Письма с сервера приходят вот так:

    &#1057; &#1091;&#1074;&#1072;&#1078;&#1077;&#1085;&#1080;&#1077;&#1084;

    Добавил эти строки в /etc/apache2/apache2.conf:

    AddDefaultCharset UTF-8
    # For russian, more than one charset is used (depends on client, mostly):
    AddCharset WINDOWS-1251 .cp-1251 .win-1251
    AddCharset UTF-8 .utf8

    перезагрузил апач, но всё равно кодировка писем не меняется. Может подскажите что ещё можно сделать чтобы исправить?

  47. CyberMax 5 февраля 2010 в 23:23

    Уже кажись разобрался. Это просто русский перевод писем в одном скрипте в файле перевода так и идет: $lng['mails']['createcustomer']['subject'] = '&#1044;&#1072;&#1085;&#1085;&#1099;&#1077; &#1082; &#1072;&#1082;&#1082;&#1072;&#1091;&#1085;&#1090;&#1091;';
    вот и такое бывает :) Главное шо в болгарском переводе всё нормально.