网上关于nginx+uwsgi+django搭建的博客很多,但是我在按照前辈们的博客配置的过程中出现了或多或少的错误,所以这里记一篇笔记。主要是配置过程及配置之前需要考虑的一些问题,以及将一些常用的命令或者部分地方自己的理解集合在一片博客中,如果有不正确的地方,希望可以给予更正~~~
这一篇可能略微繁琐,若只需要配置的步骤,可以参考我的另一篇博客。
部署环境与工具
- 腾讯云
- Ubuntu Server 18.04.1 LTS 64位
- Django2.2
- Python3.6.9
- Nginx1.14.0
- Uwsgi2.0.9.11
- FileZilla
部署前的准备:
SSH的管理
关于腾讯云初期使用的准备,建议参考腾讯云官方文档寻找自己的需求。
我这里主要参考了这两篇
管理 SSH 密钥
使用 SSH 登录 Linux 实例
设置腾讯云安全组(参考腾讯云云社区的一篇笔记)
使用filezilla将django文件传到腾讯云服务器
注意,这个教程是windows系统的,mac系统上建议将密钥文件下载,并修改为没有后缀名,放到一个固定不轻易改动的文件夹中用已使用。
使用ssh连接主机
Mac直接在bash中输入**ssh root@你的主机ip ** (这里添加一篇如何登陆的教程)
Windows请下载ssh远程连接工具例如Putty
1 | $ sudo ssh -i "path/to/密钥" ubuntu@49.xxx.xxx.238 |
部署步骤(前期准备)
在我们进行部署之前,最好可以保证我们的ubuntu是刚刚装好的,纯净的。可以选择通过命令“sudo su”切换到root用户,如果使用的是腾讯云的ubuntu用户,通过在之后的命令前添加sudo也可以。(以下命令默认添加)
配置python3.6环境
Ubuntu18.04已经默认安装了python3.6,可使用python3命令查看
安装pip3:
1 | $ sudo apt install python3-pip |
如果这里操作没有立即生效的话,可能需要重新登录服务器,并升级pip
1 | $ pip3 install --upgrade pip |
设置默认版本为python3
如果我们不使用python2做开发的话,这里建议删除python2的版本,或者设置python3为默认版本(也可以设置优先级) 参考:https://blog.csdn.net/OGirassol/article/details/103563616 ubuntu中同时存在python2和python3,如何将python3设置为默认版本
注:如果不修改的话,直接使用python3 manage.py runserver时可以正常启动,但是uwsgi时会报错:
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named ‘encodings’
原因是因为用virtualenv创建虚拟目录时,默认版本为2.7,如果我们使用的python版本为3.x就会出错,而解决办法当然就是生成虚拟目录时指定python的脚本。当然这里可以在创建虚拟环境时指定python3的版本。
防火墙配置
有时候在配置过程中需要关掉防火墙,或者开放某些端口,可通过以下命令关闭防火墙。
1 | systemctl stop firewalld |
我们使用sudo ufw enable命令来开发防火墙 通过sudo ufw status命令查看开启防火墙后的状态为active 说明防火墙开启成功。
安装并配置虚拟环境virtualenv
接下来安装virtualenv和virtualenvwrapper:
1 | $ pip3 install virtualenv |
将以下内容放到最后面
1 | export WORKON_HOME=$HOME/.virtualenvs |
激活环境变量来生效:
1 | $ source ~/.bashrc |
注:1:这里我在执行“ mkvirtualenv django”时出现了错误“mkvirtualenv: command not found”,原因是因为还没有修改环境变量,可以通过先执行之后的代码来完成。这里需要注意“source /.local/bin/virtualenvwrapper.sh”,有的博客教程中是“/usr/local/bin/virtualenvwrapper.sh”,而ubuntu18.04里,通过pip安装virtualenvwrapper得到的virtualenvwrapper.sh被安装在/.local/bin/目录下,所以如果路径错误的话需要更正。
2:修改环境变量的博客可以参考这篇:https://www.cnblogs.com/linga/p/11588223.html
3:之后的一切操作都需要在我们创建的django虚拟环境中运行,可以通过“$ workon django” 进入我们的虚拟环境
安装网站运行环境
进行此操作前,请保证你现在已经处于Django这个虚拟环境中:
1 | $ pip freeze > requirements.txt |
通过第一个命令依赖库会导到于requirements.txt
通过第二个命令可以安装我们的依赖库。如果提醒权限不足,可以在前面添加sudo
安装数据库
这里大家可以安装自己需要的数据库,具体安装教程可以参考其他博客。
测试Django项目能否运行
在安装了数据库之后,要对应的修改settings.py的内容。这里有一个问题,就是之前有一篇博客中说需要在settings.py中将“DEBUG = True”改为“DEBUG = False”,这里特别注意一下,不需要改!!!有的前辈的博客中说明的是为True,且经本人验证True可以运行而False不可以。(这里wsgi.py中选择了settings.py,所以如果您的项目可能不同阶段有不同的设置需求,可以通过自定义mysettings.py,并在wsgi.py中将其选择即可)
接下来我们可以通过使用FileZilla将django项目的代码上传至服务器,并测试运行了。
1 | #进入虚拟环境 |
在你的本机上输入服务器ip:8000测试能否访问,如果能访问则接着往下看(此时static静态资源还没有被代理加载不出来).
但是仅使用python自带的runserver工具运行网站程序,我们接下来安装nginx和uwsgi。
Django项目生产环境配置
首先需要收集静态文件
1 | #收集静态文件 |
在settings.py中,注释掉STATICFILES_DIRS
1 | #STATICFILES_DIRS=[ |
settings.py中,debug改为True:
1 | DEBUG = True |
安装Nginx
1 | $ sudo apt-get install nginx |
如果已经在运行,可以看到nginx占用的端口、进程信息等。
安装完成后,在浏览器中输入你的ip地址,如果看到一个大标题是’Welcome to nginx!’的界面则说明安装完成!
这里粘贴出一些常用的命令:
1 | /etc/init.d/nginx start #启动 |
这里提醒一下,如果启动nginx服务的时候出现了错误:
Job for nginx.service failed because the control process exited with error code.
See “systemctl status nginx.service” and “journalctl -xe” for details.
可以通过这两个命令查看错误,一般可以在终端打印的结果中看到打印的错误,例如“nginx: configuration file /etc/nginx/nginx.conf test failed”可能就是因为配置文件中多写了分号或者配置项的某些值不正确等等,一般可以打印出来并对应更正。例如:
1 | location / { |
这里如果在配置过程中出现了什么问题,可以卸载nginx重装后再进行配置。完全卸载nginx的代码如下:
1 | $ sudo apt-get remove nginx nginx-common # 卸载删除除了配置文件以外的所有文件。 |
安装Uwsgi
安装uwsgi之前我们需要安装python开发包:
1 | $ apt-get install python3.6-dev |
然后再安装uwsgi,安装之前请先退出django这个虚拟环境,我们在公共环境中安装它.
1 | $ pip3 install uwsgi |
安装完之后,我们首先测试uwsgi,在项目主目录下创建test.py文件:
1 | def application(env, start_response): |
在主目录下,通过uwsgi运行该文件:
1 | $ uwsgi --http :8000 --wsgi-file test.py |
由于这里指定的是8000端口,所以打开浏览器,输入xx.xxx.xxx.xx:8000/就可以看到“Hello World”了。
接下来配置Django与uwsgi连接,我们用uwsgi来测试网站是否能成功运行了,分别可以使用下面的命令:
1 | $ uwsgi --http :8000 --file myweb/wsgi.py |
来进行测试(这里的端口可以自己设置,只需访问时记得需改即可)
当然如果有需要可以指定更多的参数:
1 | $ uwsgi --http :8001 --chdir /home/ubuntu/workspace/myweb/ --wsgi-file myweb/wsgi.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191 |
如果能拉起的话,就可以来配置nginx和uwsgi了。
Nginx+uwsgi+Django
接下来,我们就可以将三者结合,来达到预期的效果。
以下是项目所需要的文件。
myweb/
├── manage.py
├── myweb/
│ ├── init.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── myweb_uwsgi.ini
配置uwsgi
由于在我们通过Django创建myweb项目时,在子目录myweb下已经帮我们生成的 wsgi.py文件。所以,我们只需要再创建myweb_uwsgi.ini配置文件即可,当然,uwsgi支持多种类型的配置文件,如xml,ini等。此处,使用ini类型的配置。这里ini文件创建在项目的主目录下。(可以附上一张tree图)
1 | # myweb_uwsgi.ini file |
这里的配置,其实等同于在uwsgi的安装过程中使用的wsgi命令,只不过在上文中是通过在命令中添加参数的形式,而这里是将其文件化了。
接下来,就可以在命令行中切换到myweb的项目主目录下,通过uwsgi命令通过读取myweb_uwsgi.ini文件启动项目。
注意查看uwsgi的启动信息,如果有错,就要检查配置文件的参数是否设置有误。
这里记一下uwsgi的配置过程中可能常使用到的命令:
1 | #### 查看uwsgi进程信息: |
如果您不是一口气配置完的,可能中间会重新启动服务,忘记了使用 $ workon django 命令进入虚拟环境,可能会导致以下错误:
uwsgi: option ‘–http’ is ambiguous; possibilities: ‘–http-socket’ ‘–http-socket-modifier1’ ‘–http-socket-modifier2’ ‘–https-socket’ ‘–https-socket-modifier1’ ‘–https-socket-modifier2’
getopt_long() error
配置nginx
这里配置nginx.conf,其实是在“/etc/nginx/sites-enabled/mysite.conf” 目录下创建conf文件,所以具体的源文件在哪里都可以,只需要链接到就可以。
sites_availables 指的是所有 nginx 站点;
sites_enabled 指的是当前开启的 nginx 站点;
那这两个文件夹如何配合使用呢?
当需要增加网站时,在 sites_availables 里增加对应的配置文件,当需要启用这个网站的时候,在 sites_enabled 创建对应配置文件的软连接即可:
这里我们将其创建在myweb项目主目录下,通过以下命令进行链接就可以了。
1 | $ sudo ln -s /home/ubuntu/workspace/myweb/mysite_nginx.conf /etc/nginx/sites-enabled/mysite_nginx.conf |
mysite_nginx.conf文件的具体内容如下
1 | # the upstream component nginx needs to connect to |
另外我们还需要将启动nginx的用户改为root,要不然会出现403 forbidden的错误。使用sudo模式打开/etc/nginx/nginx.conf文件,将第一行中user后面的用户改为root即可。
其实在这里,通过查看配置文件我们可以发现nginx之所以与uwsgi产生关联,是通过以下两行代码实现的
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000;include 必须指定为uwsgi_params;而uwsgi_pass指的本机IP的端口与myweb_uwsgi.ini配置文件中的必须一致
配置结束之后重启nginx服务
1 | $ service nginx restart |
或者干脆直接全部关闭重启
1 | (django) ubuntu@VM-0-10-ubuntu:~/workspace/myweb$ sudo pkill -f nginx -9 |
这时,在浏览器中访问 http://ip:port/ 可以看到,通过此ip和端口的指向,请求会首先到达nginx,如果在此过程执行一些请求,我们可以发现,最终这些请求会转到uwsgi来进行处理。
如果想了解更多关于nginx部署的教程,可以参考Nginx安装部署与测试
配置HTTPS
参考博客:https://zhuanlan.zhihu.com/p/63038112
暂时还没到这个进度,等到配置之后再来更新。
最后再写一下常用命令:
1 | /etc/init.d/nginx start #启动 |
以上是在Ubuntu18.04上的部署
如果想在Ubuntu16.04部署,大致步骤是一模一样的,只是Ubuntu16.04中预装了python2没有python3,需要自行安装python3和pip3,仅仅多了此步骤而已!
网上的博客比较乱,有的太复杂无法清楚具体的核心,有些过于简单无法直接参考,希望自己在配置过程中整理出来的这篇文章能够帮到你!
5、参考博客及官方文档
[1] https://www.cnblogs.com/zhaoyingjie/p/6840616.html
[2] https://blog.csdn.net/weixin_33943347/article/details/92758875
[3] https://www.cnblogs.com/chenych/p/11075070.html
[4] https://www.jqhtml.com/46328.html
[5] https://www.liyuankun.cn/article/18/
[6] https://zhuanlan.zhihu.com/p/63038112
[7] https://blog.csdn.net/breavo_raw/article/details/82665978