Ejudge CGI под Nginx

Обсуждение вопросов, связанных с системой проведения турниров ejudge.
yun_man_ger
Posts:32
Joined:27 September 2010, 07:37
Ejudge CGI под Nginx

Post by yun_man_ger » 08 May 2012, 00:41

Здравствуйте.

Я пытаюсь запустить CGI скрипты ejudge под nginx с использованием uwsgi + cgi plugin.
http://projects.unbit.it/uwsgi/wiki/CGI

Вот такой тестовый скрипт запустить удалось

Code: Select all

#!/usr/bin/python
print "Content-type: text/html\n\n"
print "<html><body><h1>It works!</h1></body></html>"
Но никокой из ejudge'овских CGI скриптов запустить не удалось. Точнее удалось, но происходит timeout.
Я предпологаю, чтобы запустить допустим serve-control нужно передовать какие-то параметры.

не подскажете как и какие?
спасибо.
Last edited by yun_man_ger on 15 May 2012, 13:24, edited 1 time in total.

cher
Posts:1153
Joined:13 March 2004, 17:00
Contact:

Re: Ejudge CGI под Nginx

Post by cher » 08 May 2012, 11:42

Что выводится в лог-файлы?

yun_man_ger
Posts:32
Joined:27 September 2010, 07:37

Re: Ejudge CGI под Nginx

Post by yun_man_ger » 09 May 2012, 03:37

Я покапался в кодах и понял, что CGI программы пытаются прочитать с stdin всегда.
http://ejudge.ru/trac/browser/trunk/ejudge/cgi.c#L72

А uWSGI скорее всего не закрывает входящий поток
http://projects.unbit.it/uwsgi/browser/ ... gin.c#L957
По этому скрипт и зависает.

Я похимичил с uwsgi и стал закрывать поток если запрос не типа POST.
И serve-control заработал. Правда после авторизации не работает редирект. Надо кликать на ссылку.

При переходе на Master из serve-control, new-master возвращает пустоту. В логах ejudge ничего особо не пишется.
Если пойти на new-master без сесси, то возвращается форма авторизации, но при вводе данных опять выводит пустоту.

ej-contests.log
Wed May 9 06:34:48 2012:info:89: received 2 file descriptors: 6, 7
Wed May 9 06:34:48 2012:info:HTTP_REQUEST -> OK, 2378
ej-users.log
Wed May 9 06:34:39 2012:info:PRIV_COOKIE_LOGIN: 127.0.0.1, 0, 1, 11c61bb90659194b -> OK, 1, 374273ec85291d6e
Wed May 9 06:34:42 2012:info:PRIV_COOKIE_LOGIN: 127.0.0.1, 0, 1, 11c61bb90659194b -> OK, 1, 5b4074fbba96754d
Wed May 9 06:35:27 2012:info:PRIV_LOGIN: 127.0.0.1, 0, admin, 0, 0 -> OK, 1, 71d6e5b294730bc2

yun_man_ger
Posts:32
Joined:27 September 2010, 07:37

Re: Ejudge CGI под Nginx

Post by yun_man_ger » 09 May 2012, 03:39

Версия ejudge 2.3.21

cher
Posts:1153
Joined:13 March 2004, 17:00
Contact:

Re: Ejudge CGI под Nginx

Post by cher » 09 May 2012, 18:24

А new-master завершается или остается висеть в списке процессов?

Возможно, что причина вся та же, не закрывается канал стандартного ввода.

yun_man_ger
Posts:32
Joined:27 September 2010, 07:37

Re: Ejudge CGI под Nginx

Post by yun_man_ger » 10 May 2012, 02:14

Нет. new-master завершает работу. Мне кажется, что проблема в том, что uwsgi передает не все трубуемые переменные. Но у меня не хватило сил разобраться что из себя представляет new-master и как он взаимодействует с CGI.

У вас был опыт запуска ejudge-cgi не под apache?

cher
Posts:1153
Joined:13 March 2004, 17:00
Contact:

Re: Ejudge CGI под Nginx

Post by cher » 10 May 2012, 21:17

А можно ли тогда получить список всех переменных окружения, которые устанавливаются uwsgi?

yun_man_ger
Posts:32
Joined:27 September 2010, 07:37

Re: Ejudge CGI под Nginx

Post by yun_man_ger » 14 May 2012, 22:52

Здравствуйте. Прошу прощения, что долго не отвечал.

Во время GET запроса (форма логин отображается нормально)

Code: Select all

SSH_AGENT_PID=2267
GPG_AGENT_INFO=/tmp/keyring-t1DQ6I/gpg:0:1
SHELL=/bin/bash
TERM=xterm
XDG_SESSION_COOKIE=b8a69e876629ef3495d548ee0000000c-1337023616.172421-558086907
WINDOWID=62916563
GNOME_KEYRING_CONTROL=/tmp/keyring-t1DQ6I
GTK_MODULES=canberra-gtk-module:canberra-gtk-module
USER=german
XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0
XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
SSH_AUTH_SOCK=/tmp/keyring-t1DQ6I/ssh
WORK_ROOT=/home/german/work/sandbox
DEFAULTS_PATH=/usr/share/gconf/ubuntu.default.path
USERNAME=german
SESSION_MANAGER=local/german-laptop:@/tmp/.ICE-unix/2230,unix/german-laptop:/tmp/.ICE-unix/2230
VIRTUAL_ENV=/home/german/work/sandbox/envs/djangoejudge
WORKON_HOME=/home/german/work/sandbox/envs
XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
DESKTOP_SESSION=ubuntu
PATH=/home/german/work/sandbox/envs/djangoejudge/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
SUPERVISOR_GROUP_NAME=djangoejudge.cgi
PWD=/home/german/work/sandbox
LANG=en_US.UTF-8
MANDATORY_PATH=/usr/share/gconf/ubuntu.mandatory.path
UBUNTU_MENUPROXY=libappmenu.so
COMPIZ_CONFIG_PROFILE=ubuntu
PS1=(djangoejudge)
GDMSESSION=ubuntu
SUPERVISOR_ENABLED=1
SHLVL=2
HOME=/home/german
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
LOGNAME=german
XDG_DATA_DIRS=/usr/share/ubuntu:/usr/share/gnome:/usr/local/share/:/usr/share/
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-z3aVB03zXy,guid=0b2d849d48e18ba41123c4e300000043
SUPERVISOR_SERVER_URL=unix:///tmp/supervisor.sock
SUPERVISOR_PROCESS_NAME=djangoejudge.cgi
DISPLAY=:0.0
XDG_CURRENT_DESKTOP=Unity
COLORTERM=gnome-terminal
XAUTHORITY=/home/german/.Xauthority
UWSGI_RELOADS=0
UWSGI_ORIGINAL_PROC_NAME=uwsgi
QUERY_STRING=
REQUEST_METHOD=GET
CONTENT_TYPE=
CONTENT_LENGTH=
REQUEST_URI=/new-master
DOCUMENT_ROOT=/home/german/work/sandbox/distr/nginx/html
SERVER_PROTOCOL=HTTP/1.1
REMOTE_ADDR=127.0.0.1
REMOTE_PORT=56535
SERVER_PORT=8080
SERVER_NAME=algoprog.kz
GATEWAY_INTERFACE=CGI/1.1
SERVER_SOFTWARE=nginx
HTTP_HOST=localhost:8080
HTTP_CONNECTION=keep-alive
HTTP_CACHE_CONTROL=max-age=0
HTTP_USER_AGENT=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Ubuntu/11.10 Chromium/17.0.963.79 Chrome/17.0.963.79 Safari/535.11
HTTP_ACCEPT=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
HTTP_ACCEPT_ENCODING=gzip,deflate,sdch
HTTP_ACCEPT_LANGUAGE=en-US,en;q=0.8,ru;q=0.6
HTTP_ACCEPT_CHARSET=ISO-8859-1,utf-8;q=0.7,*;q=0.3
HTTP_COOKIE=jv_client_id_434=136149; sessionid=1006492b87ce1cc2efbe8eddae36350f; csrftoken=51a97a8601fbe58be0d756b4dd5d733b
REDIRECT_STATUS=200
SCRIPT_FILENAME=/home/german/ejudge/libexec/ejudge/cgi-bin/new-master
SCRIPT_NAME=/new-master
Во время POST запроса (пустота)

Code: Select all

SSH_AGENT_PID=2267
GPG_AGENT_INFO=/tmp/keyring-t1DQ6I/gpg:0:1
SHELL=/bin/bash
TERM=xterm
XDG_SESSION_COOKIE=b8a69e876629ef3495d548ee0000000c-1337023616.172421-558086907
WINDOWID=62916563
GNOME_KEYRING_CONTROL=/tmp/keyring-t1DQ6I
GTK_MODULES=canberra-gtk-module:canberra-gtk-module
USER=german
XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0
XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
SSH_AUTH_SOCK=/tmp/keyring-t1DQ6I/ssh
WORK_ROOT=/home/german/work/sandbox
DEFAULTS_PATH=/usr/share/gconf/ubuntu.default.path
USERNAME=german
SESSION_MANAGER=local/german-laptop:@/tmp/.ICE-unix/2230,unix/german-laptop:/tmp/.ICE-unix/2230
VIRTUAL_ENV=/home/german/work/sandbox/envs/djangoejudge
WORKON_HOME=/home/german/work/sandbox/envs
XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
DESKTOP_SESSION=ubuntu
PATH=/home/german/work/sandbox/envs/djangoejudge/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
SUPERVISOR_GROUP_NAME=djangoejudge.cgi
PWD=/home/german/work/sandbox
LANG=en_US.UTF-8
MANDATORY_PATH=/usr/share/gconf/ubuntu.mandatory.path
UBUNTU_MENUPROXY=libappmenu.so
COMPIZ_CONFIG_PROFILE=ubuntu
PS1=(djangoejudge)
GDMSESSION=ubuntu
SUPERVISOR_ENABLED=1
SHLVL=2
HOME=/home/german
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
LOGNAME=german
XDG_DATA_DIRS=/usr/share/ubuntu:/usr/share/gnome:/usr/local/share/:/usr/share/
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-z3aVB03zXy,guid=0b2d849d48e18ba41123c4e300000043
SUPERVISOR_SERVER_URL=unix:///tmp/supervisor.sock
SUPERVISOR_PROCESS_NAME=djangoejudge.cgi
DISPLAY=:0.0
XDG_CURRENT_DESKTOP=Unity
COLORTERM=gnome-terminal
XAUTHORITY=/home/german/.Xauthority
UWSGI_RELOADS=0
UWSGI_ORIGINAL_PROC_NAME=uwsgi
QUERY_STRING=
REQUEST_METHOD=POST
CONTENT_TYPE=application/x-www-form-urlencoded
CONTENT_LENGTH=68
REQUEST_URI=/new-master
DOCUMENT_ROOT=/home/german/work/sandbox/distr/nginx/html
SERVER_PROTOCOL=HTTP/1.1
REMOTE_ADDR=127.0.0.1
REMOTE_PORT=56503
SERVER_PORT=8080
SERVER_NAME=algoprog.kz
GATEWAY_INTERFACE=CGI/1.1
SERVER_SOFTWARE=nginx
HTTP_HOST=localhost:8080
HTTP_CONNECTION=keep-alive
HTTP_CONTENT_LENGTH=68
HTTP_CACHE_CONTROL=max-age=0
HTTP_ORIGIN=http://localhost:8080
HTTP_USER_AGENT=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Ubuntu/11.10 Chromium/17.0.963.79 Chrome/17.0.963.79 Safari/535.11
HTTP_CONTENT_TYPE=application/x-www-form-urlencoded
HTTP_ACCEPT=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
HTTP_REFERER=http://localhost:8080/new-master
HTTP_ACCEPT_ENCODING=gzip,deflate,sdch
HTTP_ACCEPT_LANGUAGE=en-US,en;q=0.8,ru;q=0.6
HTTP_ACCEPT_CHARSET=ISO-8859-1,utf-8;q=0.7,*;q=0.3
HTTP_COOKIE=jv_client_id_434=136149; sessionid=1006492b87ce1cc2efbe8eddae36350f; csrftoken=51a97a8601fbe58be0d756b4dd5d733b
REDIRECT_STATUS=200
SCRIPT_FILENAME=/home/german/ejudge/libexec/ejudge/cgi-bin/new-master
SCRIPT_NAME=/new-master

yun_man_ger
Posts:32
Joined:27 September 2010, 07:37

Re: Ejudge CGI под Nginx

Post by yun_man_ger » 14 May 2012, 22:57

Разница видна только в

REQUEST_METHOD
CONTENT_TYPE
CONTENT_LENGTH
REMOTE_PORT

в первом варианте нет
HTTP_CONTENT_LENGTH
HTTP_ORIGIN
HTTP_CONTENT_TYPE
HTTP_REFERER

Почему-то думается, что эти различия не существенны. Скорее всего чего-то не хватает.

cher
Posts:1153
Joined:13 March 2004, 17:00
Contact:

Re: Ejudge CGI под Nginx

Post by cher » 15 May 2012, 21:45

При POST-запросе параметры запроса передаются CGI-скрипту через стандартный поток ввода.
Возможно, что-то не совпадает с тем, что передает apache.
Надо попробовать сохранить куда-нибудь в файл весь стандартный поток ввода, чтобы посмотреть, что там передается.

yun_man_ger
Posts:32
Joined:27 September 2010, 07:37

Re: Ejudge CGI под Nginx

Post by yun_man_ger » 16 May 2012, 20:11

На stdin приходит это:

Code: Select all

login=admin&password=q&contest_id=1&role=6&locale_id=0&submit=Submit

yun_man_ger
Posts:32
Joined:27 September 2010, 07:37

Re: Ejudge CGI под Nginx

Post by yun_man_ger » 16 May 2012, 21:07

Еще такой вопрос, по поводу зависания из-за не закрытого потока.

Чтобы понять кого просить ввести корректировки, я решил немного поискать на эту тему.

В RFC CGI/1.1 http://www.ietf.org/rfc/rfc3875 в разделе 4.2 Request Message-Body
A request-body is supplied with the request if the CONTENT_LENGTH is
not NULL. The server MUST make at least that many bytes available
for the script to read. The server MAY signal an end-of-file
condition after CONTENT_LENGTH bytes have been read or it MAY supply
extension data. Therefore, the script MUST NOT attempt to read more
than CONTENT_LENGTH bytes, even if more data is available. However,
it is not obliged to read any of the data.
Ну в общем это к тому, что сервер не обязан закрывать поток. А CGI должна смотреть на значение CONTENT_LENGTH.
В ejudge/cgi.c есть не соответствие этому правилу. Я думаю http://ejudge.ru/trac/browser/trunk/ejudge/cgi.c#L413 должна быть проверка на значение CONTENT_LENGTH.

Code: Select all

  cl = getenv("CONTENT_LENGTH");
  if (!cl || sscanf(cl, "%d%n", &content_length, &n) != 1 || cl[n]) {
    //err("parse_multipart: cannot parse CONTENT_LENGTH");
    //bad_request(charset);
    //exit(0);
    //return 0;
    content_length = 0;
  }
  if (content_length > MAX_CONTENT_LENGTH) {
    request_too_large(charset);
    exit(0);
  }
  if (content_length > 0){
    source = 1;
    if (do_cgi_read() < 0) return -1;
  }

cher
Posts:1153
Joined:13 March 2004, 17:00
Contact:

Re: Ejudge CGI под Nginx

Post by cher » 17 May 2012, 21:00

В SVN добавлено использование значения CONTENT_LENGTH.
Попробуйте проверить на текущей версии.

yun_man_ger
Posts:32
Joined:27 September 2010, 07:37

Re: Ejudge CGI под Nginx

Post by yun_man_ger » 17 May 2012, 22:56

Проверил. Теперь запрос не зависает. Но при POST запросе все также пустота.

yun_man_ger
Posts:32
Joined:27 September 2010, 07:37

Re: Ejudge CGI под Nginx

Post by yun_man_ger » 17 May 2012, 23:00

Еще такой момент. Может он поможет понять в чем проблема. При входе в serve-control пустота не выходит.
Но поведение тоже не обычное. На апаче после логина всегда попадаем на страницу со списком контестов.
А под Nginx+uWSGI получаем
Login successfull. Now entering the main page.
If automatic updating does not work, click on this link.

Post Reply