手记

Nginx+uWsgi部署Django项目

在Django项目跟目录,即manage.py文件同级目录下(当然目录是可以随意的),增加uwsgi.ini文件

[uwsgi]
#项目目录
chdir=/home/PythonProjects/cash_software/
#指定项目的application
wsgi-file=cash/wsgi.py
#指定sock的文件路径
socket=/home/PythonProjects/script/uwsgi.sock
#进程个数
workers=5
pidfile=/home/PythonProjects/script/uwsgi.pid
#指定IP端口
http=0.0.0.0:20000
#指定静态文件
static-map=/static=/home/PythonProjects/cash_software/statics
#启动uwsgi的用户名和用户组
uid=root
gid=root
#启用主进程
master=true
#自动移除unix socket和pid文件当服务停止的时候
vacuum=true
#徐丽华接受的内容,如果可能的话
thunder-lock=true
#启用线程
enable-threads=true
#设置自中断时间
harakiri=30
#设置缓冲
post-buffering=4096
#设置日志目录
daemonize=/home/PythonProjects/script/uwsgi.log

在网上找到的很多没有使用wsgi-file配置,而是module=project_name.wsgi:application,但是启动后访问日志中会报:no python application found, check your startup logs for errors。没有找到APP的错误

nginx使用

nginx命令行参数

-c </path/to/config> 为 Nginx 指定一个配置文件,来代替缺省的。
-t 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
-v 显示 nginx 的版本。
-V 显示 nginx 的版本,编译器版本和配置参数。

nginx 启动、停止、重启命令

  • nginx启动
    sudo /usr/local/nginx/nginx (nginx二进制文件绝对路径,可以根据自己安装路径实际决定)

  • nginx从容停止命令,等所有请求结束后关闭服务
    ps -ef |grep nginx
    kill -QUIT nginx主进程号

  • nginx 快速停止命令,立刻关闭nginx进程
    ps -ef |grep nginx
    kill -TERM nginx主进程号

  • 如果以上命令不管用,可以强制停止
    kill -9 nginx主进程号

nginx重启命令

nginx重启可以分成几种类型

  1. 简单型,先关闭进程,修改你的配置后,重启进程。
    kill -QUIT cat /usr/local/nginx/nginx.pid
    sudo /usr/local/nginx/nginx
  2. 重新加载配置文件,不重启进程,不会停止处理请求
  3. 平滑更新nginx二进制,不会停止处理请求

使用信号加载新的配置

Nginx 支持几个信号,能在它运行时控制其操作。其中最普通的是 15 ,用来中止运行的进程:

而最有趣的是能平滑改变 nginx 配置的选项(请注意,在重载前,要先测试一下配置文件):

当 nginx 接收到 HUP 信号,它会尝试先解析配置文件(如果指定配置文件,就使用指定的,否则使用默认的),成功的话,就应用新的配置文件(例如:重新打开日志文件或监听的套接 字)。之后,nginx 运行新的工作进程并从容关闭旧的工作进程。通知工作进程关闭监听套接字但是继续为当前连接的客户提供服务。所有客户端的服务完成后,旧的工作进程被关闭。 如果新的配置文件应用失败,nginx 将继续使用旧的配置进行工作。

nginx配置

user  root; #这里改成root,因为默认nginx用户可能没有权限访问你的静态文件
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

pid        /home/PythonProjects/cash_software/config/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /usr/local/nginx/conf/mime.types;
    default_type  application/octet-stream;

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

    #access_log  logs/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    server {
        listen       10086;
        server_name  47.104.201.10;  # 公网IP或者域名
        charset utf-8;
 
        access_log  /home/PythonProjects/cash_software/logs/host.access.log  main;
 
        # max upload size
        client_max_body_size 100M;
 
        # Django media
        location /media {
            alias /home/PythonProjects/cash_software/media;
        }
 
        location /static {
            alias /home/PythonProjects/cash_software/statics;
        }
 
        location / {
            include /usr/local/nginx/conf/uwsgi_params;
            # uwsgi_pass 127.0.0.1:20000
            uwsgi_connect_timeout 30;
            uwsgi_pass unix:/home/PythonProjects/cash_software/config/uwsgi.sock;
        }
       error_page  404              /404.html;
       error_page   500 502 503 504  /50x.html;
       location = /50x.html {
            root   html;
       }
}

启动Nginx+uWsgi

#!/bin/bash

basepath=$(cd `dirname $0`; pwd)

if [ -f "$basepath/config/uwsgi.pid" ]; then
    uwsgi --stop $basepath/config/uwsgi.pid
fi

uwsgi --ini $basepath/config/uwsgi.ini

if [ -f "$basepath/config/nginx.pid" ]; then
    pid=$(cat $basepath/config/nginx.pid)
    kill -QUIT $pid
 fi
 
 nginx -c $basepath/config/nginx.conf

部署多个应用
一个Nginx中,可以同时运行多个应用,不一定是Python的应用。我们期望通过不同的路径来路由不同的应用,因此就不能像上例那样直接修改根目录的配置。假设我们希望通过”http://localhost/myapp”来访问我们的应用,首先要在Nginx的配置文件中,加入下面的内容:
location /myapp {
include uwsgi_params;
uwsgi_param SCRIPT_NAME /myapp;
uwsgi_pass 127.0.0.1:3031;
}

这里我们定义了一个uWSGI参数”SCRIPT_NAME”,值为应用的路径”/myapp”。接下来,在uWSGI的启动配置中,去掉”wsgi-file”项,并加上:
[uwsgi]

mount=/myapp=server.py
manage-script-name=true

“mount”参数表示将”/myapp”地址路由到”server.py”中,”manage-script-name”参数表示启用之前在Nginx里配置的”SCRIPT_NAME”参数。再次重启Nginx和uWSGI,你就可以通过”http://localhost/myapp”来访问应用了。

uwsgi自动/手动重载

在默认设置下,uwsgi本身不会立即加载修改后的文件,这是为了效率起见。如果你有修改代码后需要立即在服务器上reload的需求,则在uwsgi的ini文件中加入如下修改(不建议):

py-autoreload = 1

正确手动重载uwsgi和代码的方式
首先,确保你uwsgi的ini配置文件有自动生成pidfile。

pidfile = /path/to/your/uwsgi.pid

然后,在你的uwsgi.pid的目录下执行:

uwsgi --reload uwsgi.pid

至此,修改后的代码已经被重载,并且生效了。

0人推荐
随时随地看视频
慕课网APP