DJANGO-天天生鲜项目从0到1-015-部署-uWSGI+Nginx
本项目基于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的更多相关文章
- django天天生鲜项目
.后台admin管理天天生鲜商品信息 models里 from django.db import modelsfrom tinymce.models import HTMLField #需要pip安装 ...
- DJANGO-天天生鲜项目从0到1-007-首页静态化与缓存
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...
- python 天天生鲜项目
python 天天生鲜项目 django版:https://github.com/Ivy-1996/fresh flask版:https://github.com/Ivy-1996/flask-fre ...
- Django 部署 uwsgi + nginx + supervisor
Django 部署 uwsgi + nginx + supervisor https://hacpai.com/article/1460607620615?p=1&m=0 zonghua • ...
- Django之天天生鲜项目
准备工作 1.配置settings.py内置文件 注意: AUTH_USER_MODEL配置参数要在第一次迁移数据库之前配置,否则可能django的认证系统工作不正常 2.创建应用 3.配置主路由 一 ...
- DJANGO-天天生鲜项目从0到1-012-订单-用户订单页面
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...
- DJANGO-天天生鲜项目从0到1-011-订单-订单提交和创建
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...
- DJANGO-天天生鲜项目从0到1-010-购物车-购物车操作页面(勾选+删改)
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...
- DJANGO-天天生鲜项目从0到1-009-购物车-Ajax实现添加至购物车功能
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...
- DJANGO-天天生鲜项目从0到1-009-搜索功能实现(django-haystack+whoosh+jieba)
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...
随机推荐
- Hibenate面试
5. 对比总结 返回值: get()返回的是查询出来的实体对象,而load()查询出来的是一个目标实体的代理对象. 查询时机: get()在调用的时候就立即发出SQL语句查询,而load()在访问非I ...
- 多线程高并发编程(12) -- 阻塞算法实现ArrayBlockingQueue源码分析(1)
一.前言 前文探究了非阻塞算法的实现ConcurrentLinkedQueue安全队列,也说明了阻塞算法实现的两种方式,使用一把锁(出队和入队同一把锁ArrayBlockingQueue)和两把锁(出 ...
- springboot项目打war包发布到外置tomcat
第一步:修改pom.xml 1. <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> ...
- Syntax error, insert "}" to complete MethodBody
jsp中代码在Eclipse中打开正常,导入项目导入MyEclipse后显示如下异常: Syntax error, insert "}" to complete MethodBod ...
- linux根据进程查端口,根据端口查进程
[root@test_environment src]# netstat -tnllup 能显示对应端口和进程 Active Internet connections (only servers) ...
- python字符串与文本操作(一)
1.一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定的 #string 对象的split()方法只适应于非常简单的字符串分割情形,它并不允许有 多个分隔符或者是分隔符周围不确定的空 ...
- 状压DP之愤怒的小鸟
题目 传送们P2831 题目较长,不加以赘述 直接步入正题 首先是数学知识,我们可以先根据给出的任意两只猪构建相应的抛物线,同时再构建完之后应判断抛物线的合法性(比如a小于0啊,等等),公式推演就不在 ...
- 从此不怕Synchronized锁
Synchronized的使用 Synchronized是通过监视器保证线程同步从而保证线程安全.但是Synchronized锁可以锁对象和锁类,并会产生不同的效果,通过下面的案例彻底理解Sync ...
- URL编码与二次encodeURI
转自:http://foryougeljh.iteye.com/blog/1456706 一般来说,URL只能使用英文字母.阿拉伯数字和某些标点符号,不能使用其他文字和符号.比如,世界上有英文字母的网 ...
- 深入Vue-router最佳实践
前言 最近再刷Vue周边生态的官方文档,因为之前的学习都是看视频配合着文档,但主要还是通过视频学习,所以很多知识点都没有了解,至从上次刷了Vuex的官方文档就体会到了通读文档的好处,学习一门技术最好的 ...