Краткая заметка.
Предполагается, что uWSGI и NGINX уже установлены и настроены, например — как описано тут>>>.
Если uWSGI уже установлен — бекапим его:
# mv /usr/bin/uwsgi /home/setevoy/backups/
Запускаем сборку:
# cd /tmp
# curl http://uwsgi.it/install | bash -s cgi /usr/bin/uwsgi ... *** uWSGI compiling embedded plugins *** [gcc -pthread] plugins/cgi/cgi_plugin.o ... ############## end of uWSGI configuration ############# total build time: 78 seconds *** uWSGI is ready, launch it with /usr/bin/uwsgi ***
Проверяем:
# which uwsgi /usr/bin/uwsgi
Поверяем наличие модуля cgi
:
# uwsgi --plugins-list ... *** uWSGI loaded request plugins *** 9: cgi ...
В каталоге /etc/uwsgi/
создаём файл /etc/uwsgi/testing.domain.org.ua.ini
:
[uwsgi] plugins = cgi socket = 127.0.0.1:9090 http-modifier1 = 9 cgi = /=/var/www/vhosts/setevoy/testing.domain.org.ua/ cgi-allowed-ext = .py cgi-helper = .py=python
Для NGINX создаём файл конфигурации /etc/nginx/conf.d/testing.domain.kiev.ua.conf
:
server { server_name testing.domain.org.ua; access_log /var/log/nginx/testing.domain.org.ua-access.log; error_log /var/log/nginx/testing.domain.org.ua-error.log; root /var/www/vhosts/setevoy/testing.domain.org.ua; location / { uwsgi_pass 127.0.0.1:9090; uwsgi_modifier1 9; include uwsgi_params; } }
Проверяем:
# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Перезапускаем:
# service nginx restart Stopping nginx: [ OK ] Starting nginx: [ OK ]
В каталоге /var/www/vhosts/setevoy/testing.domain.org.ua
создаём скрипт index.py
:
#!/usr/bin/python print "Content-type: text/htmlnn" print "<html><body><h1>It works!</h1></body></html>"
Запускаем uWSGI:
# uwsgi /etc/uwsgi/testing.domain.org.ua.ini [uWSGI] getting INI configuration from /etc/uwsgi/testing.domain.org.ua.ini open("./cgi_plugin.so"): No such file or directory [core/utils.c line 3675] !!! UNABLE to load uWSGI plugin: ./cgi_plugin.so: cannot open shared object file: No such file or directory !!! *** Starting uWSGI 2.0.8 (64bit) on [Mon Nov 10 17:39:27 2014] *** compiled with version: 4.4.7 20120313 (Red Hat 4.4.7-11) on 10 November 2014 17:31:07 os: Linux-2.6.32-504.el6.x86_64 #1 SMP Wed Oct 15 04:27:16 UTC 2014 nodename: venti.domain.org.ua machine: x86_64 clock source: unix pcre jit disabled detected number of CPU cores: 1 current working directory: /var/www/vhosts/setevoy/testing.domain.org.ua detected binary path: /usr/bin/uwsgi uWSGI running as root, you can use --uid/--gid/--chroot options *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** *** WARNING: you are running uWSGI without its master process manager *** your processes number limit is 7803 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 TCP address 127.0.0.1:9090 fd 3 your server socket listen backlog is limited to 100 connections your mercy for graceful operations on workers is 60 seconds mapped 72768 bytes (71 KB) for 1 cores *** Operational MODE: single process *** initialized CGI mountpoint: / = /var/www/vhosts/setevoy/testing.domain.org.ua/ *** no app loaded. going in full dynamic mode *** *** uWSGI is running in multiple interpreter mode *** spawned uWSGI worker 1 (and the only) (pid: 697, cores: 1)
Проверяем:
# curl http://testing.domain.org.ua/index.py <html><body><h1>It works!</h1></body></html>
В логе uWSGI видим запись:
[pid: 697|app: -1|req: -1/1] 77.***.***.20 () {30 vars in 491 bytes} [Mon Nov 10 17:39:28 2014] GET /index.py => generated 46 bytes in 11 msecs (HTTP/1.1 200) 1 headers in 44 bytes (0 switches on core 0)
Либо — возьмём более сложный пример, с запросами типа <form></form>
и использованием метода cgi.FieldStorage()
:
#!/usr/bin/python import cgi, MySQLdb import cgitb; cgitb.enable() data = None form = cgi.FieldStorage() def myver(host, user, pwd, cmd): db = MySQLdb.connect(host, user, pwd) cursor = db.cursor() cursor.execute(cmd) global data data = cursor.fetchone() db.close() getvers = form.getvalue('getvers') exit = form.getvalue('exit') print "Content-type:text/htmlrnrn" print "<title>Test to get MySQL version</title>" print "<h2>MySQL version</h2>" print '''Get version: <form action="mysql.py" method="get"> <input type="submit" name="getvers" value="Get version" /> <input type="submit" name="exit" value="Exit" /> </form> ''' if getvers: myver('localhost', 'root', 'мегапассворд', 'SELECT VERSION()') print('Current MySQL version: %s ' % data) elif exit: print('Exit')
Результат:
# curl http://testing.domain.org.ua/mysql.py?getvers=Get+version <title>Test to get MySQL version</title> <h2>MySQL version</h2> Get version: <form action="mysql.py" method="get"> <input type="submit" name="getvers" value="Get version" /> <input type="submit" name="exit" value="Exit" /> </form> Current MySQL version: 5.5.40-MariaDB-log