Back to Blogs
nginx
uwsgi
django

Nginx+uWSGI+Django 安装配置

Soloman
2019-10-20

Nginx+uWSGI+Django 安装配置

1 Django

1.1 安装 pip 和 Django

# 安装 pip
sudo apt install python-pip -y

# 使用 pip 安装 django
sudo pip install django==3.2.1(根据自己需要选择Django版本)

2 uWSGI

2.1 安装测试 uWSGI

# 使用 pip 安装 uwsgi
sudo apt-get install python3.8-dev
sudo pip install uwsgi

# 查看uwsgi版本
uwsgi --version

# 测试uwsgi功能正常否,浏览http://127.0.0.1:8080
sudo uwsgi --http :8080 --wsgi-file test.py

# 测试功能为:the web client <-> uWSGI <-> Python

test.py文件内容如下:

def application(env,start_response):
    start_response('200 OK',[('Content-Type','text/html')])
    return [b"Hello, www.soloman.vip"]

2.2 使用uWSGI运行Django项目

# 进入到Django项目【solomanvip】根目录下运行。--module xx.wsgi为加载指定的wsgi模块,你项目起的是什么名字,一般就是:项目名.wsgi
uwsgi --http :8080 --module solomanvip.wsgi

# 等效于直接运行
python manage.py runserver 0.0.0.0:8080

# 测试功能为:the web client <-> uWSGI <-> Django

2.3 使用uWSGI配置文件运行Django项目

在Django项目根目录中创建配置文件,solomanvip.ini配置文件内容:

# solomanvip.ini file
[uwsgi]

# Django-related settings
# the base directory (full path)
# 指定运行目录,其实就是Django项目的根目录
chdir = /home/soloman/web/solomanvip

# Django's wsgi file
# 导入django项目的wsgi模块
module = solomanvip.wsgi

# 载入wsgi-file,跟上面的效果一样
# wsgi-file = solomanvip/wsgi.py

# 补充,uwsgi启动时的用户和用户组,注意要按你自己的实际权限进行配置
uid = operation
gid = nginx

# process-related settings
# 开启master主进程
master = true 

# maximum number of worker processes
# 开启多少个进程数,workers项也等同processes
# threads项则是设置运行线程,测试倒不用设置上线程
processes = 4

# background the process & log
# 后台运行,有用,基本都会设置上,同时还会输出日志
daemonize = /var/log/uwsgi/solomanvip.log 

# the socket (use the full path to be safe)
# 设置使用的socket端口或socket地址
# socket = 0.0.0.0:8080
# 上面的socket建议配置成一个solomanvip.socket文件后使用nginx来连接uWSGI运行,不然容易报socket的请求头错误和权限错误等。
# socket = /home/soloman/web/solomanvip.socket

# ... with appropriate permissions - may be needed
# 配置生成的sock文件的权限
chmod-socket = 664 

# clear environment on exit
# 退出时清空环境,其实就是将自动生成的solomanvip.sock和相关pid文件给干掉。
vacuum = true

uwsgi指定配置文件启动django项目

uwsgi --ini solomanvip.ini

# 在后台运行
uwsgi --ini solomanvip.ini &

3 Nginx

3.1 安装 Nginx

sudo apt-get install nginx

sudo /etc/init.d/nginx start    # 启动
sudo /etc/init.d/nginx stop     # 停止
sudo /etc/init.d/nginx restart  # 重启

3.2 Nginx 参数配置

main                                # 全局配置

events {                            # 工作模式配置
}

http {                              # http设置
    ....
    server {                        # 服务器主机配置(虚拟主机、反向代理等)
        ....
        location {                  # 路由配置(虚拟目录等)
            ....
        }

        location path {
            ....
        }

        location otherpath {
            ....
        }
    }

    server {
        ....
        location {
            ....
        }
    }

    upstream name {                  # 负载均衡配置
        ....
    }
}

配置文件要由6个部分组成:

main:用于进行nginx全局信息的配置 events:用于nginx工作模式的配置 http:用于进行http协议信息的一些配置 server:用于进行服务器访问信息的配置 location:用于进行访问路由的配置 upstream:用于进行负载均衡的配置

main模块

user 指定nginx worker进程运行用户以及用户组 worker_processes 指定nginx要开启的子进程数量,运行过程中监控每个进程消耗内存(一般几M~几十M不等)根据实际情况进行调整,通常数量是CPU内核数量的整数倍 error_log 定义错误日志文件的位置及输出级别【debug / info / notice / warn / error / crit】 pid 指定进程id的存储文件的位置 worker_rlimit_nofile 指定一个进程可以打开最多文件数量的描述

user root;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events模块

worker_connections 指定最大可以同时接收的连接数量,这里一定要注意,最大连接数量是和worker processes共同决定的。 multi_accept 配置指定nginx在收到一个新连接通知后尽可能多的接受更多的连接 use epoll 配置指定了线程轮询的方法,如果是linux2.6+,使用epoll,如果是BSD如Mac请使用Kqueue

events {
        worker_connections 1024;
        multi_accept on;
        use epoll;
}

http模块

http {
    # 基础配置
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

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

    # SSL证书配置
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    # 日志配置
    access_log /etc/nginx/log/access.log;
    error_log /etc/nginx/log/error.log;

    # Gzip 压缩配置
    gzip on;
    gzip_disable "msie6";

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/javascript
    # text/xml application/xml application/xml+rss text/javascript;

    # 虚拟主机配置
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

server模块

srever模块是http的一个子模块,用来定义一个虚拟服务器的配置信息

server:一个虚拟主机的配置,一个http中可以配置多个server server_name:用力啊指定ip地址或者域名,多个配置之间用空格分隔 root:表示整个server虚拟主机内的根目录,所有当前主机中web项目的根目录 index:用户访问web网站时的全局首页 charset:用于设置www/路径中配置的网页的默认编码格式 access_log:用于指定该虚拟主机服务器中的访问记录日志存放路径 error_log:用于指定该虚拟主机服务器中访问错误日志的存放路径

server {
    listen       80;
    server_name  127.0.0.1;
    root         /home/soloman/website/;
    index        index.php index.html index.html;
    charset      utf-8;
    access_log   /etc/nginx/log/access.log;
    error_log    /etc/nginx/log/error.log;
}

# 重定向http自动转https
server {
    listen 80;
    server_name soloman.vip www.soloman.vip;
    return 301 https://$server_name$request_uri;
}

location模块

location模块是http的一个子模块,主要用于配置路由访问信息

location /:表示匹配访问根目录 root:用于指定访问根目录时,访问虚拟主机的web目录 index:在不指定访问具体资源时,默认展示的资源文件列表

location / {
    root    /home/soloman/website/html;
    index    index.php index.html index.htm;
}

# 反向代理配置方式
location / {
    proxy_pass http://localhost:8888;
    proxy_set_header X-real-ip $remote_addr;
    proxy_set_header Host $http_host;
}

# uwsgi模式下的服务器配置访问方式
location / {
    include uwsgi_params;
    uwsgi_pass localhost:8080;
}

4 部署测试中会用到的Linux命令

# 查看端口运行程序
sudo netstat -tulpn | grep :8080

# 关闭该端口的运行程序
sudo kill -9 id

# 复制文件
cp source dest

# 复制文件夹
cp -r source dest