Django + Nginx + uWSG 搭建自己的网站

    博主最近需要搭建自己的网站,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,在此仅是为了做环境区分。

扫描二维码关注公众号,回复: 6169321 查看本文章

    二.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命令不同,自行决策。

到这里,该启动的服务都起来了,浏览器上测试一波吧。。。。

文章基于零基础,博主水平有限,如有错误,望指正。

猜你喜欢

转载自blog.csdn.net/xy_kok/article/details/89475168