Как установить 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 комментариев
Страницы: « 1 [2] 3 » Show All
Страницы: « 1 [2] 3 » Show All
Комментарии не по теме удаляются! Читайте реадми дистрибутива, комментарии выше и FAQ! Прежде чем задавать вопрос, прочитайте это. Научитесь ценить чужое время!

(голосов: 10, средний: 4.90 из 5)

7 ноября 2008 в 20:32 (GMT+6)
еще бы в my.cnf не помешало бы добавить параметр благодаря которому mysql прекратит смотреть в инет.
skip-networking
7 декабря 2008 в 4:15 (GMT+6)
Машинка бегает на Ubuntu Server 8.10. Сделал всё как написано в статье, но в итоге лишился доступа к phpmyadmin, и на другие вирт хосты просто отказываются работать. Игрался с настройками, в лучшем случае получал php сурс. Не подскажите в чём может быть моя ошибка?
7 декабря 2008 в 9:52 (GMT+6)
@wd, откуда я могу знать как у вас было настроено до этого? и что значит лишился доступа к пхпмайдмину? он лежит где то в папке сайта или где то снаружи через алиас цепляется?
7 декабря 2008 в 15:44 (GMT+6)
Lecactus, я всё сделал по инструкции.
Допустим добавил только 1 vhost ктр работает с Nginx как фронтэндом и Apache на бэке.
Так вот – поидеи – по адресу 127.0.0.1/phpmyadmin я должен же попасть на phpmyadmin, но nginx возвращает 404
Пробовал настраивать /usr/share/phpmyadmin как base folder для vhost – тоже ошибка
7 декабря 2008 в 16:07 (GMT+6)
@wd, правильно возвращает 404. будет работать только если укажете domain/phpmyadmin и никак иначе
попробуйте через алиас в апаче пусть прописать или вообще просто папку пхпмайдмина скопируйте в папку сайта
8 декабря 2008 в 3:27 (GMT+6)
Скопировал как вы и говорили, в vhost у ктр рабочий php.. Всё равно php код не выполняется из phpmyadmin, а другие скрипты работают
Кажется это всё из-за специфичности работы phpmyadmin
Не подскажите как пустить vhost напрямую через php обработчик Nginx’a, а не проксирующего Apache?
8 декабря 2008 в 8:24 (GMT+6)
@wd, гугл подскажет. пробовал – работает не ахти напрямую и мудрено запускается через сторонние скрипты. не парьте мозг – просто скопируйте папку пхпмайдмина в подпапку сайта и ограничьте к ней доступ через запрос пароля мускула + htpasswd и все будет работать
8 декабря 2008 в 18:00 (GMT+6)
Копировал, к сожалению не помогает
8 декабря 2008 в 18:50 (GMT+6)
wd похоже вы все же что то путаете в путях или настройках. у меня так работает безупречно
8 декабря 2008 в 20:11 (GMT+6)
Скажите, а возможен доступ к проксирующему апачу напрямую по порту в браузере?
9 декабря 2008 в 11:22 (GMT+6)
wd а попробуйте вот так поставить всё
11 декабря 2008 в 4:27 (GMT+6)
Lecactus, огромное спасибо! Ваши советы помогли.
Столкнулся с новой проблемой. Поддомены…
12 декабря 2008 в 1:27 (GMT+6)
Скажите, а у вас с вашей конфигурацией не было проблем с X-Accel-Redirect?
12 декабря 2008 в 1:36 (GMT+6)
wd, а что это и с чем едят? не сталкивался
12 декабря 2008 в 2:32 (GMT+6)
Php код header("Location: someurl") не будет работать при проксирующем Nginx.
Для этого придумали передавать в header X-Accel-Redirect, что является заменой Location, и сигналом для Nginx сделать редирект.
12 декабря 2008 в 2:35 (GMT+6)
ок завтра обсудим детально. любопытно стало
я так понял это про это идет речь
12 декабря 2008 в 2:50 (GMT+6)
Да, всё верно. Читал эту статью. Может из-за моих кривых рук ничего не выходит… Ну не редиректит и всё… Если будет время и желание, поглядите, может проблема не в руках
18 декабря 2008 в 11:09 (GMT+6)
Article about mod_deflate settings like on Amazon EC2 AMI
12 февраля 2009 в 15:48 (GMT+6)
Спасибо за ман. У вас в конфиге mysql указан query_cache_size размером 20Мб, а key-buffer – 2 Мб. Я уверен, что кеш запросов заполняется максимум на четверь, а key-buffer следует ставить от 128Мб (в идеале – чуть больше, чем вес всех файлов с индексами).
12 февраля 2009 в 15:50 (GMT+6)
ок. попробуем поиграться с параметрами :) посмотрим что будет