本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习

https://www.bilibili.com/video/BV1vt41147K8?p=1

使用uWSGI做为web服务器

  • django自带的web服务器是通过python manager.py runserver实现,但是在正式部署时,不会使用这种方式运行项目,而是使用uWSGI
  • WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是为 Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的一种简单而通用的接口。
  • 很多框架都自带了 WSGI server ,比如 Flask,webpy,Django、CherryPy等等。当然性能都不好,自带的 web server 更多的是测试用途,发布时则使用生产环境的 WSGI server或者是联合 nginx 做 uwsgi
  • uwsgi和WSGI一样是一种通信协议。
  • uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。

uWSGI安装

pip install uwsgi

django配置uWSGI

在项目根目录新建一个uwsgi.ini文件,内容如下:

[uwsgi]
#使用nginx连接时使用
#socket=localhost:8080
#直接做web服务器使用 python manager.py runserver ip:port
http=192.168.183.129:8080
#项目目录
chdir=/home/gong/study/projects/dailyfresh
#项目中wsgi.py文件的目录,相对于项目目录
wsgi-file=dailyfresh/wsgi.py
#指定启动的工作进程数
processes=4
#指定进程中的线程数
threads=2
master=True
#保存启动之后主进程的pid
pidfile=uwsgi.pid
#设置uwsgi后台运行(守护进程)
daemonize=uwsgi.log
#设置虚拟环境信息
virtualenv=/home/gong/.conda/envs/dailyfresh

启动uWSGI

启动:uwsgi –-ini 配置文件路径 例如:

uwsgi –-ini uwsgi.ini

停止:uwsgi --stop uwsgi.pid路径 例如:

uwsgi –-stop uwsgi.pid

启动后发现css样式都没有生效,但是一些图片却是有效的,因为css等静态文件是以/static开头的,django自带的web服务器运行时能够读取到这个项目路径下的static文件,而uWSGI并不能直接读取到,而能显示出来的图片是通过Nginx读取的FastDFS中的文件,因此可以正常显示。这里我们就需要再使用Nginx来读取/static的静态文件,注意这里说的静态文件不是指之前的首页静态页面,是项目路径下的static文件,还包括一些django自带的静态文件。

使用Nginx

因为用户浏览器直接访问uWSGI的话不能正常显示项目目录中的静态文件,因此需要在uWSGI前再添加一台Nginx,让用户访问这台Nginx,这台Nginx处理两件事,一是将正常的访问请求转交给uWSGI,二是处理请求中静态文件

Nginx转交请求给uWSGI

1. 配置uwsgi

将uwsgi.ini中的http改成使用socket,由于Nginx和uWSGI在同一台机器上面,因此这里ip可以直接写成localhost(回环IP),若Nginx和uWSGI不在同一台机器上,那么这里的IP写成uWSGI本机的IP,端口号可以任意给成未使用的端口号

#使用nginx连接时使用
socket=localhost:8080
#直接做web服务器使用 python manager.py runserver ip:port
#http=192.168.183.129:8080

2. 配置Nginx

若用户在浏览器只输入IP或者域名时,不继续输入端口,那么默认访问的就是80端口,因此我们需要在80端口配置,以下配置都在80端口下配置

# 浏览器输入网址默认端口
server {
listen 80;
server_name localhost;
#charset koi8-r;
location / {
# 包含uwsgi的请求参数
include uwsgi_params;
# 转交请求给uwsgi,必须和uwsgi的ini配置文件中IP和PORT一致
# uwsgi_pass localhost:8080;
uwsgi_pass dailyfresh;
}
....
}

Nginx处理静态文件

1. django收集静态文件

这里的静态文件除了/static目录下自定义的静态文件外,还有django自身的一些静态文件

编辑setting.py文件,新增参数STATIC_ROOT,这个参数说明收集静态文件后存放的路径,如:

# 收集的静态文件路径
STATIC_ROOT = '/home/gong/study/projects/www/dailyfresh/static'

运行命令,把项目中所使用的静态文件收集到STATIC_ROOT指定的目录下。

python manager.py collectstatic

2. 配置Nginx提供静态文件

即浏览器访问到/static时,会在下面的路径去找url中访问的资源

        # 指定静态文件访问的目录
location /static {
alias /home/gong/study/projects/www/dailyfresh/static/;
}

这台Nginx除了做以上两件事外,还能将请求转交给其他地址,实现访问之前的静态首页,还能实现负载均衡

Nginx转交请求给其他地址

通过配置实现如果用户直接访问IP地址,则给用户返回之前生成的静态首页,如果用户访问的是ip/index,则返回动态的首页

配置静态首页

# 静态首页服务器
server {
listen 9999;
server_name localhost; location /static {
alias /home/gong/study/projects/dailyfresh/static;
} location / {
root /home/gong/study/projects/dailyfresh/static;
index index.html index.htm;
}
}

等号严格匹配,若直接访问网址时,则通过proxy_pass访问Nginx配置的静态首页

        # 等号严格匹配,直接访问网址时,则访问静态首页
location = / {
# 传递请求给静态首页的nginx
proxy_pass http://localhost:9999;
}

Nginx负载均衡

使用uWSGI服务器时,可以实现同一个项目,运行多个服务器,即实现多开,但是它们处理的时候还是同一时间只会处理一个。

1. 配置uwsgi2.ini

在项目根目录再新建一个名为uwsgi2.ini的文件,内容除了端口号不一样外,其他和uwsgi.ini文件一样

[uwsgi]
#使用nginx连接时使用
socket=localhost:8081
#直接做web服务器使用 python manager.py runserver ip:port
#http=192.168.183.129:8081
#项目目录
chdir=/home/gong/study/projects/dailyfresh
#项目中wsgi.py文件的目录,相对于项目目录
wsgi-file=dailyfresh/wsgi.py
#指定启动的工作进程数
processes=4
#指定进程中的线程数
threads=2
master=True
#保存启动之后主进程的pid
pidfile=uwsgi2.pid
#设置uwsgi后台运行(守护进程)
daemonize=uwsgi2.log
#设置虚拟环境信息
virtualenv=/home/gong/.conda/envs/dailyfresh

然后运行启动命令

uwsgi --ini uwsgi2.ini

这样就能同时开启两台uWSGI服务器

2. ngnix 配置负载均衡

编辑/conf/nginx.conf文件,在server配置的前面(http块下,和server同级)增加upstream配置项。其中的server即对应uwsgi.ini和uwsgi2.ini中的socket值

upstream dailyfresh {
server localhost:8080;
server localhost:8081;
}

然后在80端口下配置的uwsgi_pass改成 uwsgi_pass dailyfresh;

        location / {
# 包含uwsgi的请求参数
include uwsgi_params;
# 转交请求给uwsgi,必须和uwsgi的ini配置文件中IP和PORT一致
# uwsgi_pass localhost:8080;
uwsgi_pass dailyfresh;
}

这样用户在浏览器访问网站时,Nginx会将访问的请求平均分配给这两台uWSGI执行,即使是同一个用户的不同访问请求,也能分配给两台服务器

最终项目部署图

DJANGO-天天生鲜项目从0到1-015-部署-uWSGI+Nginx的更多相关文章

  1. django天天生鲜项目

    .后台admin管理天天生鲜商品信息 models里 from django.db import modelsfrom tinymce.models import HTMLField #需要pip安装 ...

  2. DJANGO-天天生鲜项目从0到1-007-首页静态化与缓存

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  3. python 天天生鲜项目

    python 天天生鲜项目 django版:https://github.com/Ivy-1996/fresh flask版:https://github.com/Ivy-1996/flask-fre ...

  4. Django 部署 uwsgi + nginx + supervisor

    Django 部署 uwsgi + nginx + supervisor https://hacpai.com/article/1460607620615?p=1&m=0 zonghua • ...

  5. Django之天天生鲜项目

    准备工作 1.配置settings.py内置文件 注意: AUTH_USER_MODEL配置参数要在第一次迁移数据库之前配置,否则可能django的认证系统工作不正常 2.创建应用 3.配置主路由 一 ...

  6. DJANGO-天天生鲜项目从0到1-012-订单-用户订单页面

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  7. DJANGO-天天生鲜项目从0到1-011-订单-订单提交和创建

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  8. DJANGO-天天生鲜项目从0到1-010-购物车-购物车操作页面(勾选+删改)

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  9. DJANGO-天天生鲜项目从0到1-009-购物车-Ajax实现添加至购物车功能

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  10. DJANGO-天天生鲜项目从0到1-009-搜索功能实现(django-haystack+whoosh+jieba)

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

随机推荐

  1. Linux hostname主机名配置文件/etc/hosts详解

    这篇文章为大家介绍linux hostname主机名配置文件/etc/hosts,包括主机名的用途.配置文件的操作方法等,有需要的朋友,可以参考下 1.什么是Linux主机名 无论在局域网还是INTE ...

  2. 2020-06-30 pol实现execl导入导出

    1.导入依赖 <!-- 解析表格 --> <dependency> <groupId>org.apache.poi</groupId> <arti ...

  3. Vue父子之间的值传递

    将通过两个input框实现父子之间的值传递作为演示,效果图 先注册父子各一个组件,代码如下 <div id="app"> <parent></pare ...

  4. 洛谷 P1194 【买礼物】

    这道题其实就是转化一个模型就可以了. 买了一个另外一个又优惠,其实就相当于在优惠的时候连一条边,因为不可能多买,所以就是建一棵最小生成树.最后因为肯定买了一件物品,要加上最初的单价. 代码: #inc ...

  5. 简单几步让CentOS系统时间同步

    在使用CentOS系统的时候,我们可能会遇到时间不准的问题,那我们如何解决这个我问题呢,下面就来教大家一个CentOS系统时间同步的方法,希望大家可以解决自己所存在的疑问. CentOS系统时间同步的 ...

  6. Centos 6.4 安装KSnapshot 和gimp截图工具

    一. # wget http://www.ibiblio.org/pub/Linux/X11/xutils/ksnapshot-0.2.7.tar.gz # tar -zxvf ksnapshot-0 ...

  7. 如何提高CSS性能?CSS优化、提高性能提升总汇

    如何提高CSS性能,根据页面的加载性能和CSS代码性能,主要表现为: 加载性能 (主要是从减少文件体积,减少阻塞加载,提高并发方面入手),选择器性能,渲染性能,可维护性.   1.尽量将样式写在单独的 ...

  8. 关于gulp复制文件时把整个目录结构都复制的问题解决

    有这么个场景,在开发时分模块开发,但是发布时不一定将按模块分布,比如,为了便于开发,图片是按照模块存放的,但是发布时只是放在images文件夹下,此时就需要用到本文中提到的插件gulp-flatten ...

  9. OldTrafford after 102 days

    THE RED GO MARCHING ON   One Team One Love Through the highs and the lows   One hundred and two long ...

  10. java 包装类的使用

    1.为什么要有包装类(或封装类) 为了使基本数据类型的变量具有类的特征,引入包装类. 2.基本数据类型与对应的包装类: 3.需要掌握的类型间的转换:(基本数据类型.包装类.String) 应用场景举例 ...