博主最近需要搭建自己的网站,Django + Nginx + uWSG 三连击可解决问题,以此记录。同时本文也将介绍搭建过程中遇到的坑。博主属于零基础首次搭建,Django、Nginx、uWSG均属于首次接触,文档略有小白望见谅。
废话不多说!
前提:博主的工作环境为macos和ubuntu,分别搭建。
一. 安装三件套
Nginx是相当好用的web服务,非常好用,由于面对不同系统可能安装方式不同,所以请自行查找如何在自己的系统中安装nginx。
Django是基于python的开源web应用框架,选取理由,所熟悉的语言中,python略战优势,没有所谓的各种对比(^~^)
安装命令如下,由于是python2,所以django最多可能只支持到1.11,python3则没有这种顾虑,安装最新即可。
$ pip2.7 install Django==1.11
uWSG也是一种web服务器,他是web服务器与web应用通信的一种规范。
安装命令如下
$ pip2.7 install uwsgi
PS:这里使用的是pip2.7 纯属个人行为,因为博主安装了python2和python3,在此仅是为了做环境区分。
二.Django时间
1 在根目录下创建一个默认网站(注意实创建目录下,之后的配置会用到)
$ cd /
$ django-admin startproject web
django创建项目后将生成一系列的文件,目录如下:
/web
├── db.sqlite3
├── manage.py
├── readme.txt
├── uwsgi9090.ini
├── uwsgi9090.log
├── uwsgi9090.pid
├── web
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── search.py
│ ├── search.pyc
│ ├── settings.py
│ ├── settings.pyc
│ ├── urls.py
│ ├── urls.pyc
│ ├── working_dir
│ ├── wsgi.py
│ └── wsgi.pyc
└── www
└── search_form.html
2 directories, 18 files
2运行如下命令,并在浏览器中键入“127.0.0.1:8000”测试是否可以正常使用
$ cd /web/
$ python manage.py runserver 0.0.0.0:8000
命令中的0.0.0.0表示接受任意地址的访问,而一旦有uwsgi连接后,会出现访问被拒绝的问题,所以需要修改/web/web/settings.py文件
将其中的"ALLOWED_HOSTS = []" 改为 "ALLOWED_HOSTS = [‘*’]",‘*’表示接受任意地址访问,不知道出现拒绝访问时,还是否有其他方法,若有麻烦分享一下。
PS:(1). 以runserver的形式测试时,web下的文件(python和html)可随意修改,server会动态加载,目测保存文件时触发加载
(2).以uswgi形式运行时,则是一次性加载,不检测是否有更新,因此每次对python文件修改后,都需要重启uwsgi,html则不需要。
三.uwsgi时间
1.创建及修改配置文件
uwsgi需要用到三个文件,后缀分别定义为:ini,log,pid进行区分(个人行为), 文件名随意,自己认识就好,
ini为uwsgi的配置文件,log为uwsgi的log输出文件,方便调试追踪,pid文件中保存uwsgi的进程ID,方便重启。
$ cd /web/
$ touch uwsgi9090.ini uwsgi9090.pid uwsgi9090.log
ini文件配置如下
[uwsgi]
socket = 127.0.0.1:9090
# 网站主目录
chdir = /web
# 指定通信句柄
module = web.wsgi:application
#主进程
master = true
#多站模式
vhost = true
#多站模式时不设置入口模块和文件
no-site = true
#子进程数
workers = 2
reload-mercy = 10
#退出、重启时清理文件
vacuum = true
max-requests = 1000
limit-as = 512
buffer-size = 30000
#pid文件,用于下面的脚本启动、停止该进程
pidfile = /web/uwsgi9090.pid
daemonize = /web/uwsgi9090.log
配置文件中指定了django创建的网站的绝对路径、通信句柄(module)、用于重启的pidfile、用于调试的deimonize。
module是一个重要属性,它与chdir共同决定了,通信句柄,没有它,将无法完成通信。
django创建项目时创建了一系列的文件,其中有/web/web/wsgi.py,文件中还有一个application变量,
那么"module = web.wsgi:application"的写法就很好理解了,'.'表示目录的层级关系,与linux系统中的'/'作用相同、':'表示提取文件中的句柄、'application'为句柄名。
2.启动uwsgi服务
$ cd /web/
$ uwsgi --ini uwsgi9090.ini --enable-threads
--ini xxx 指定xxx为uwsgi的配置文件
--enable-threads 表示打开python的多线程支持
其他参数自行查找,https://uwsgi-docs.readthedocs.io/en/latest/ 这个网站不错,应该会有很大帮助。
启动后查看一下uwsgi9090.log文件,看看是否正常启动。
博主这里出现了无法加载django模块的错误,错误如下:
ImportError: No module named django.core.wsgi
这里很让人苦恼,调试时没有出现这种错误,但是通过uwsgi运行会出现该问题,原因未知!
解决办法如下:
在/web/web/wsgi.py文件中添加如下代码,位置在import django模块之前即可:
import sys
# MacOS
sys.path.append('/usr/local/lib/python2.7/site-packages')
# Ubuntu
sys.path.append('/usr/local/lib/python2.7/dist-packages')
代码中添加django的安装路径,MacOS和Ubuntu略有不同,根据各自系统情况,选用一个就好,贪多可能会误事哟。当然也有可能不是上面任何一个,模块一般安装在/usr/目录下,自查命令如下:
$ sudo find /usr/ -name django -type d
PS:路径是django的安装目录,不要直接将find结果填进去;结果可能有多个,一眼就能看出选那个(^_^)
经过一番修改,uwsgi应该正常启动了。
四.Nginx时间
nginx是一个高性能web服务器,高效、安全、不容易crash
1. 配置nginx
直接修改nginx.conf文件即可,默认配置文件已经有了,可正常使用,只需修改其中某部分
这里将“location / {}”修改替换为个人网页,不再访问nginx提供的网页。配置如下:
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9090;
}
include不再赘述,uwsgi_pass对应字段必须为uwsgi9090.ini中的socket字段,否则通信将无法完成。
猜测是nginx和uwsgi共同协商的通信地址和端口号。
2.启动/重启nginx服务
$ sudo /etc/init.d/nginx restart // Ubuntu
$ nginx -s reload // MacOS
同样的MaxOS和Ubuntu命令不同,自行决策。
到这里,该启动的服务都起来了,浏览器上测试一波吧。。。。
文章基于零基础,博主水平有限,如有错误,望指正。