Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
nginx + uwsgi + python [WORKAROUND]
View unanswered posts
View posts from last 24 hours

 
Reply to topic    Gentoo Forums Forum Index Networking & Security
View previous topic :: View next topic  
Author Message
pigeon768
l33t
l33t


Joined: 02 Jan 2006
Posts: 683

PostPosted: Mon Sep 19, 2011 4:27 pm    Post subject: nginx + uwsgi + python [WORKAROUND] Reply with quote

So I'm trying to cobble together a webserver using nginx + python, and am having problems.

/etc/nginx/nginx.conf:
Code:
user nginx nginx;
worker_processes 4;

error_log /var/log/nginx/error_log info;

events {
        worker_connections 1024;
        use epoll;
}

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

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

        client_header_timeout 10m;
        client_body_timeout 10m;
        send_timeout 10m;

        connection_pool_size 256;
        client_header_buffer_size 1k;
        large_client_header_buffers 4 2k;
        request_pool_size 4k;

        gzip on;
        gzip_min_length 1100;
        gzip_buffers 4 8k;
        gzip_types text/plain;

        output_buffers 1 32k;
        postpone_output 1460;

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;

        keepalive_timeout 75 20;

        ignore_invalid_headers on;

        index index.html;

        server {
                listen 80;
                server_name localhost 127.0.0.1;

                access_log /var/log/nginx/localhost.access_log main;
                error_log /var/log/nginx/localhost.error_log info;

                root /var/www/localhost/htdocs/;

                location /static/ {
                         expires 30d;
                }

                location / {
                         include uwsgi_params;
                         uwsgi_pass 127.0.0.1:8080;
                }
        }
}
webpy.py:
Code:
#!/usr/bin/python3

from wsgiref.simple_server import make_server

def application(env,start_response):
    status = '200 OK' # HTTP Status
    headers = [('Content-type', 'text/html; charset=utf-8')] # HTTP Headers
    start_response(status, headers)

    query_args = { arg[ 0:arg.find("=",1,-1) ]
                   : arg[ arg.find("=",1,-1)+1 : len(arg) ]
                   for arg in env["QUERY_STRING"].split("&")
                   if arg.find("=",1,-1) > 0 }

    ret_string = """
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<style>
html { background-image: url(/static/background.jpg); }
body { color: red; }
</style>
<title>
Hello world!
</title>

<body>
<p>Some text here.</p>
"""

    ret_string += "<p>PATH_INFO: " + env["PATH_INFO"] + "</p>"

    for key,val in query_args.items():
        ret_string += "<p>" + key + ":" + val + "</p>"

    ret_string += "</body></html>"

    return [bytes(ret_string,"utf-8")]

httpd = make_server('127.0.0.1', 8080, application)
httpd.serve_forever()
When I point my browser at http://localhost:8080/ (the python application) everything works:
Code:
localhost - - [19/Sep/2011 09:10:03] "GET / HTTP/1.1" 200 252
localhost - - [19/Sep/2011 09:10:03] "GET /static/background.jpg HTTP/1.1" 200 273
And I get a web page. If I point my browser at http://localhost/ (nginx) the python app complains:
Code:
localhost - - [19/Sep/2011 09:12:57] code 400, message Bad request syntax ('\x00\x81\x02\x00\x0c\x00QUERY_STRING\x00\x00\x0e\x00REQUEST_METHOD\x03\x00GET\x0c\x00CONTENT_TYPE\x00\x00\x0e\x00CONTENT_LENGTH\x00\x00\x0b\x00REQUEST_URI\x01\x00/\t\x00PATH_INFO\x01\x00/\r\x00DOCUMENT_ROOT\x19\x00/var/www/localhost/htdocs\x0f\x00SERVER_PROTOCOL\x08\x00HTTP/1.1\x0b\x00REMOTE_ADDR\t\x00127.0.0.1\x0b\x00REMOTE_PORT\x05\x0033891\x0b\x00SERVER_PORT\x02\x0080\x0b\x00SERVER_NAME\t\x00localhost\t\x00HTTP_HOST\t\x00localhost\x0f\x00HTTP_USER_AGENTB\x00Mozilla/5.0 (X11; Linux x86_64; rv:6.0) Gecko/20100101 Firefox/6.0\x0b\x00HTTP_ACCEPT?\x00text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\x14\x00HTTP_ACCEPT_LANGUAGE\x0e\x00en-us,en;q=0.5\x14\x00HTTP_ACCEPT_ENCODING\r\x00gzip, deflate\x13\x00HTTP_ACCEPT_CHARSET\x1e\x00ISO-8859-1,utf-8;q=0.7,*;q=0.7\x08\x00HTTP_DNT\x01\x001\x0f\x00HTTP_CONNECTION')
localhost - - [19/Sep/2011 09:12:57] "QUERY_STRINGREQUEST_METHODGETCONTENT_TYPECONTENT_LENGTHREQUEST_URI/       PDOCUMENT_ROOT/var/www/localhost/htdocsSERVER_PROTOCOHTTP/1.1REMOTE_ADDR 127.0.0.1REMOTE_PORT33891SERVER_PORT80SERVER_NAME        localhost       HTTP_HOST       localhostHTTP_USER_AGENTBMozilla/5.0 (X11; Linux x86_64; rv:6.0) Gecko/20100101 Firefox/6.0HTTP_ACCEPT?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8HTTP_ACCEPT_gzip, deflateHTTP_ACCEPT_CHARSETISO-8859-1,utf-8;q=0.7,*;q=0.HTTP_DNT1HTTP_CONNECTION" 400 -
...and nginx complains about the web app:
Code:
2011/09/19 09:12:57 [error] 6002#0: *16 upstream prematurely closed connection while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "uwsgi://127.0.0.1:8080", host: "localhost"
..and after a while I get a 502: Bad Gateway error from nginx in the browser.

Help!

Is it maybe because the python application is serving http:// and nginx is asking for uwsgi:// ? How do I get wsgiref to serve wsgi?

edit: nginx serves everything from /static/ just fine. Obviously the python application doesn't serve anything from /static/.

edit2: Using www-servers/uwsgi. Not in the python standard library but appears to be supported well enough. webpy.py is now:
Code:
import uwsgi

def application(env,start_response):
    status = '200 OK' # HTTP Status
    headers = [('Content-type', 'text/html; charset=utf-8')] # HTTP Headers
    start_response(status, headers)

    query_args = { arg[ 0:arg.find("=",1,-1) ]
                   : arg[ arg.find("=",1,-1)+1 : len(arg) ]
                   for arg in env["QUERY_STRING"].split("&")
                   if arg.find("=",1,-1) > 0 }

    ret_string = """
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<style>
html { background-image: url(/static/background.jpg); }
body { color: red; }
</style>
<title>
Hello world!
</title>

<body>
<p>Some text here.</p>
"""

    ret_string += "<p>PATH_INFO: " + env["PATH_INFO"] + "</p>"

    for key,val in query_args.items():
        ret_string += "<p>" + key + ":" + val + "</p>"

    ret_string += "</body></html>"

    return [bytes(ret_string,"utf-8")]
and run with:
Code:
uwsgi-3.2 --socket 127.0.0.1:8080 --file webpy.py --callable application
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Networking & Security All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum