Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> WWW —> nginx+php-fpm+mysql

Веб сервер на много коннектов и высокую нагрузку (nginx+php-fpm+mysql)

Автор: nikll.


Предисловие.

Вот хочу поделится с коллегами своими наработками, думаю они многим пригодятся.

1. Начнем с подготовки фри к постановке ее на веб сервер.

Сетапим на сервер фрю семерку архтиктуры amd64 (можно и i386 но там надо делать PAE ядро и расширять адресацию), обнавляем исходники
nice -20 csup /usr/src/csup

ee /usr/src/csup
*default host=cvsup6.ru.FreeBSD.org
*default base=/var/db
*default prefix=/usr
*default release=cvs tag=RELENG_7
*default delete use-rel-suffix
*default compress

src-all
ports-all tag=.
doc-all prefix=/usr/src tag=.

Правим конфиги
ee /etc/make.conf
# оптимизация под мой камень, применяется везде где только используется команда make, 
# позваляет получить немного лишних процентов производительности
CPUTYPE?=core2
NO_PROFILE=yes
NO_GAMES=yes
DOC_LANG=en_US.ISO8859-1 ru_RU.KOI8-R
WITHOUT_X11=YES
NO_X11=YES
WITH_IDEA=yes
MAKE_IDEA=yes
WITHOUT_GAMES=yes
WITHOUT_INET6=yes
WITHOUT_INET6_SUPPORT=yes
WITHOUT_PROFILE=yes
WITHOUT_IPV6=yes

PORTSDIR?=      /usr/ports

DEFAULT_MYSQL_VER=51
.if ${.CURDIR} == ${PORTSDIR}/databases/mysql51-server
WITH_PROC_SCOPE_PTH=yes  # треды
BUILD_OPTIMIZED=yes      # флаги оптимизации компилятору
# дает небольшой прирост производительности и независимость от внешних библиотек
BUILD_STATIC=yes
.endif
.if ${.CURDIR} == ${PORTSDIR}/databases/mysql51-client
WITH_PROC_SCOPE_PTH=yes
BUILD_OPTIMIZED=yes
BUILD_STATIC=yes
.endif

ee /etc/src.conf
WITHOUT_INET6=yes            # рубим ipv6, рассадник дыр в безопастности и глюков 
WITHOUT_INET6_SUPPORT=yes    # практическая его полездность будет еще не скоро...
WITHOUT_PROFILE=yes          

и пересобираем систему

cd /usr/src
nice -20 make -j6 buildworld

Пока собирается система можно занятся конфигом ядра в следующщей консоле (или другом ssh терминале).
cd /usr/src/sys/amd64/conf
cp GENERIC SERVER64
ee SERVER64

И правим ядро для наших целей, я например викидываю от туда дебаг, ipv6, и все не нужные мне драйвера
(nfs ntfs fat все рейды и сетевухи которых у меня нету fairwair usb wlan), и добавляю следующщее

options         SC_HISTORY_SIZE=8192    # чтобы в консоли можно было далеко листать историю
options         IPFIREWALL
options         IPFIREWALL_VERBOSE
options         IPFIREWALL_VERBOSE_LIMIT=4000
options         IPFIREWALL_DEFAULT_TO_ACCEPT
options         IPFIREWALL_FORWARD
options         DUMMYNET
options         ACCEPT_FILTER_DATA        # фильтры для nginx
options         ACCEPT_FILTER_HTTP        # ...
options         HZ=1000
options         DEVICE_POLLING

После того как сборка мира в первой консоле успешно закончится, можно приступать к сборке и установке нового ядра
nice -20 make -j2 kernel KERNCONF=SERVER64  # с -j6 иногда не собирается почемуто...

Так как хороший одмин должен быть ленивым, я создаю в корне скриптик
ee /upgrade && chmod 755 /upgrade
#!/bin/sh
fsck -p
mount -u /
mount -a
cd /usr/src
adjkerntz -i 
mergemaster -p
make installworld &&\
make delete-old &&\
mergemaster -i

Цепляем ip-kvm, ну или топаем туда где стоит сервер (нужна консоль), и перезагружаем его в однопользовательский режим.
nextboot -o "-s" -k kernel && reboot

Загружается система, на приглашение к выбору шела нажимаем Enter и после того как появиться консоль вводим
/upgrade && exit

mergemaster поспрашивает вас о конфигах, make delete-old поспрашивает о удалении старых файлов, после того как все вопросы будут отвечены и система установленна шел закроется и продолжиться нормальная загрузка уже новой системы.

2. Устанавливаем софт

Собственно ставим сам nginx, на запросы отвечаем так:
cd /usr/ports/www/nginx/ ; nice -20 make install clean
[ ] DEBUG                 Enable nginx debugging
[ ] GOOGLE_PERFTOOLS      Enable google perftools module
[X] HTTP_MODULE           Enable HTTP module
[X] HTTP_ADDITION_MODULE  Enable http_addition module
[X] HTTP_DAV_MODULE       Enable http_webdav module
[X] HTTP_FLV_MODULE       Enable http_flv module
[X] HTTP_PERL_MODULE      Enable http_perl module
[X] HTTP_REALIP_MODULE    Enable http_realip module
[X] HTTP_REWRITE_MODULE   Enable http_rewrite module
[X] HTTP_SSL_MODULE       Enable http_ssl module
[X] HTTP_STATUS_MODULE    Enable http_stub_status module
[X] HTTP_SUB_MODULE       Enable http_sub module
[ ] MAIL_MODULE           Enable IMAP4/POP3/SMTP proxy module
[ ] MAIL_IMAP_MODULE      Enable IMAP4 proxy module
[ ] MAIL_POP3_MODULE      Enable POP3 proxy module
[ ] MAIL_SMTP_MODULE      Enable SMTP proxy module
[ ] MAIL_SSL_MODULE       Enable mail_ssl module
[X] WWW                   Enable html sample files

Дальше ставим мускул и пхп:
cd /usr/ports/databases/mysql51-server/ ; nice -20 make install clean &&\
cd /usr/ports/lang/php5/ ; nice -20 make install clean

[X] CLI        Build CLI version
[X] CGI        Build CGI version
[ ] APACHE     Build Apache module
[ ] DEBUG      Enable debug
[X] SUHOSIN    Enable Suhosin protection system (not for jails)
[X] MULTIBYTE  Enable zend multibyte support
[ ] IPV6       Enable ipv6 support
[X] MAILHEAD   Enable mail header patch
[X] REDIRECT   Enable force-cgi-redirect support (CGI only)
[X] DISCARD    Enable discard-path support (CGI only)
[X] FASTCGI    Enable fastcgi support (CGI only)
[X] PATHINFO   Enable path-info-check support (CGI only)

Cтавим сопутствующщий софт:
cd /usr/ports/lang/php5-extensions/ ; nice -20 make install clean

Выбираем себе нужные модули для пыха.

И не забываем про ZendOptimizer (довольно часто попадаются зазенденные скрипты, поэтому всегда втыкаю его докучи, авось пригодится)
/usr/ports/devel/ZendOptimizer/ ; nice -20 make install clean

Ставим phpMyAdmin (вечное требованние программеров на пыхе, в консоли для них не кошерно...)
/usr/ports/databases/phpmyadmin/ ; nice -20 make install clean

Ставим wget из /usr/ports/ftp/wget  (это типа консольная качалка такая)
скачиваем порт php-fpm под фрю (я же говорил уже что хороший одмин он ленивый, и с патчами в исходниках ковырятся ему должно быть лень если все и так хорошо работает), распаковываем его в /usr/ports/lang/php5-fpm идем туда и сетапим его:
cd /usr/ports/ftp/wget ; nice -20 make install clean &&\
cd /usr/ports/lang &&\
wget http://php-fpm.anight.org/downloads/freebsd-port/php5-fpm-0.5.9.tar.gz &&\
tar xfz php5-fpm-0.5.9.tar.gz &&\
cd php5-fpm &&\
nice --20 make install clean

[X] CLI        Build CLI version
[ ] DEBUG      Enable debug
[X] SUHOSIN    Enable Suhosin protection system (not for jails)
[X] MULTIBYTE  Enable zend multibyte support
[ ] IPV6       Enable ipv6 support
[X] MAILHEAD   Enable mail header patch
[X] PATHINFO   Enable path-info-check support (CGI only)

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

3. Конфигурируем

Мой конфиг nginx:
less /usr/local/etc/nginx/nginx.conf
# рекомендуют делать по количеству ядер
# но время отклика реально уменьшяется если запутить побольше воркеров,
# т.к. у меня памяти много сделал сразу 100
worker_processes 100;
# приоретет воркеров, сделал повыше 
# чтобы из за медленных скриптов и корявых
# мускульных запросов статика отдавалась без лагов
worker_priority -5;
worker_rlimit_nofile 51200;

events {
    worker_connections  51200;
    use                 kqueue;
}

http {
    include             mime.types;
    default_type        application/octet-stream;

    log_format  main    '$remote_addr - $remote_user [$time_local] $request '
                        '"$status" $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';

    server_names_hash_bucket_size       512;
    sendfile            on;
    tcp_nopush          on;
    keepalive_timeout   70 30;
    send_timeout        30s;
    reset_timedout_connection   on;
    resolver            127.0.0.1;
    resolver_timeout    10s;

    open_file_cache             max=100000 inactive=40s;
    open_file_cache_valid       60s;
    open_file_cache_min_uses    2;
    open_file_cache_errors      on;

    server {
        listen          80;
        server_name     www.ru;
        charset         koi8-r;
        location / {
            root        /usr/local/www/nginx;
            index       index.html index.htm;
        }
    }

    server {
        # фильтр позволяет отфильтровывать 
        # все не хттп соеденения до их установки на уровне ядра 
        # (собираются все пакеты анализируется GET загаловок, 
        # если его нет соеденение отбрасывается, если есть то соедененине 
        # появляется в системе и нгинксе, оч полезно от примитивного доса).
        listen          80  default accept_filter=httpready;

        server_name     www.mysite.ru mysite.ru

        charset windows-1251;

        access_log      /home/igrosoft/access_log       main;
        error_log       /home/igrosoft/error_log        error;

        location / {
            root        /home/site;
            index       index.html index.htm index.php;
        }

        location /mrtg/ {                         # это mrtg
            alias       /usr/local/www/mrtg/;
            index       index.html index.htm;
            auth_basic  Admin;
            auth_basic_user_file /usr/local/www/mrtg/.htpasswd;
        }
        # а это для phpmyadmin, чтобы норально обрабатывались пхп скрипты
        # надо создать линк из основной директории коммандой
        # ln -s /usr/local/www/phpMyAdmin /home/site/.,ak,234sfyf34.:,.s
        location /.,ak,234sfyf34.:,.s/ {                               
            alias       /usr/local/www/phpMyAdmin/;
            index       index.html index.htm index.php;
            auth_basic  Admin;
            auth_basic_user_file /usr/local/www/phpMyAdmin/.htpasswd;
        }
        # передаем обработку пхп скриптов на php-fpm
        location ~* \.php$ {
            fastcgi_pass        unix:/tmp/php-fpm.sock;
            fastcgi_index       index.php;
            fastcgi_param       SCRIPT_FILENAME  /home/site$fastcgi_script_name;
            include             fastcgi_params;
        }

        location ~ /\.ht {     # закрываем доступ к файлам .htpasswd
            deny        all;
        }

        error_page      500 502 503 504         /50x.html;
        location = /50x.html {
            root        /usr/local/www/nginx-dist;
        }
        # с этой странички мы будем брать статистику по нгинксу для мртг
        location /nginx_status {
            stub_status on;
            access_log   off;
            allow 127.0.0.1;
            deny all;
        }




    # HTTPS
    server {
        listen       443;
        server_name  localhost;

        ssl                  on;                   # задаем настройки для ssl 
        ssl_certificate      cert.pem;
        ssl_certificate_key  cert.key;
        ssl_session_timeout  5m;
        ssl_protocols  SSLv2 SSLv3 TLSv1;
        ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
        ssl_prefer_server_ciphers   on;

        server_name     www.myserver.ru myserver.ru

             # а дальше все тоже самое описание location'ов
             # аналогичное тому что было указанно выше 

    }
}

Теперь поправим конфиг у fpm'a
ee /usr/local/etc/php-fpm.conf
я там изменил только следующщие строчки:
   <!-- меняем сокет, вместо tcp'шного делаем -->
   <!-- локальный чтобы лишний раз стек не напрягать -->
<value name="listen_address">/tmp/php-fpm.sock</value>

   <!-- устанавливаем количество процессов php-cgi -->
   <!-- отнестить к этому нужно внимательно т.к. -->
   <!-- именно столько максимум php скриптов сможет выполняться одновременно-->
<value name="max_children">120</value>

   <!-- Очень полезная для оптимизации скриптов и мускульных запросов фича -->
   <!-- записывает в лог все данные о скрипте который -->
   <!-- выполняется дольше указанного времени -->
<value name="request_slowlog_timeout">5s</value>
<value name="slowlog">/var/log/php-slow.log</value>

   <!-- сколько запросов выполнит один cgi процесс прежде чем его перезапустят -->
<value name="max_requests">1500</value>

Пхп каждый конфигурит себе сам, но на основе длительного ковыряния с кучей серверов у меня получилось оптимальным вот это:
ee /usr/local/etc/php.ini
[PHP]
engine = On
zend.ze1_compatibility_mode = Off
short_open_tag = On
asp_tags = Off
precision    =  14
y2k_compliance = On
output_buffering = 4096
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func=
serialize_precision = 100
allow_call_time_pass_reference = Off
safe_mode = Off
safe_mode_gid = Off
safe_mode_include_dir =
safe_mode_exec_dir =
safe_mode_allowed_env_vars = PHP_
safe_mode_protected_env_vars = LD_LIBRARY_PATH
disable_functions =
disable_classes =
expose_php = On
max_execution_time = 30
max_input_time = 60
memory_limit = 128M               ; увеличиваем лимит по памяти для "тяжелых" скриптов
error_reporting  =  E_ALL & ~E_NOTICE
display_errors = Off
display_startup_errors = Off
log_errors = On
log_errors_max_len = 10240
ignore_repeated_errors = On
ignore_repeated_source = On
report_memleaks = On
track_errors = On
variables_order = "EGPCS"
register_globals = On
register_long_arrays = Off
register_argc_argv = Off
auto_globals_jit = On
post_max_size = 32M
magic_quotes_gpc = Off
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
file_uploads = On
upload_max_filesize = 800M
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60

[Syslog]
define_syslog_variables  = Off

[mail function]
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 = Off
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_probability = 1
session.gc_divisor     = 1000
session.gc_maxlifetime = 256000
session.bug_compat_42 = 0
session.bug_compat_warn = 1
session.referer_check =
session.entropy_length = 0
session.entropy_file =
session.cache_limiter = nocache
session.cache_expire = 18000
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 5
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"

[Tidy]
tidy.clean_output = Off

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

[Zend]
zend_optimizer.optimization_level=2   ; 2 потому что на архетитуре amd64 
                                      ; при дефолтном значении 15 кладет пых в корку
zend_extension_manager.optimizer="/usr/local/lib/php/20060613/Optimizer"
zend_extension_manager.optimizer_ts="/usr/local/lib/php/20060613/Optimizer_TS"
zend_extension="/usr/local/lib/php/20060613/ZendExtensionManager.so"
zend_extension_ts="/usr/local/lib/php/20060613/ZendExtensionManager_TS.so"

Тепер переходим к тюнингу tcp стека:
ee /etc/sysctl.conf
net.inet.tcp.blackhole=2      # включаем черные дыры для tcp
net.inet.udp.blackhole=1      # и udp
kern.ipc.nmbclusters=65536    # увеличиваем лимиты
kern.ipc.somaxconn=32768      
kern.ipc.maxsockets=204800
kern.maxfiles=256000
kern.maxfilesperproc=230400
net.inet.ip.portrange.first=1024
net.inet.ip.portrange.last=65535
net.inet.ip.portrange.randomized=0
net.inet.tcp.maxtcptw=40960
# самый на мой взгляд важный параметр, субьективно:
# при уменьшении уменьшается количество вейтов, сервер лудьше держит нагрузку
# при увеличении реже рветься связь на плохих каналах, нагрузка возрастает
net.inet.tcp.msl=40000
net.inet.tcp.finwait2_timeout=40000
net.inet.tcp.syncookies=1
net.inet.tcp.sack.enable=1
net.inet.tcp.nolocaltimewait=1
net.inet.tcp.fast_finwait2_recycle=1
net.inet.icmp.drop_redirect=1
net.inet.icmp.log_redirect=1
net.inet.ip.redirect=0
kern.polling.enable=1
kern.polling.burst_max=1000
kern.polling.each_burst=50
net.inet.icmp.icmplim=5000

ee /boot/loader.conf
net.inet.tcp.syncache.hashsize=1024
net.inet.tcp.syncache.bucketlimit=100
net.inet.tcp.tcbhashsize=4096

По оптимизации стека и настройку sysctl можно почитать следующщее:
http://www.opennet.ru/base/net/tune_freebsd.txt.html
http://www.lissyara.su/?id=1147

По настроке nginx:
http://sysoev.ru/nginx/docs/
http://www.lexa.ru/nginx-ru/

Ну и напоследок гугл еще никто не отменял ;-)


Уф, великовата уже статейка получилась, пора бы и закруглятся, ждите продолжений.



размещено: 2008-04-18,
последнее обновление: 2008-11-21,
автор: nikll


arksu, 2008-11-20 в 13:54:31

норм статья! побольше бы таких глубоких материалов.
собрано много много житейского опыта на продакшн серверах )))

RWH, 2008-11-20 в 14:10:50

+5

Паха, 2008-11-20 в 14:33:13

Вот! А я искал это! Спасибо! Побольше пиши))
Вся правильно и работоспособно! Как и все твои статьи... добавил в свой архивчик статью

gmn, 2008-11-20 в 18:16:07

фильтры в ядро вкомпиливать не обязательно.
Можно загрузить так:
/boot/loader.conf
accf_data_load="YES"
accf_http_load="YES"

nikll, 2008-11-20 в 18:37:21

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

Medved, 2008-11-20 в 20:09:27

worker_connections  51200
и
open_file_cache max=100000

ужасно больши и никак не влезут в worker_rlimit_nofile и tcp4 (при fastcgi_pass)

nikll, 2008-11-20 в 20:28:32

Про worker_connections я так и не нашел ни одного нормлаьного обьяснения что это такое и как этот параметр правильно настраивать.
Про open_file_cache на мой сугубо неопытный взгляд все в порядке, http://sysoev.ru/nginx/docs/http/ngx_http_core_module.html#open_file_cache тут описание этой директивы. Вопрос почему бы и нет? Ну будет у меня 100тыс записей о файлах и что такого, на тех серверах как минимум 4гб озу, ее хватает за глаза...
P.S. у меня аська есть 322344962, плиз, если есть маленько свободного времени, проконсультироваться хочу :)

nikll, 2008-11-20 в 20:45:38

Вот я вспомнил где я нашел рекомендацию к выставлению большого значения worker_connections
http://www.lexa.ru/nginx-ru/msg06936.html

sect0id, 2008-11-21 в 13:09:36

спасибо хорошая статья
опыт виден

location /.,ak,234sfyf34.:,.s/
это так прячешь?

nikll, 2008-11-21 в 14:58:34

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

Андрей, 2009-01-14 в 19:14:07

Какое количество соединений в секунду держит данный конфиг?

nezabor, 2009-01-16 в 22:03:34

open# wget http://php-fpm.anight.org/downloads/freebsd-port/php5-fpm-0.5.9.tar.gz
--2009-01-16 22:02:46—  http://php-fpm.anight.org/downloads/freebsd-port/php5-fpm-0.5.9.tar.gz
Resolving php-fpm.anight.org... 89.235.197.21
Connecting to php-fpm.anight.org|89.235.197.21|:80... connected.
HTTP request sent, awaiting response... 404 Not Found
2009-01-16 22:02:50 ERROR 404: Not Found.

torki, 2009-01-16 в 23:37:01

Статья просто бомба!!! Все возможные спасибы!!!
Вот как-бы наладить обмен умными мыслями, блин, фантазии на такие статьи не хватает:(

nikll, 2009-01-18 в 9:49:26

http://php-fpm.anight.org/downloads/freebsd-port/php-5.2.8-fpm-0.5.10.tar.gz
обновился порт, чо нельзя было зайти и посмотреть?

Anik777, 2009-01-29 в 17:02:06

Ух, спасибо тебе nikll - мега статья, очень полезная и объемная. Отдельное спасибо за оттюненые конфиги php и nginx.
А какую примерно нагрузку держит такая сборка???

nikll, 2009-02-06 в 5:07:57

Тестировал на сервере 2xXeonQuad 8Gb RAM, на гигабитном линке отдает в срендем 90Мбайт динамики с учетом что примерно половина нагрузки ложится на мускул.
Загрузка сначала подскакивает гдето до 70% по процу и 3гб озу потом увеличевается кеш, отжирается еше 2гб озу, но проц грузит менше (40-50%). Нагрузка создавалась синтетическая наклепал пару пхп скриптов которые манипулируют с мускулом и нагружал все это дело с пяти других аналогичных серверов при помощщи ApacheBench и несколько экземпляров из портов.
В пике получалось более 300тыс соеденений.....

Le1, 2009-02-06 в 9:21:35

Статья супер, то что надо, актуальная - т.к. если сервак крутит только апач, то в полне отлично перейти на nginx, автору спасибо и зачет !

gaara, 2009-02-18 в 3:24:41

mysql 5.1 на сильнонагруженом сервере - зло

nikll, 2009-02-18 в 9:57:11

А вы надо пологать тока оракл юзаете....
Если правильно настроить мускул и железо достаточно мощное то мускул соовсем не мешает, а даже наоборот сервер с локальным мускулом работает быстрее чем с мускулом который на выделенном сервере...

gaara, 2009-02-21 в 3:22:03

nikll,

не, я не про то - сырая ветка 5.1 еще, на синтетических тестах все в порядке, поставили в продакшн - падения (segfault-ы), непонятно почему висящие в состоянии locked запросы и т.д.

лучше пока сидеть на 5.0, хотя и в 5.1 много вкусностей

а даже наоборот сервер с локальным мускулом работает быстрее чем с мускулом который на выделенном сервере...

это пока он не начинает жрать ресурсы, которые могли бы пойти на что-нибудь полезное, например на те же пхп-шные скрипты

xmaster !, 2009-03-01 в 21:47:53

net.inet.tcp.msl=40000        

немного ли ?  
у меня 4500

bzik, 2009-03-16 в 21:15:28

Спасибо за статью. Очень пригодилась!!!
если кому то интересен мониторинг то вот довольно неплохая статья.
http://blog.kovyrin.net/2006/04/29/monitoring-nginx-with-rrdtool/
советую почитать коменты у кого возникнут проблемы.

zulus, 2009-03-19 в 22:51:27

Отличная статья, большое человеческое спасибо за неё автору !!!

Арт, 2009-03-21 в 19:46:58

Спасибо за статью

titan, 2009-04-27 в 16:41:30

  Не используйте параметр sendfile_max_chunk 256k;
без предварительного понимания что он делает и зачем.
С текущим значением у меня сетевая карточка дропала 50% данных под нагрузкой. Без нагрузки работало все идеально.
FreeBSD 7.1 amd64 nginx 6.3.5

Psixozzz, 2009-05-22 в 9:57:42

автору надо учебник русского языка подарить. Лучше два. А в целом статья ничего так.

nikll, 2009-05-24 в 13:15:49

ыгы а тебе учебник по фре :), каждый спец в своей области.

opt1k, 2009-06-13 в 9:36:04

зачем wget? чем fetch не устроил?

kav, 2009-06-13 в 14:14:06

много спорных моментов в статье, с этим всем лучше ломится в рассылку по nginx-у
там русскоязычное, вменяемое комьюнити

Wic, 2009-07-13 в 22:18:13

А php-fpm из портов не ставится что ли? зачем такой изврат?

Yuna, 2009-07-13 в 22:24:58

Вообще-то, если вы не знали, php-fpm НЕ включен по умолчанию в порты, и потому порт его нужно скачивать ОТДЕЛЬНО.

xmaster, 2009-08-12 в 8:55:05

вышла поновее счас буду тестировать
http://php-fpm.org/downloads/freebsd-port/php-5.2.10-fpm-0.5.13.tar.gz

demonsked@gmail.com, 2009-11-06 в 17:05:29

А где порт для 5.2.11 взять? Со старым не собирается. А как из исходников собрать я не понял.

nikll, 2009-11-06 в 17:46:46

Возьми да сам сделай :), там ничего сложного, проанализируй различия между php5 и php5-fpm (последний из них делал я), вот те линк на свежий патч http://php-fpm.org/downloads/php-5.2.11-fpm-0.5.13.diff.gz, вперед, как сделаеш вышли его на mike503@gmail.com, выложат на сайт :).

playnet, 2009-11-19 в 16:45:22

обнАвляем, позвАляет.. ппц, аффтар, что у тебя в году по русскому? 3 с натяжкой?

KaMa-CyTpA, 2009-11-19 в 17:17:59

комрат
тут зырят нина форму ана садиржанийе.
токма эт тожэ для избранных.
тут кагбэ пакрасившэ сказать... карочи для тибя тут калашный ряд.

lissyara, 2009-11-19 в 17:23:08

=)
тем не менее, он тоже прав.
Как минимум стоит после написания самому целиком читать.

nikll, 2009-11-19 в 21:51:09

Блин все такие умные как полгяжу :), я уже писал выше что каждый в своей области достигает чегото, я например довольно профессиональный сисадмин и программист на куче осей и языков, а вы я как погляжу только русский язык профессионально освоили.
P.S. lissyara, я читал то что я написал, если тебя глубоко оскорбляют мелкие синтаксические ошибки то можеш их исправить. Если статья из за этих ошибок теряет свою актуальность можеш смело ее снести я тебе разрешаю.

lissyara, 2009-11-19 в 21:55:26

Мне - вообще пофиг. Сам с ошибками пишу, и очепятками.
Тем не менее, до публикации статьи даю линк на форуме, народ ошибки указывает.
Чтоб в камменты не гадили =))

Александр, 2009-12-09 в 20:32:43

Используйте Firefox - там есть проверка на орфографию.. и проблем не будет! кроме ошибок - бывают опечатки..

По статье - можно использовать перечень параметров, но не их значения :)

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

sun, 2009-12-10 в 8:35:26

Статья зачетная афтор спс! ))) Правда запарился искать порт php-fpm-0.6-5.2.11, пол дня убил чтоб найти )))

baton4eg, 2009-12-28 в 10:17:04

сам нашёл, а ссылочку ?
http://groups.google.ru/group/highload-php-ru/browse_thread/thread/8c36cd8d7c5709db?fwc=2&pli=1

paranoidchaos, 2010-01-22 в 11:41:41

register_globals = On

ставить не надо

nikll, 2010-01-22 в 12:16:18

По поводу надо не надо register_globals советую погуглить, как правило в большенстве свежего софта ненужен, но бывают случаи когда без него как минимум придется переписать половину уже отлаженного и рабочего кода который писал незивестно кто и когда.

paranoidchaos, 2010-01-22 в 12:51:38

))))

тот кто использовал register_globals ваще понятия не имеет о безопасности

вам всё же придётся переписывать скрипты

This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 6.0.0. Relying on this feature is highly discouraged.

paranoidchaos, 2010-01-22 в 12:53:20

погуглил

http://www.citforum.ru/internet/php/register_globals/

nikll, 2010-01-22 в 13:11:07

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

This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 6.0.0. Relying on this feature is highly discouraged. - вкурсе и очень рад этому, ибо $_GET['param'] куда выразительней понятней и читабельней чем просто $param который непонятно откуда появился.

Sw%00p aka Jerom, 2010-01-22 в 13:18:54

>>Кста о баранах, если не баран то перед работой со своими переменными ты их обнуляеш, иначе пых ругаетсо

непонял юмора ?????
обнулять, во-первых, можно только численные значения.

во-вторых, да не отрицаю того, что при обьявлении любой переменной сразу же её инициализация - является хорошим тоном программирования.

а то что такой механиз как регистер_глобалс был в пхп говорит о том что его разработчики типичные говнокодеры

Аноним, 2010-01-26 в 0:04:16

Сетапим на сервер фрю семерку

/etc/make.conf
...
NO_PROFILE=yes
NO_GAMES=yes
...
WITH_IDEA=yes
MAKE_IDEA=yes
WITHOUT_GAMES=yes
WITHOUT_INET6=yes
WITHOUT_INET6_SUPPORT=yes
WITHOUT_PROFILE=yes

дальше не читал ... автору читать man src.conf до просветления в голове

nikll, 2010-01-26 в 8:48:20

Для особо одоренных анонимусов через 10 строк ниже
ee /etc/src.conf
WITHOUT_INET6=yes            # рубим ipv6, рассадник дыр в безопастности и глюков
WITHOUT_INET6_SUPPORT=yes    # практическая его полездность будет еще не скоро...
WITHOUT_PROFILE=yes  

На момент выхода фри 7.0 часть параметров необходимо было дублировать в make.conf (до 7.0 src.conf небыло) иначе они не применялись (от пары лишних строк хуже не станет, зато всегда 100% применялись).
Так что читать маны и на основании этого думать что ты самый умный можеш и дальше, а практический опыт некакими манами не заменить.

Аноним, 2010-01-29 в 18:50:51

Дело не в паре лишних строк, дело в том что если Вы пишите статью не задумываясь о том что ее прочитает новичок и сделает так как в ней написано полагая что тот кто ее писал точно знает что надо делать. Может все же пойти новичкам навстречу и чуть-чуть поправить статью, а не ругаться тут неизвестно из за чего?

BTW
"options HZ=1000" - это уже давно по дефолту
"options DEVICE_POLLING" - polling стоит использовать только методом научного тыка, т.к. на разных системах в разных ситуациях с ним бывает лучше и наоборот - все может стать только хуже. Сделайте заметку что стоит почитать man polling и пусть себе человек пробует.

gurt, 2010-02-26 в 16:36:58

Сетапим на сервер фрю семерку архтиктуры amd64
..
ee /etc/make.conf
CPUTYPE?=core2
..
#   Intel x86 architecture:
#       (AMD CPUs)      opteron athlon64 athlon-mp athlon-xp athlon-4
#                       athlon-tbird athlon k8 k6-3 k6-2 k6 k5
#       (Intel CPUs)    core2 core nocona pentium4m pentium4 prescott
#                       pentium3m pentium3 pentium-m pentium2
#                       pentiumpro pentium-mmx pentium i486 i386
#       (Via CPUs)      c3 c3-2
#   Alpha/AXP architecture: ev67 ev6 pca56 ev56 ev5 ev45 ev4
#   AMD64 architecture: opteron, athlon64, nocona, prescott, core2
#   Intel ia64 architecture: itanium2, itanium

nikll, 2010-02-27 в 2:44:49

Ну а в чем проблема то?

AMD64 architecture: opteron, athlon64, nocona, prescott, core2

тобиш под  интеловский 64разнядный камень, во фре оно AMD64 называетсо... в линухе тоже самое x86_64

Pandora, 2010-02-28 в 16:27:29

register_globals = On

о боже

Pandora, 2010-02-28 в 16:59:59

post_max_size = 32M   ; 20M
upload_max_filesize = 64M   ;10M
memory_limit = 256M    ;  128M  ;  увеличиваем лимит по памяти для "тяжелых" скриптов
max_execution_time = 60  ; 30
date.timezone = Europe/Kiev
disable_functions = system,curl_exec,curl_multi_exec,passthru,shell_exec,proc_open,popen,parse_ini_file,show_source,ini_restore,com_load_typelib,symlink

по дефалту

session.save_handler = files

можно менять на eaccelerator если установлен

session.save_handler = eaccelerator

у меня на точке монтирования /usr/ терабайт так что там временная папка

session.save_path = /usr/local/www/tmp/php/session

Pandora, 2010-02-28 в 18:07:33

doc_root = переменная задаёт каталог, в котором размещаются PHP-скрипты. Эта директива разрешает исполнение скриптов только в указанном каталоге и его поддиректориях.

в моем случае doc_root = /usr/local/www/hosts

артур, 2010-05-11 в 19:47:47

Написали бы ман с использованием php 5.3.x (последний на данный момент). Под эту версию пыха нет пакета php-fpm =\ Но каким-то образом поднимают связку.

sabas, 2010-05-12 в 16:05:12

артур,
лови , правда там не так хорошо все разжевано ... но если с "ручками" порядок , соберешь минут за 20 ))) http://forum.nginx.org/read.php?25,73314

артур, 2010-05-14 в 11:06:14

С горем пополам собрал.
Последние версии php-fpm надо прям в исходники пыха влить и вместе с пыхом собирать.
Не понял сам как собралось если честно) Вроде работает.

Pandora, 2010-08-04 в 20:57:54

location ~ \.php$ {
   ....
   try_files $uri =404;
   ...
}

exploit http://site.ru/images/as5df3.jpeg/.php

risk94, 2010-09-12 в 14:45:37

Таки начиная с шестерки параметр kern.polling.enable убран из sysvtl ... и рулится непосредственно через ifconfig:

http://svn.freebsd.org/viewvc/base?view=revision&revision=196267

Fire_Anton, 2010-10-04 в 2:12:15

Ай, Ай, Ай. Чему вы молодежь учите.
reboot - это экстренная перезагрузка, все демоны выбрасываются из памяти и комп идет на перезагрузку.
shutdown -r now - это есть корректная перезагрузка системы с завершением всех демонов, а не выкидывание их из памяти.

Статья супер. ;) Поправь перезагрузку.

maximus, 2010-12-28 в 16:37:18

Ребут - привычка линуховая, ибо что ребут, что шатдаут - уже ни какой разницы нет =) по крайней мере еще когда учился по книжке Slackware 3.1
В целом я бы и до сих пор им пользовался... Если бы не hal начиная с 11 версии.
Получил головняк когда одна из 5 сетевух вышла из строя, после смены долго танцевал с их именами/адресами.. с тех пор всё сетевое - на Фре.
Именно тогда я почуял удовольствие от названия интерфейсов.. em, xl, rl bg и т.д

Илья, 2013-04-11 в 15:49:02

register_globals=On !!!! На костер его!!!

Интересующийся, 2013-04-26 в 8:46:40

Сделал все как описано в статье. Но при попытке открыть .cgi отображается их содержимое, хотя .php нормально выполняются

nikll, 2013-04-26 в 10:54:28

на костер не надо :) там же вполне ясно написанно:
>> Пхп каждый конфигурит себе сам, но на основе длительного ковыряния с кучей серверов у меня получилось оптимальным вот это

Между прочим статья 2008 года, на тех серверах крутился софт котрый требовал register_globals=On вариант переписать ту кучу кала даже не рассматривался.

nginx не умеет .cgi, только fcgi



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.067 секунд
Из них PHP: 55%; SQL: 45%; Число SQL-запросов: 77 шт.
Исходный размер: 99790; Сжатая: 22763