可以说这个问题困扰了我很久,一直很迷,在此记录以备后用

起因

密码学竞赛需要做一个基于软件平台的随机数发生器,需要支持至少一种移动终端,最后想想还是做一个网站比较实在一点,还能提供一个API,这才有了下文。

当然本文只涉及做上线的配置。

uwsgi

WSGI

全称是Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述web server如何与web application通信的规范。

uwsgi

与WSGI一样是一种通信协议,是uWSGI服务器的独占协议,用于定义传输信息的类型(type of information),每一个uwsgi packet前4bytes为传输信息类型的描述,与WSGI协议是两种东西,据说该协议是fcgi协议的10倍快。

uWSGI

web服务器,实现了WSGI协议、uwsgi协议、http协议

配置

首先sudo pip3 install uwsgi,还是推荐使用豆瓣源,在后面加上-i https://pypi.doubanio.com/simple/即可,安装uwsgi库。

sudo apt install uwsgi记忆里貌似要装这个东西,但因懒得复现故加上吧。

uwsgi_params

uwsgi_param    QUERY_STRING        $query_string;
uwsgi_param    REQUEST_METHOD      $request_method;
uwsgi_param    CONTENT_TYPE        $content_type;
uwsgi_param    CONTENT_LENGTH      $content_length;

uwsgi_param    REQUEST_URI         $request_uri;
uwsgi_param    PATH_INFO           $document_uri;
uwsgi_param    DOCUMENT_ROOT       $document_root;
uwsgi_param    SERVER_PROTOCOL     $server_protocol;
uwsgi_param    UWSGI_SCHEME        $scheme;

uwsgi_param    REMOTE_ADDR         $remote_addr;
uwsgi_param    REMOTE_PORT         $remote_port;
uwsgi_param    SERVER_PORT         $server_port;
uwsgi_param    SERVER_NAME         $server_name;

必要

uwsgi.ini

这个是必要文件

[uwsgi]
socket = 127.0.0.1:9000
chdir = /py_project/pseudorandom/
wsgi-file = pseudorandom/wsgi.py
processes = 4
threads = 2
stats = 127.0.0.1:9191
pidfile = /py_project/pseudorandom/uwsgi.pid
daemonize = /py_project/pseudorandom/uwsgi.log

解释:

  • socket:uwsgi服务器绑定的地址以及端口
  • chdir:这里填写项目的位置路径,截至父目录即可
  • wsgi-file:这里承接上面的目录,表示运行本项目(pseudorandom)的wsgi.py,上下路径拼接起来可以得出wsgi.py的绝对路径
  • processes:进程数目
  • threads:县城数目
  • pidfile:记录uwsgi服务器的进程号(process ID),可在终止服务器的时候使用这个pid文件,绝对路径
  • daemonize:指定日志存放文件,绝对路径

运行与终止

uwsgi --ini uwsgi.ini
运行成功就会出现[uWSGI] getting INI configuration from uwsgi.ini

uwsgi --stop uwsgi.pid
便会根据进程号终止相应的服务器进程

Nginx

安装

sudo apt install nginx
成功后可访问查看是否有欢迎页面
Nginx欢迎页面

配置

# the upstream component nginx needs to connect to
upstream django {
    server 127.0.0.1:9000; # for a web port socket (we'll use this first)
}
server {
    listen      80;
    server_name prg.herbwen.com;
    charset     utf-8;

    # max upload size
    client_max_body_size 1024M;   # adjust to taste

    location /static {
        alias /py_project/pseudorandom/generator/templates; # your Django project's static files - amend as required
    }

    # Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass  django;
        include     /py_project/pseudorandom/uwsgi_params; # the uwsgi_params file you installed
    }
}

可以看到upstream django绑定的是反代指定的端口,即uwsgi服务器运行的9000,其他配置照做即可,因为比赛嘛,实现的东西比较简单,故使用了以前项目的配置文件。

cp xxx.conf /etc/nginx/sites-enabled

然后就是各种重启,安安心,最后uwsgi --ini uwsgi.ini,查看能否访问成功。

记得关debug