云服务器centos下nginx+uWSGI+Django+域名部署

本篇文章介绍了云服务器centos下nginx+uWSGI+Django+域名部署, 请打开相应端口和购买域名

  1. 安装nginx

    1
    2
    yum install nginx
    vi /etc/nginx/conf.d/builddemo_nginx.conf

    builddemo_nginx.conf文件名字是自定义的, 在此文件中输入以下内容

    1
    2
    3
    4
    5
    6
    7
    8
    server {
    server_name 域名或者主机外网ip;
    listen 17879;
    location / {
    include uwsgi_params;
    uwsgi_pass 127.0.0.1:17878;
    }
    }

    注:

    ​ (1) 如果server_name 域名;的话,需要保证服务器与服务器已绑定, 绑定方法请参考:[(1条消息) 如何绑定腾讯云域名到云服务器ip?_colorfulyan的博客-CSDN博客](https://blog.csdn.net/colorfulyan/article/details/108952573#:~:text=登陆 腾讯云 ,鼠标移至” 云 产品”,下滑选择” 域名 管理” ,如何 绑定ip ) 进入控制台->总览-> 云 解析 2) 这里需要做进一步的设置,比如,在更多选项卡中,开启CNAME加速,)

    ​ (2)uwsgi_pass 是nginx与uWSGI服务器之间通信, 一般nginx是和uWSGI服务器是在同一台主机上面,因此直接使用127.0.0.1即可, 端口自己定义

    ​ (3) listen 17879; 这里的端口号也是自己定义的,这是用于客户端与nginx之间的通信. 比如在浏览器输入: http://sunshine.site:17879/

  2. 安装uWSGI—web服务器

    1
    2
    pip  install uwsgi   
    systemctl stop firewalld //关掉防火墙
    • 检测uwsgi的是否可用

      在任意一个文件夹 vi test.py,输入以下内容:

    1
    2
    3
    4
    def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    tt = "hello world"
    return tt.encode('utf-8')
    1
    2
    // 执行命令
    [root@infinity ~]# uwsgi --http :18001 --wsgi-file test.py

    在浏览器输入ip地址:端口号

    image-20210810170442006

    这就确保了uWSGI服务器正常

  3. 创建django项目

    1
    2
    3
    4
    5
    django-admin startproject builddemo
    cd builddemo
    python manage.py startapp firstapp
    mkdir uwsgi_conf
    vi uwsgi_params

    uwsgi_params里面输入以下内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    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 REQUEST_SCHEME $scheme;
    uwsgi_param HTTPS $https if_not_empty;

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

    现在的目录结构是介样的:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    [root@infinity builddemo]# tree
    .
    ├── builddemo
    │   ├── asgi.py
    │   ├── __init__.py
    │   ├── __pycache__
    │   │   ├── __init__.cpython-36.pyc
    │   │   ├── settings.cpython-36.pyc
    │   │   ├── urls.cpython-36.pyc
    │   │   └── wsgi.cpython-36.pyc
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    ├── db.sqlite3
    ├── firstapp
    │   ├── admin.py
    │   ├── apps.py
    │   ├── __init__.py
    │   ├── migrations
    │   │   └── __init__.py
    │   ├── models.py
    │   ├── tests.py
    │   └── views.py
    ├── manage.py
    ├── media
    ├── static
    ├── uwsgi_conf
    └── uwsgi_params

    在builddemo/settings.py 里面的ALLOWED_HOSTS = []改成ALLOWED_HOSTS = ['*']

    在根目录输入python manage.py runserver 正常就表明项目创建成功

    也可以通过uwsgi来启动项目(注:此时仅仅只是可用uwsgi命令来启动, 和nginx还没关联):

    [root@infinity builddemo]# uwsgi --http :19091 --module builddemo.wsgi

    在浏览器输入: 外网ip:端口号即可访问

    image-20210810172917541
  4. 通过uwsgi.ini文件将nginx和uWSGI和django项目关联起来

    1
    2
    cd uwsgi_conf
    vi uwsgi.ini

    在uwsgi.ini里面输入以下配置信息:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    # uwsig使用配置文件启动
    [uwsgi]
    socket = 127.0.0.1:17878 # 注意要和/etc/nginx/conf.d/builddemo_nginx.conf里面uwsgi_pass的端口保持一致
    # 项目所在的根目录
    chdir=/root/builddemo/
    # 指定项目的application,区别于启动命令--wsgi-filemysite/wsgi.py
    module=builddemo.wsgi:application
    #the local unix socket file than commnuincate to Nginx
    # 指定sock的文件路径,这个sock文件会在nginx的uwsgi_pass配置,用来nginx与uwsgi通信
    # 支持ip+port模式以及socket file模式
    # 进程个数, 一般设置为cpu个数的两倍
    processes = 8
    # 每个进程worker数
    workers=5
    py-autoreload=1 # py文件修改,自动加载

    # 指定多个静态文件:static目录和media目录,也可以不用指定该静态文件,在nginx中配置静态文件目录
    # uwsgi有自己的配置语法,详细可参考官网,无需写绝对路径,可以用循环、判断等高级配置语法
    for =static media
    static-map=/static=%(chdir)/%(_)

    # 启动uwsgi的用户名和用户组
    uid=root
    gid=root

    # 启用主进程
    master=true
    # 自动移除unix Socket和pid文件当服务停止的时候
    vacuum=true

    # 序列化接受的内容,如果可能的话
    thunder-lock=true
    # 启用线程
    enable-threads=true
    # 设置一个超时,用于中断那些超过服务器请求上限的额外请求
    harakiri=30
    # 设置缓冲
    post-buffering=4096

    # 设置日志目录
    daemonize=%(chdir)/uwsgi_conf/uwsgi.log
    # uWSGI进程号存放
    pidfile=%(chdir)/uwsgi_conf/uwsgi.pid

    uwsgi.ini文件中记录了要部署的项目的目录,以及nginx的端口 以及其他配置信息, 实现了将nginx和uWSGI和django项目关联起来

  5. 启动uWSGI和nginx

    1
    2
    [root@infinity builddemo]# uwsgi --ini uwsgi_conf/uwsgi.ini
    [root@infinity builddemo]# systemctl start nginx

这样整个项目就部署成功了,在浏览器输入: ip:端口 或者 域名:端口 就可以正常访问了:

image-20210810174540439

完结撒花!!!

参考文章: centos7下部署Django(nginx+uwsgi+django+python3) - 知乎 (zhihu.com)