文章将详细介绍如何利用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 <module>
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 # 退出控制台