9、ubuntu下使用uwsgi+nginx+supervisor部署django项目

文章将详细介绍如何利用uwsgi、nginx和supervisor部署django项目到腾讯云的服务器,申请和安装证书,接着申请备案,最终实现网站的上线。

### 在开发机上的准备工作:

1、ssh安装:https://blog.csdn.net/netwalk/article/details/12952051

2、filezilla安装(linux下远程上传文件到服务器等功能,类似于windows下的WinSCP工具):

下载链接:https://www.filezilla.cn/download/client

3. 用`pip3 freeze > requirements.txt`将当前环境的包导出到`requirements.txt`文件中,方便在部署的时候安装。

### 在服务器上的准备工作:

1. 安装`MySQL`服务器和客户端:

    ```shell

    sudo apt install mysql-server mysql-client

    sudo apt-get install libmysqld-dev

    ```

参考我的另一篇文章:https://www.jianshu.com/p/763941b72e9c

2. 进入虚拟环境中,然后进入到项目所在目录,执行命令:`pip install -r requirements.txt`,安装好相应的包。

3. 在`mysql`数据库中,创建相应的数据库,创建的数据库名字和密码等可参考setting.py文件中配置数据库部分的代码,如:

DATABASES = {

    'default': {

        'ENGINE': 'django.db.backends.mysql',

        'NAME': 'your database', #数据库名

        'HOST': '127.0.0.1',

        'PORT': '3306', # 端口

        'USER': 'your username', # 数据库用户名

        'PASSWORD': 'your password' # 密码

    }

}

进入数据库:

    ```shell

    mysql -u root -p yourpassword

    create database yourdatabase CHARACTER SET utf8 COLLATE utf8_general_ci;

    ```

参考:https://blog.csdn.net/sinat_39302317/article/details/81082801

4. 配置setting.py文件,设置`ALLOW_HOST`为你的域名,以及ip地址。

5. 设置`DEBUG=False`,避免如果网站产生错误,而将错误信息暴漏给用户。

6. 执行`python manage.py migrate`命令,将迁移文件,映射到数据库中,创建相应的表。如果在这一步出现:

File "E:\Python37\lib\site-packages\django\db\backends\mysql\base.py", line 37, in

raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)

django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.

解决办法:`sudo vim E:\Python37\lib\site-packages\django\db\backends\mysql\base.py`,在37行附近注释掉这部分代码:

raise Exception:

    mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__

7.收集静态文件,终端执行命令:`python manage.py collectstatic`。

8. 执行`python manage.py runserver 0.0.0.0:8001 --insecure`,然后在你自己电脑上,在浏览器中输入`http://你的服务器的ip地址:8001/`。

### 安装uwsgi

1. 通过sudo apt install uwsgi`。(uwsgi必须安装在系统级别的Python环境中,不能安装到虚拟环境中)。

2. 使用命令`uwsgi --http :8000 --module asr_web.wsgi --vritualenv=[python环境的路径]`。用`uwsgi`启动项目,如果能够在浏览器中访问到这个页面,说明`uwsgi`可以加载项目了。但是这种方式加载项目很不友好,可以通过编写配置文件的方式启动项目,如下一步:

### 编写uwsgi配置文件:

在项目的路径下面,创建一个文件叫做`asr_web_uwsgi.ini`的文件,然后填写以下代码:

```shell

[uwsgi]

# Django相关的配置,必须全部为绝对路径

# 项目的路径

chdir = /home/ubuntu/asr_web

# Django的wsgi文件

module = asr_web.wsgi

# Python环境路径

home = /usr/local/lib/python3.6

# 主进程

master = true

# 最大数量的工作进程

processes      = 10

# socket文件路径,绝对路径

socket          = /home/ubuntu/asr_web/asr_web.sock

# 设置socket的权限

chmod-socket    = 666

# 退出的时候是否清理环境

vacuum          = true

```

保存退出,然后使用命令`uwsgi --ini `asr_web_uwsgi.ini`。

### 安装nginx:

1. nginx是一个web服务器。用来加载静态文件和接收http请求的。通过命令`sudo apt install nginx`即可安装。

2. `nginx`常用命令:

    * 启动nginx:sudo service nginx start

    * 关闭nginx:sudo service nginx stop

    * 重启nginx:sudo service nginx restart

### 收集静态文件:

静态文件应该让nginx来服务,而不是让django来做。首先确保你的`settings.py`文件中有一个`STATIC_ROOT`配置,这个配置应该指定你的静态文件要放在哪个目录下。可以执行以下命令:`python manage.py collectstatic`来收集所有静态文件,将这些静态文件放在指定的目录下。

### 项目和nginx绑定,修改default配置文件:

1、修改default文件权限:sudo chmod 777  /etc/nginx/sites-enabled/default

2、编辑default文件,sudo vim /etc/nginx/sites-enabled/default

server {

    # 你的网站将会监听的端口号,如果监听80端口,部署后访问localhost自动跳转到nginx默认的欢迎界面

    listen      80;

    # 绑定的域名

    server_name [服务器IP或者域名]; # substitute your machine's IP address or FQDN

    charset    utf-8;

    # 最大上传速率

    client_max_body_size 75M;  # adjust to taste

    #设置长连接

    keepalive_timeout  70;

    #HSTS策略

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

    # Django media(设置成自己的路径)

    location /media  {

        alias /home/ubuntu/asr_web/media;  # 您的Django项目的媒体文件——根据需要进行修改

    }

    #Django 静态文件路径(设置成自己的路径)

    location /static {

        alias /home/ubuntu/asr_web/static; # 您的Django项目的静态文件——根据需要进行修改

    }

    # 最后,将所有非媒体请求发送到Django服务器

    location / {

        include    /etc/nginx/uwsgi_params; # the uwsgi_params file you installed

        uwsgi_pass 服务器IP

    }

    #减少点击劫持

    add_headerX-Frame-Options DENY;

    #禁止服务器自动解析资源类型

    add_headerX-Content-Type-Options nosniff;

    #防XSS攻击

    add_headerX-Xss-Protection1;

}

写完配置文件后,为了测试配置文件是否设置成功,运行命令:`service nginx configtest`,如果不报错,说明成功。

每次修改完了配置文件,都要记得运行`service nginx restart`。

###nginx配置腾讯云证书

1、证书下载解压放到nginx安装路径下,这里我的路径是:/etc/nginx/sites-enabled下

2、修改配置文件:Nginx 版本为 nginx/1.15.0 以上请使用 listen 443 ssl 代替 listen 443 和 ssl on,sudo vim /etc/nginx/sites-enabled/default,以下为配置内容:

server {

    # 你的网站将会监听的端口号,如果监听80端口,部署后访问localhost自动跳转到nginx默认的欢迎界面

    # listen      80;

    # 绑定的域名

    # server_name [服务器IP或者域名]; # substitute your machine's IP address or FQDN

    charset    utf-8;

    # 最大上传速率

    client_max_body_size 75M;  # adjust to taste

    #设置长连接

    keepalive_timeout  70;

    #HSTS策略

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

    # Django media(设置成自己的路径)

    location /media  {

        alias /home/ubuntu/asr_web/media;  # 您的Django项目的媒体文件——根据需要进行修改

    }

    #Django 静态文件路径(设置成自己的路径)

    location /static {

        alias /home/ubuntu/asr_web/static; # 您的Django项目的静态文件——根据需要进行修改

    }

    # 最后,将所有非媒体请求发送到Django服务器

    location / {

        include    /etc/nginx/uwsgi_params; # the uwsgi_params file you installed

        uwsgi_pass 127.0.0.1:8001 #django内网服务器IP

    }

    #减少点击劫持

    add_headerX-Frame-Options DENY;

    #禁止服务器自动解析资源类型

    add_headerX-Content-Type-Options nosniff;

    #防XSS攻击

    add_headerX-Xss-Protection1;

    #SSL 访问端口号为 443

    listen 443;

    ssl on;

    #填写绑定证书的域名

    server_name 你的域名;

    #证书文件名称

    ssl_certificate www.domain.com_bundle.crt;

    #私钥文件名称

    ssl_certificate_key www.domain.com.key;

    ssl_session_timeout 5m;

    #请按照以下协议配置

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。

    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;

    ssl_prefer_server_ciphers on;

}

3、通过以下命令验证配置文件:nginx -t

如果出现successful字样,说明配置成功,否则请检查配置文件的语法,路径是否准确。

4、重启nginx服务器:sudo service nginx restart。

5、浏览器输入 https://www.你的域名,进行访问或者终端使用ping命令测试。在这时浏览器会提示需要工信部等部门进行备案,可以参考腾讯云申请教程:https://cloud.tencent.com/product/ba,大概 需要20个工作日的审批。

参考官网:https://cloud.tencent.com/document/product/400/35244

参考博客园:https://www.cnblogs.com/wu-chao/p/9114432.html

###最后是网站备案上线:参考腾讯云官网:https://cloud.tencent.com/product/ba

### 使用supervisor配置:

让supervisor管理uwsgi,可以在uwsgi发生意外的情况下,会自动的重启(按需配置)。

1. `supervisor`的安装:在系统级别的python环境下`sudo apt install supervisor`。

2. 在项目的根目录下创建一个文件叫做`asr_web_supervisor.conf`。内容如下:

    ```python

    # supervisor的程序名字

    [program:mysite]

    # supervisor执行的命令

    command=uwsgi --ini asr_web_uwsgi.ini

    # 项目的目录

    directory = /home/ubuntu/asr_web

    # 开始的时候等待多少秒

    startsecs=0

    # 停止的时候等待多少秒

    stopwaitsecs=0

    # 自动开始

    autostart=true

    # 程序挂了后自动重启

    autorestart=true

    # 输出的log文件

    stdout_logfile=/srv/asr_web/log/supervisord.log

    # 输出的错误文件

    stderr_logfile=/srv/asr_web/log/supervisord.err

    [supervisord]

    # log的级别

    loglevel=info

    # 使用supervisorctl的配置

    [supervisorctl]

    # 使用supervisorctl登录的地址和端口号

    serverurl = http://127.0.0.1:9001

    # 登录supervisorctl的用户名和密码

    username = 用户名

    password = 密码

    [inet_http_server]

    # supervisor的服务器

    port = :9001

    # 用户名和密码

    username = 用户名

    password = 密码

    [rpcinterface:supervisor]

    supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

    ```

然后使用命令`supervisord -c asr_web_supervisor.conf运行就可以了。

以后如果想要启动`uwsgi`,就可以通过命令`supervisorctl -c asr_web_supervisor.conf`进入到管理控制台,然后可以执行以下命令进行管理:

    * status                # 查看状态

    * start program_name    #启动程序

    * restart program_name  #重新启动程序

    * stop program_name    # 关闭程序

    * reload                # 重新加载配置文件

    * quit                  # 退出控制台

你可能感兴趣的:(9、ubuntu下使用uwsgi+nginx+supervisor部署django项目)