【django+drf+nginx+uwsgi+socket项目部署】

django+drf+nginx+uwsgi+socket项目部署

准备centos 7服务器一台
后端代码
前端代码

  1. 在/var/www/目录下创建项目文件夹,例如创建house_statistic_query_dev如下
[root@lidong www]# pwd
/var/www
[root@lidong www]# ls
house_statistic_query_dev
  1. 将前端项目,后端代码项目放到house_statistic_query_dev里,并创建配置文件夹(dev_config)
[root@lidong house_statistic_query_dev]# pwd
/var/www/house_statistic_query_dev
[root@lidong house_statistic_query_dev]# ll
total 4
drwxr-xr-x.  4 root root  105 Nov 19 09:03 dev_config 
drwxr-xr-x. 14 root root  282 Nov 17 03:27 house_statistic_query_backend 
drwxr-xr-x. 10 root root 4096 Nov 19 07:09 house_statistic_query_front
  1. 在dev_config文件夹下创建uwsgi文件夹,venv虚拟环境
[root@lidong dev_config]# pwd
/var/www/house_statistic_query_dev/dev_config
[root@lidong dev_config]# ll
total 12
drwxr-xr-x. 2 root root   70 Nov 23 02:04 uwsgi  # make uwsgi
drwxr-xr-x. 6 root root   92 Nov 17 03:26 venv   #执行python -m venv venv完成创建
  1. 激活虚拟环境
[root@lidong ~]# source /var/www/house_statistic_query_dev/dev_config/venv/bin/activate
(venv) [root@lidong ~]#
  1. 进入项目目录,检测该Django项目目录是否能够正确启动
(venv) [root@lidong house_statistic_query_backend]# python3 manage.py runserver 172.16.10.239:8833
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
November 29, 2021 - 15:31:28
Django version 3.0.7, using settings 'settings.dev'
Starting development server at http://172.16.10.239:8833/
Quit the server with CONTROL-C.
  • 如果DEBUG = True,浏览器访问你应看到:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BHcZutUF-1638441513904)(https://note.youdao.com/yws/res/f/WEBRESOURCE6b3a56b56e4e775950cbd34bad9a5fdf)]

  • 如果DEBUG = False,浏览器访问你应看到:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q1Ocv6l1-1638441513905)(WEBRESOURCEbb914ee4bf717a913010113f427bf330)]

  1. 在uwsgi文件夹下创建uwsgi.ini文件
[uwsgi]
# 如果我们想直接将uwsgi用作服务,直接暴露在公网那么就使用http;
# 如果有单独的服务器,由服务器将请求转发给uwsgi处理,并且使用http协议,那么此时使用http-socket
# http的端口,http 一般是作为独立部署的选项; http-socket 在前端webserver不支持uwsgi时使用,
# nginx的端口,前端webserver支持uwsgi, 则直接使用socket即可(tcp or unix)
#http= :8081
socket=:8082
http-keepalive=1
# 项目所在的目录
chdir=/var/www/house_statistic_query_dev/house_statistic_query_backend
# wsgi所在的位置(django项目的wsgi.py文件)
module=house_statistic_query_backend.wsgi:application
# 替换uwsgi.py文件下的os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'house_bi.settings')
env = DJANGO_SETTINGS_MODULE=settings.dev
# 设置静态文件
# static-map = /ui=/var/www/house_statistic_query_dev/house_statistic_query_backend/static
# 启动主进程
master=true
# 进程个数
workers=3
# 在每个worker而不是master中加载应用
lazy-apps=true
# 每个进程最大请求个数
max-requests=2000
# 启动uwsgi的用户名和用户组
uid=root
gid=root
# 自动移除unix Socket 和 Pid 文件 当服务停止的时候
vacuum=true
# 启用线程
enable-threads=true
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=4096
# 序列化接受的内容,如果可能的话
thunder-lock = true

buffer-size = 65536
# 进程个数
processes=4

threads=2

chmod-socket=664

pidfile=/var/www/house_statistic_query_dev/dev_config/uwsgi/uwsgi.pid
#日志所在位置
logto=/var/www/house_statistic_query_dev/dev_config/uwsgi/uwsgi.log

注意:当连接为socket通信时,不需要设置static-map对应的静态文件路径,因为此时使用外部浏览器将无法直接访问,会提示类似于“缓存区(buffer)超过最大长度”类似的问题。故所以需要nginx来转发,因为nginx服务器和后端可以用socket连接,故需要先访问uwsgi服务器,再请求后端服务器

  1. 使用uwsgi启动django服务器,会生成四个文件如下。
(venv) [root@lidong uwsgi]# uwsgi -d --ini  uwsgi.ini 
[uWSGI] getting INI configuration from uwsgi.ini
(venv) [root@lidong uwsgi]# ll
total 400
-rw-r-----. 1 root root 136957 Dec  1 06:31 --ini
-rw-r--r--. 1 root root   1710 Dec  1 06:31 uwsgi.ini
-rw-r-----. 1 root root   5119 Nov 29 07:49 uwsgi.log
-rw-rw-rw-. 1 root root      5 Nov 29 07:50 uwsgi.pid
srw-rw-r--. 1 root root      0 Dec  1 06:31 uwsgi.sock
  1. 查看是否启动成功,出现该网页无法访问则为启动成功

【django+drf+nginx+uwsgi+socket项目部署】_第1张图片

  1. 下载nginx,并配置nginx.conf文件如下,并启动nginx
  • 方法一:配置,对应uwsgi.ini文件中的uwsgi.sock文件路径
  • uwsgi_pass unix:/var/www/house_statistic_query_dev/dev_config/uwsgi/uwsgi.sock;
user  root;
worker_processes  2;
error_log  /software/nginx/logs/error.log warn;
#pid        /software/nginx/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       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  /software/nginx/logs/access.log  main;
    sendfile            on;
    keepalive_timeout   1800;


    server {
      listen 80;
      server_name 172.16.10.239;  # 服务器 ip 或是域名
      charset     utf-8;  # 字符集
      gzip  on;
      gzip_min_length 1k;
      gzip_buffers 4 16k;
      gzip_comp_level 3;
      gzip_types text/plain text/css application/xml application/javascript application/x-javascript text/javascript;

      location /  {
        root  /var/www/house_statistic_query_dev/house_statistic_query_front/dist;
        add_header Cache-Control no-cache;
        add_header Access-Control-Allow-Oriain '*';
        index html index.html;
        try_files $uri $uri/ /index.html;

      }

      location /ui{
        alias  /var/www/house_statistic_query_dev/house_statistic_query_backend/static;
        index index.html index.htm;
      }


      location /api/ {
#             include uwsgi_params;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header Host $http_host;
            client_body_buffer_size 10M;
            client_max_body_size 10G;
            proxy_buffers 65536 4k;
            proxy_read_timeout 216000;
            proxy_connect_timeout 216000;
            proxy_send_timeout 216000;
            send_timeout 216000;
            proxy_next_upstream error timeout http_404;
            uwsgi_send_timeout 1800;
            uwsgi_read_timeout 1800;
           uwsgi_pass unix:/var/www/house_statistic_query_dev/dev_config/uwsgi/uwsgi.sock;
           uwsgi_param UWSGI_SCRIPT house_statistic_query_backend.wsgi;
           uwsgi_param UWSGI_CHDIR /var/www/house_statistic_query_dev/house_statistic_query_backend;
      }

      location /admin {
        include uwsgi_params;
        uwsgi_pass unix:/var/www/house_statistic_query_dev/dev_config/uwsgi/uwsgi.sock;
        uwsgi_param UWSGI_SCRIPT house_statistic_query_backend.wsgi;
        uwsgi_param UWSGI_CHDIR /var/www/house_statistic_query_dev/house_statistic_query_backend;
    }
   }

}


  • 方法一:如果在uwsgi.ini文件中没有配置uwsgi.sock文件,可以使用ip代替
  • uwsgi_pass 172.16.10.239:8082;
user  root;
worker_processes  2;
error_log  /software/nginx/logs/error.log warn;
#pid        /software/nginx/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       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  /software/nginx/logs/access.log  main;
    sendfile            on;
    keepalive_timeout   1800;


    server {
      listen 80;
      server_name 172.16.10.239;  # 服务器 ip 或是域名
      charset     utf-8;  # 字符集
      gzip  on;
      gzip_min_length 1k;
      gzip_buffers 4 16k;
      gzip_comp_level 3;
      gzip_types text/plain text/css application/xml application/javascript application/x-javascript text/javascript;

      location /  {
        root  /var/www/house_statistic_query_dev/house_statistic_query_front/dist;
        add_header Cache-Control no-cache;
        add_header Access-Control-Allow-Oriain '*';
        index html index.html;
        try_files $uri $uri/ /index.html;

      }

      location /ui{
        alias  /var/www/house_statistic_query_dev/house_statistic_query_backend/static;
        index index.html index.htm;
      }


      location /api/ {
            include uwsgi_params;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header Host $http_host;
            client_body_buffer_size 10M;
            client_max_body_size 10G;
            proxy_buffers 65536 4k;
            proxy_read_timeout 216000;
            proxy_connect_timeout 216000;
            proxy_send_timeout 216000;
            send_timeout 216000;
            proxy_next_upstream error timeout http_404;
            uwsgi_send_timeout 1800;
            uwsgi_read_timeout 1800;
#           uwsgi_pass unix:/var/www/house_statistic_query_dev/dev_config/uwsgi/uwsgi.sock;
           uwsgi_pass 172.16.10.239:8082;
           uwsgi_param UWSGI_SCRIPT house_statistic_query_backend.wsgi;
           uwsgi_param UWSGI_CHDIR /var/www/house_statistic_query_dev/house_statistic_query_backend;
      }

      location /admin {
        include uwsgi_params;
#         uwsgi_pass unix:/var/www/house_statistic_query_dev/dev_config/uwsgi/uwsgi.sock;
         uwsgi_param UWSGI_SCRIPT house_statistic_query_backend.wsgi;
         uwsgi_param UWSGI_CHDIR /var/www/house_statistic_query_dev/house_statistic_query_backend;
        uwsgi_pass 172.16.10.239:8082;

    }
   }

}


  1. 检查是否配置成功,此时静态文件可以正常加载。
  2. 检查是否与后端连接成功,检查登陆功能。
    【django+drf+nginx+uwsgi+socket项目部署】_第2张图片

你可能感兴趣的:(django,linux,nginx,django,nginx,python)