Как установить 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 с сервера федоры не подходил. все глючило и вообще не запускалось иногда. И вот более менее внятное руководство нашлось
После того как все настроилось я так все и оставил на несколько месяцев. Вроде этого и хватало, но все же не давал покоя факт очень медленной загрузки скриптов, файлов стилей и картинок. Очень заметно это было в окне создания поста намоем «нагруженном» всем подряд блоге. Настроил я апача на порт 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
С настройкой почты было все просто когда я
/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 или как ускорить работу сайтов в разы.”
хочеш быстродействия? ставь bsd
@флу: думаю холивар линукс-бсд тут неуместен. я видел сервера более «производительные по железу» где работало бсд и все «ползала» при аналогичной конфигурации и наборе софта. и вчера кстати тоже видел такое на одном сервере, да и тут среди моих читателей есть те у кого сайты работают на BSD (Daemony насколько помнится точно использует) и сверхпроизводительности я не замечал.
Пригодится, отличная статейка! А то я всё сам хотел у тебя поинтересоваться, как ты что настроил…
Да без разницы что стоит — Linux или *BSD, если руки прямые и из нужного места растут, то всё летать будет и даже винда! А остальное дело привычки и не более. ИМХО конечно
Знал бы ты:
— сколько разного гавнеца запущено на этом бедном сервере помимо хостинга;
— насколько галимой бывает исходящая связь у моего провайдера в мир.
Хотя с этим
я тоже не совсем согласен. Скорее вот с этим:
как вариант у меня заработало следуюшее шаменство
в файле /etc/hosts добавил
127.0.0.1 yourorel.ru
в итоге в апаче прописал
Listen 8080
а также в виртуальных постах указал 8080
и не пришлось для каждого сайта указывать свой портhttp://yourorel.ru:8080/ ;
в nginx
proxy_pass
@gled: у меня тоже раньше был «один порт на всех», но так не работает отдача картинок и другой статики напрямую Nginx-ом
еще бы в my.cnf не помешало бы добавить параметр благодаря которому mysql прекратит смотреть в инет.
skip-networking
Машинка бегает на Ubuntu Server 8.10. Сделал всё как написано в статье, но в итоге лишился доступа к phpmyadmin, и на другие вирт хосты просто отказываются работать. Игрался с настройками, в лучшем случае получал php сурс. Не подскажите в чём может быть моя ошибка?
@wd, откуда я могу знать как у вас было настроено до этого? и что значит лишился доступа к пхпмайдмину? он лежит где то в папке сайта или где то снаружи через алиас цепляется?
Lecactus, я всё сделал по инструкции.
Допустим добавил только 1 vhost ктр работает с Nginx как фронтэндом и Apache на бэке.
Так вот — поидеи — по адресу 127.0.0.1/phpmyadmin я должен же попасть на phpmyadmin, но nginx возвращает 404
Пробовал настраивать /usr/share/phpmyadmin как base folder для vhost — тоже ошибка
@wd, правильно возвращает 404. будет работать только если укажете domain/phpmyadmin и никак иначе
попробуйте через алиас в апаче пусть прописать или вообще просто папку пхпмайдмина скопируйте в папку сайта
Скопировал как вы и говорили, в vhost у ктр рабочий php.. Всё равно php код не выполняется из phpmyadmin, а другие скрипты работают
Кажется это всё из-за специфичности работы phpmyadmin
Не подскажите как пустить vhost напрямую через php обработчик Nginx’a, а не проксирующего Apache?
@wd, гугл подскажет. пробовал — работает не ахти напрямую и мудрено запускается через сторонние скрипты. не парьте мозг — просто скопируйте папку пхпмайдмина в подпапку сайта и ограничьте к ней доступ через запрос пароля мускула + htpasswd и все будет работать
Копировал, к сожалению не помогает
wd похоже вы все же что то путаете в путях или настройках. у меня так работает безупречно
Скажите, а возможен доступ к проксирующему апачу напрямую по порту в браузере?
wd а попробуйте вот так поставить всёhttp://df-yz.org/blog/?p=29
Lecactus, огромное спасибо! Ваши советы помогли.
Столкнулся с новой проблемой. Поддомены…
Скажите, а у вас с вашей конфигурацией не было проблем с X-Accel-Redirect?
wd, а что это и с чем едят? не сталкивался
Php код header("Location: someurl") не будет работать при проксирующем Nginx.
Для этого придумали передавать в header X-Accel-Redirect, что является заменой Location, и сигналом для Nginx сделать редирект.
ок завтра обсудим детально. любопытно стало
я так понял это про это идет речьhttp://blog.kovyrin.net/2006/11/01/nginx-x-accel-redirect-php-rails/
Да, всё верно. Читал эту статью. Может из-за моих кривых рук ничего не выходит… Ну не редиректит и всё… Если будет время и желание, поглядите, может проблема не в руках
Article about mod_deflate settings like on Amazon EC2 AMI
http://railsgeek.com/2008/12/16/apache2-httpd-improving-performance-mod_deflate-gzip
Спасибо за ман. У вас в конфиге mysql указан query_cache_size размером 20Мб, а key-buffer — 2 Мб. Я уверен, что кеш запросов заполняется максимум на четверь, а key-buffer следует ставить от 128Мб (в идеале — чуть больше, чем вес всех файлов с индексами).
ок. попробуем поиграться с параметрами :) посмотрим что будет
Строки 50 и 62 конфига nginx одинаковы и т.д.,- это так нужно?
Подскажи, а с такой траблой не сталкивался?
# 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.
stas, попробуй напиши первой строкой в конфиге апача
ServerName ubuntu (короче название компа)
и еще тутhttp://www.lexa.ru/nginx-ru/msg18650.html вроде что то про это
Точно :-)
ServerName убили —
«apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName «,
а удаление не спроксированых на джинкс хостов (ненужных:) убрали вары.
В целом все встало ровно, но связка virtualmin lamp немного ругалась, хотя сейчас все работает просто отлично. сенк за ман :-)
Гм, а где результаты замеров производительности? До и после настройки? Очень интересно потому что «Загрузка страниц локально была 5-10секунд, а на объемных страницах до 30секунд» — для меня звучит как страшный сон :)))
У меня на старом домашнем компе с Debian Lenny довольно тяжелая Joomla1.5 с отключенным кешем и всеми настройками по дефолту рожает страничку целую секунду! и это ОЧЕНЬ долго!!! Надеюсь, вам удалось после всего вышеописанного кошмара добиться обработки хотя бы 2-3 запросов в секунду?
webdev, какие имеются ввиду 2-3 запроса в секунду? все грузится и «рожается» гораздо быстрее
Насчет 2-3 запросов в секунду — это был мой вопрос, а не утверждение. Я верю что все стало гораздо быстрее. Интересно было насколько именно…
где то тут в постах я неоднократно писал сравнение до и после. сейчас трудно найти уже
Я так понимаю, что в своём примере вы ставите fastcgi. А зачем он здесь нужен?Вот здесь об этом говорилось . И как на счёт моего предыдущего коментария?
Damien, насколько помню переключил в этот режим я потому что так apache потреблял в свое время намного меньше ресурсов. надо провести новые эксперименты
это очепятка
2Damien по вышеприведенной ссылке почитал про настройки акселератора, для теста пару дней назад переключил на «кэширование только в памяти» и сегодня полчаса не мог понять почему после правки шаблона у меня отдавало в браузер старый. рестартанул апач — стало нормально. при дисковом кэше таких глюков я не замечал. вернул назад. разницы в скорости никакой все равно
Спасибо автору за статью — очень полезная!
А у кого-нить получилось по этой статье настроить отдачу статических файлов через сам nginx?
Я тестировал,у меня не вышло.Если я набираю несуществующий файл с расширением jpg,то его должен отдавать nginx,а сообщение об ошибке приходит от apache => все отдается через apache+nginx а это неправильно!(+логи то же говорят)
Кто-нибудь вообще проверял?
у меня точно все нормально отдается, а если у вас отдается апачевская страница 404 то настройте 404 страницу в нгинксе с нужным расширением которое тоже должен отдавать нгинкс. например 404.html (у меня html файлы он отдает)
to Lecactus
Спасибо за оперативный ответ!)))
Но nginx должен отдавать свою страницу об ошибке если сам обрабатывает запрос на статику (ведь по умолчанию все сервера выдают свою страницу сообщения об ошибке),иначе он передается apache,тот его обрабатывает и соответственно отдает свою ошибку.
Да дело не только в странице 404,я по логам смотрел что на статику nginx все равно запрос передает на apache.
Просто я тестировал nginx на статику без apache и он выдавал свое сообщение об ошибке!
Кстати,как вообще в принципе проверить кто отдает статику?Я вот только по сообщениям об ошибках и по логам проверял!
А где у nginx хранятся его сообщения об ошибках?Я вот пока не нашел…
P.S. Lecactus а у вас действительно все нормально?Вы по логам смотрели?
Может не совсем в тему, но нашел в пакетах FreeBSD… WordPress! (+mu)
Приветствую!
Данные настройки только для обычного WordPress, для MU нужно кое что править
+ по MySQL не совсем удачные настройки.. кстати — количество максимально разрешенных подключений к БД — это максимальное количество подключений к серверу +2 (для администрирования запасик)
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.
Вроде бы всё.
До Nginx ещё не добрался, вот с кодировкой писем разбираюсь. Стоит Apache2+PHP+MySQL+Postfix на Debian. Письма с сервера приходят вот так:
С уважением
Добавил эти строки в /etc/apache2/apache2.conf:
перезагрузил апач, но всё равно кодировка писем не меняется. Может подскажите что ещё можно сделать чтобы исправить?
Уже кажись разобрался. Это просто русский перевод писем в одном скрипте в файле перевода так и идет:
$lng['mails']['createcustomer']['subject'] = 'Данные к аккаунту';
вот и такое бывает :) Главное шо в болгарском переводе всё нормально.