После перехода с fcgiwrap на uWSGI (который также дает множество других преимуществ, которые я планирую использовать) в моем списке ToDo в течение некоторого времени мне наконец удалось настроить тестовую систему debian-wheezy с uWSGI v2.0 и nginx v1.4.4.
На первом этапе я хотел бы запустить .cgi-скрипты через cgi-плагин uWSGI надежно и с минимальными накладными расходами (ниже довольно слабое оборудование), имея возможность легко улучшить мою конфигурацию, чтобы также развертывать приложения с помощью таких фреймворков, как bottle / flask / django в качестве второго шага.
Поэтому я решил использовать Императорский режим uWSGI, который в настоящее время настроен для управления только одним вассалом, который настроен для запуска uWSGI-cgi-plugin на 2 рабочих с 2 потоками каждый.
После проверки различных функций настройка более или менее работает нормально с двумя странными поведениями, которые, как мне кажется, почему-то неправильно:
heartbeat = 20
в .ini), император будет неоднократно убивать / возрождать хозяина вассала, если .cgi не был запущен в течение определенного промежутка времени. количество настроенных рабочих, похоже, здесь не имеет значения.reload-mercy = 10
поскольку он все еще регистрирует your mercy for graceful operations on workers is 60 seconds
(значение по умолчанию). хорошо, это всего лишь незначительная проблема, не имеющая для меня большого значения.Причина использования параметра heartbeat-option заключается в том, что я хотел бы обеспечить доступность моих cgis / приложений, максимально используя встроенные механизмы uWSGI.
Любые намеки на то, что я могу неправильно понять или сделать неправильно? Я не вижу никакой очевидной причины, по которой нельзя использовать опцию Heartbeat в сочетании с cgi-модулем в моей конфигурации, но был бы благодарен за любые дополнительные сведения! Я предполагаю, что nginx не имеет ничего общего с упомянутыми проблемами, плюс я также дважды проверил файл и каталог-perms ... uWSGI запускается через init.d-скрипт, но поведение такое же при запуске вручную.
Мой конфигурация как следует:
раздел в nginx.conf:
location ~ ^/cgi-bin/.*\..+$ {
root /usr/local/nginx/vhosts/testdomain.com/cgi-bin;
gzip off;
include uwsgi_params;
uwsgi_modifier1 9;
uwsgi_pass unix:///var/run/nginx/testdomain_cgi-bin_uwsgi.sock;
}
emperor.ini:
[uwsgi]
uid = www-data
gid = www-data
emperor = /etc/uwsgi/vassals
emperor-pidfile = /var/run/uwsgi/emperor.pid
daemonize = /var/log/uwsgi_emperor.log
testdomain_cgi-bin.ini:
[uwsgi]
uid = www-data
gid = www-data
chdir = /usr/local/nginx/vhosts/testdomain/cgi-bin
plugins = cgi
cgi = /cgi-bin=/usr/local/nginx/vhosts/testdomain/cgi-bin
cgi-allowed-ext = .cgi
socket = /var/run/nginx/testdomain_cgi-bin_uwsgi.sock
master = true
#heartbeat = 25
processes = 2
threads = 2
reload-mercy = 10
no-orphans = true
post-buffering = 4096
max-requests = 2048
vacuum = true
logto = /usr/local/nginx/logs/uwsgi_testdomain_cgi-bin.log
журналы (когда включена опция Heartbeat):
/var/log/uwsgi_emperor.log:
*** Starting uWSGI 2.0 (32bit) on [Wed Feb 5 11:35:36 2014] ***
compiled with version: 4.7.2 on 31 January 2014 08:46:00
os: Linux-3.2.0-4-686-pae #1 SMP Debian 3.2.51-1
nodename: testnode
machine: i686
clock source: unix
pcre jit disabled
detected number of CPU cores: 1
current working directory: /
*** running under screen session 1111.myscrn ***
detected binary path: /usr/local/bin/uwsgi
setgid() to 33
setuid() to 33
*** WARNING: you are running uWSGI without its master process manager ***
your processes number limit is 3940
your memory page size is 4096 bytes
detected max file descriptor number: 1024
writing pidfile to /var/run/uwsgi/emperor.pid
*** starting uWSGI Emperor ***
*** has_emperor mode detected (fd: 6) ***
[uWSGI] getting INI configuration from testdomain_cgi-bin.ini
Wed Feb 5 11:35:36 2014 - [emperor] vassal testdomain_cgi-bin.ini has been spawned
Wed Feb 5 11:35:36 2014 - [emperor] vassal testdomain_cgi-bin.ini is ready to accept requests
Wed Feb 5 11:35:43 2014 - [emperor] vassal testdomain_cgi-bin.ini is now loyal
[emperor] vassal testdomain_cgi-bin.ini sent no heartbeat in last 30 seconds, brutally respawning it...
Wed Feb 5 11:38:56 2014 - [emperor] removed uwsgi instance testdomain_cgi-bin.ini
[emperor] unrecognized vassal event on fd 5
[emperor] unrecognized vassal event on fd 5
... above lines repeaded for about another 50 times ...
*** has_emperor mode detected (fd: 6) ***
[uWSGI] getting INI configuration from testdomain_cgi-bin.ini
Wed Feb 5 11:38:56 2014 - [emperor] vassal testdomain_cgi-bin.ini has been spawned
Wed Feb 5 11:38:56 2014 - [emperor] vassal testdomain_cgi-bin.ini is ready to accept requests
/usr/local/nginx/logs/uwsgi_testdomain_cgi-bin.log:
*** Starting uWSGI 2.0 (32bit) on [Wed Feb 5 11:35:36 2014] ***
compiled with version: 4.7.2 on 31 January 2014 08:46:00
os: Linux-3.2.0-4-686-pae #1 SMP Debian 3.2.51-1
nodename: testnode
machine: i686
clock source: unix
pcre jit disabled
detected number of CPU cores: 1
current working directory: /etc/uwsgi/vassals
*** running under screen session 1111.myscrn ***
detected binary path: /usr/local/bin/uwsgi
your processes number limit is 3940
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uwsgi socket 0 bound to UNIX address /var/run/nginx/testdomain_cgi-bin_uwsgi.sock fd 3
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 175536 bytes (171 KB) for 2 cores
*** Operational MODE: threaded ***
initialized CGI mountpoint: /cgi-bin = /usr/local/nginx/vhosts/testdomain.com/cgi-bin
*** no app loaded. going in full dynamic mode ***
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 20825)
spawned uWSGI worker 1 (pid: 20826, cores: 2)
[pid: 20826|app: -1|req: -1/1] XX.XX.XX.XXX () {42 vars in 678 bytes} [Wed Feb 5 11:35:43 2014] GET /cgi-bin/hellow.cgi => generated 282 bytes in 13 msecs (HTTP/1.1 200) 1 headers in 44 bytes (0 switches on core 0)
announcing my loyalty to the Emperor...
[pid: 20826|app: -1|req: -1/2] XX.XX.XX.XXX () {42 vars in 678 bytes} [Wed Feb 5 11:35:54 2014] GET /cgi-bin/hellow.cgi => generated 282 bytes in 2 msecs (HTTP/1.1 200) 1 headers in 44 bytes (0 switches on core 1)
[pid: 20826|app: -1|req: -1/3] XX.XX.XX.XXX () {42 vars in 678 bytes} [Wed Feb 5 11:36:04 2014] GET /cgi-bin/hellow.cgi => generated 282 bytes in 5 msecs (HTTP/1.1 200) 1 headers in 44 bytes (0 switches on core 0)
[pid: 20826|app: -1|req: -1/4] XX.XX.XX.XXX () {42 vars in 678 bytes} [Wed Feb 5 11:36:16 2014] GET /cgi-bin/hellow.cgi => generated 282 bytes in 3 msecs (HTTP/1.1 200) 1 headers in 44 bytes (0 switches on core 1)
[pid: 20826|app: -1|req: -1/5] XX.XX.XX.XXX () {42 vars in 678 bytes} [Wed Feb 5 11:36:28 2014] GET /cgi-bin/hellow.cgi => generated 282 bytes in 3 msecs (HTTP/1.1 200) 1 headers in 44 bytes (0 switches on core 0)
[pid: 20826|app: -1|req: -1/6] XX.XX.XX.XXX () {42 vars in 678 bytes} [Wed Feb 5 11:36:39 2014] GET /cgi-bin/hellow.cgi => generated 282 bytes in 3 msecs (HTTP/1.1 200) 1 headers in 44 bytes (0 switches on core 1)
[pid: 20826|app: -1|req: -1/7] XX.XX.XX.XXX () {42 vars in 678 bytes} [Wed Feb 5 11:36:51 2014] GET /cgi-bin/hellow.cgi => generated 282 bytes in 5 msecs (HTTP/1.1 200) 1 headers in 44 bytes (0 switches on core 0)
[pid: 20826|app: -1|req: -1/8] XX.XX.XX.XXX () {42 vars in 678 bytes} [Wed Feb 5 11:37:03 2014] GET /cgi-bin/hellow.cgi => generated 282 bytes in 2 msecs (HTTP/1.1 200) 1 headers in 44 bytes (0 switches on core 1)
[pid: 20826|app: -1|req: -1/9] XX.XX.XX.XXX () {42 vars in 678 bytes} [Wed Feb 5 11:37:15 2014] GET /cgi-bin/hellow.cgi => generated 282 bytes in 3 msecs (HTTP/1.1 200) 1 headers in 44 bytes (0 switches on core 0)
[pid: 20826|app: -1|req: -1/10] XX.XX.XX.XXX () {42 vars in 678 bytes} [Wed Feb 5 11:37:27 2014] GET /cgi-bin/hellow.cgi => generated 282 bytes in 6 msecs (HTTP/1.1 200) 1 headers in 44 bytes (0 switches on core 1)
[pid: 20826|app: -1|req: -1/11] XX.XX.XX.XXX () {42 vars in 678 bytes} [Wed Feb 5 11:37:39 2014] GET /cgi-bin/hellow.cgi => generated 282 bytes in 12 msecs (HTTP/1.1 200) 1 headers in 44 bytes (0 switches on core 0)
[pid: 20826|app: -1|req: -1/12] XX.XX.XX.XXX () {42 vars in 678 bytes} [Wed Feb 5 11:37:51 2014] GET /cgi-bin/hellow.cgi => generated 282 bytes in 4 msecs (HTTP/1.1 200) 1 headers in 44 bytes (0 switches on core 1)
[pid: 20826|app: -1|req: -1/13] XX.XX.XX.XXX () {42 vars in 678 bytes} [Wed Feb 5 11:38:03 2014] GET /cgi-bin/hellow.cgi => generated 282 bytes in 3 msecs (HTTP/1.1 200) 1 headers in 44 bytes (0 switches on core 0)
Wed Feb 5 11:38:56 2014 - uWSGI worker 1 screams: UAAAAAAH my master disconnected: i will kill myself !!!
*** Starting uWSGI 2.0 (32bit) on [Wed Feb 5 11:38:56 2014] ***
compiled with version: 4.7.2 on 31 January 2014 08:46:00
os: Linux-3.2.0-4-686-pae #1 SMP Debian 3.2.51-1
nodename: testnode
machine: i686
clock source: unix
pcre jit disabled
detected number of CPU cores: 1
current working directory: /etc/uwsgi/vassals
*** running under screen session 1111.myscrn ***
detected binary path: /usr/local/bin/uwsgi
your processes number limit is 3940
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uwsgi socket 0 bound to UNIX address /var/run/nginx/testdomain_cgi-bin_uwsgi.sock fd 3
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 175536 bytes (171 KB) for 2 cores
*** Operational MODE: threaded ***
initialized CGI mountpoint: /cgi-bin = /usr/local/nginx/vhosts/testdomain.com/cgi-bin
*** no app loaded. going in full dynamic mode ***
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 20881)
spawned uWSGI worker 1 (pid: 20882, cores: 2)
uWSGI doc для вассального варианта heartbeat
:
Argument: number
(Vassal option) Announce vassal health to the emperor every N seconds.
uWSGI doc для варианта императора emperor-required-heartbeat
:
Argument: number Default: 30
Set the Emperor tolerance about heartbeats.
When a vassal asks for ‘heartbeat mode’ the emperor will
also expect a ‘heartbeat’ at least every <secs> seconds.
Используйте 2.0.1 из github, у него лучший код сердцебиения. Ваша проблема - небольшая разница во времени между толерантностью к императору (30 секунд) и частотой сердечных сокращений (25). Для ошибки в версии 2.0 таймаут рабочего сбрасывался при каждом запросе. В дополнение к этому пульсу 2.0.1 запускается, как только создается первый рабочий, что приводит к лучшим результатам (сломанные приложения обнаруживаются немедленно). Что касается милосердия к перезагрузке рабочих, правильный вариант - --worker-reload-mercy
(--reload-mercy
для нерабочих процессов)