Django学习笔记六:通过nginx+uwsgi部署Django项目

时间:2021-10-29 21:27:56

前言

Nginx:是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势
uwsgi:是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
nginx作为服务器的最前端,它将接受WEB的所有请求,统一管理请求。nginx把所有静态请求自己来处理(这是
nginx的强项,静态文件像我们django博客项目中的static文件夹下面的图片,css,js)。然后nginx将所有的非静
态请求(像显示文章的详细信息,通常这类信息都保存在数据库,因此需要调用数据库获取数据)通过uwsgi传递
给Django,由django来处理,从而完成一次WEB请求
。uwsgi的作用就类似一个桥接器,起到桥梁的作用。

部署环境

阿里云服务器ubuntu14.04 (域名买了还没备案,所以博客暂时是通过ip访问的)
python3.5.2
nginx
uwsgi
django 1.11
markdown

一:安装nginx

打开putty远程控制云服务器:

sudo apt-get install update 更新ubuntu库资源

安装nginx:

sudo apt-get install nginx 

启动nginx(重启):

service nginx restart

访问:http://59.110.155.51(这是我的云服务器的ip)
Django学习笔记六:通过nginx+uwsgi部署Django项目
出现上图,则说明nginx启动成功

二:安装uwsgi

python3 -m pip install uwsgi

测试uwsgi,创建test.py文件(注意:linux创建目录的命令是:mkdir,创建test.py用 “vi test.py”命令)

def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]

它是一个单独的python函数,名字application,这是默认的函数,uwsgi的python加载器将会搜索这个名字
把它部署到htto端口8000
(现在运行uwsgi来启动一个会把请求传递给你的wsgi应用的http服务器):

uwsgi --http :8000 --wsgi-file test.py

若出现:测试1
Django学习笔记六:通过nginx+uwsgi部署Django项目
解决办法:http://www.php.cn/wenda/72164.html
Django学习笔记六:通过nginx+uwsgi部署Django项目
出现上图,则说明测试成功:

三:从github上获取django项目:

git clone https://github.com/xuna123/Django_study1.git

四:安装django和markdwon:

pip3 install django
pip3 install markdown

五:将nginx+uwsgi+django连接

我们实现的目录:
Django学习笔记六:通过nginx+uwsgi部署Django项目
在我们从git拉下来Django_study1项目的时候,在子目录下回自动帮我们生成wsgi.py文件,所以我们只需要创建
myweb_uwsgi.ini配置文件。

# Django-related settings

socket = :8000

# the base directory (full path)
chdir = /root/Django_study1


# Django s wsgi file
module = easyblog.wsgi

# process-related settings
# master
master = true

# maximum number of worker processes
processes = 4

# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true

socket :指定项目执行的端口号
chadir :指定项目的目录
module :可以这么来理解,对于myweb_uwsgi.ini文件来说,与它的平级的有一个easyblog目录,这个目录下有一个wsgi.py文件
master :允许主线程存在(true)
processes:开启的进程数量(这里是开启4个进程)
vacuum :当服务器退出的时候自动清理环境,删除unix socket文件和pid文件
接下来要做的就是修改nginx的配置文件,打开/etc/nginx/sites-available/default文件,删除所有内容,写入下面内容:

server {
listen 8099;
server_name 59.110.155.51
charset UTF-8;
access_log /var/log/nginx/myweb_access.log;
error_log /var/log/nginx/myweb_error.log;

client_max_body_size 75M;

location / {
include uwsgi_params;
uwsgi_pass 59.110.155.51:8000;
uwsgi_read_timeout 2;
}
location /static {
expires 30d;
autoindex on;
add_header Cache-Control private;
alias /Django_study1/blog/static;
}
}
  • listen 指定的是nginx代理uwsgi对外的端口号(这个要自己阿里云服务器的安全组中添加)
  • server_name :服务器的名字,(因为暂时没有域名,就写的ip地址)
  • access_log :用来指定日志文件的存放路径
  • error_log:用来指定错误日志文件的存放路径
  • include uwsgi_params “一般来说,你只需包含uwsgi_params文件 (包含在nginx发行版本中),使用uwsgi_pass指令来设置uWSGI socket的地址。uwsgi_params 文件是啥?
    它就是为了方便,仅此而已!它就是为了方便,仅此而已!为了让你阅读愉快,自uWSGI 1.3起,该文件的内容是:
uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_ADDR $server_addr;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;
  • uwsgi_pass 设置uwsgi服务器的协议和地址,协议可是uwsgi或suwsgi(uwsgi over ssl); 地址可以是ip地址,域名,和可选的端口。
  • uwsgi_read_timeout:指令的含义是如果视图函数处理的时间超时,uwsgi便会关闭连接,这个关闭只是针对Nginx这边的关闭,视图函数还会继续执行,处理完成后,视图函数那边会报IO写入。
    • expires 30d:意味着静态和媒体文件夹中的所有内容将在30天内由浏览器缓存,但不会删除任何内容,您将无需
      重新生成服务器中的任何内容
  • autoindex on;启用目录流量, 默认为off,显示的文件时间为GMT时间。改为on后,显示的文件时间为文件的服务
    器时间
  • add_header Cache-Control private;HTTP协议的Cache -Control指定请求和响应遵循的缓存机制。:
    private(默认): 只能在浏览器中缓存, 只有在第一次请求的时候才访问服务器, 若有max-age, 则缓存期间不访问
    服务器.
  • alias /Django_study1/blog/static; 静态文件的位置(暂时这么理解)
    接下里还有一部修改settings.py里面的ALLOWED_HOSTS增加我们访问的ip
    如下:
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = ['localhost','59.110.155.51']

现在我们重启nginx:

service nginx restart
uwsgi --ini myweb_uwsgi.ini

浏览器方位http://59.110.155.51:8099/
就可以看django博客,现在也可以把链接发给你的小伙伴啦(静态文件貌似没有起作用,导致图片,css和js没有加载出来)
Django学习笔记六:通过nginx+uwsgi部署Django项目