uwsgi+nginx项目部署
off999 2025-01-06 14:48 23 浏览 0 评论
部署Django项目
Django+uWSGI+nginx 部署
- django 一个pyhton的开源web框架。
- uWSGI 一个基于自有的uwsgi协议、WSGI协议和http服务协议的web网关
- nginx 常用的代理服务器WSGI:一种实现python解析的通用接口标准/协议,是一种通用的接口标准或者接口协议,实现了python web程序与服务器之间交互的通用性。
利用它,web.py或bottle或者django等等的python web开发框架,就可以轻松地部署在不同的web server上了;uwsgi:同WSGI一样是一种通信协议
uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型,它与WSGI相比是两样东西。uWSGI :一种python web server或称为Server/Gateway
uWSGI类似tornadoweb或者flup,是一种python web server,uWSGI是实现了uwsgi和WSGI两种协议的Web服务器,负责响应python 的web请求。
因为apache、nginx等,它们自己都没有解析动态语言如php的功能,而是分派给其他模块来做,比如apache就可以说内置了php模块,让人感觉好像apache就支持php一样。
uWSGI实现了wsgi协议、uwsgi协议、http等协议。 Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
项目流程
首先客户端请求服务资源,
nginx作为直接对外的服务接口,接收到客户端发送过来的http请求,会解包、分析,
如果是静态文件请求就根据nginx配置的静态文件目录,返回请求的资源,
如果是动态的请求,nginx就通过配置文件,将请求传递给uWSGI;uWSGI 将接收到的包进行处理,并转发给wsgi,
wsgi根据请求调用django工程的某个文件或函数,处理完后django将返回值交给wsgi,
wsgi将返回值进行打包,转发给uWSGI,
uWSGI接收后转发给nginx,nginx最终将返回值返回给客户端(如浏览器)。
*注:不同的组件之间传递信息涉及到数据格式和协议的转换
? 作用:
- 第一级的nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程;
- 在nginx上加上安全性或其他的限制,可以达到保护程序的作用;
- uWSGI本身是内网接口,开启多个work和processes可能也不够用,而nginx可以代理多台uWSGI完成uWSGI的负载均衡;
- django在debug=False下对静态文件的处理能力不是很好,而用nginx来处理更加高效。
安装与配置
- 创建项目运行的虚拟环境virtualenv env --python=python3.6 pip install -r requirements.txt #安装django运行环境
- 运行开发服务器测试 cd project # 进入项目 project 目录 python manage.py runserver 运行开发服务器测试,确保开发服务器下能正常打开网站。
- 安装uWSGI # 在普通用户下安装 sudo apt install libpython3.6-dev # 虚拟环境中 pip install uwsgi
- 测试uWSGI: 新建文件test.py,写入以下内容 def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return "Hello World"
- 运行 # 0.0.0.0可以省略 sudo uwsgi --http 0.0.0.0:8000 --wsgi-file test.py --processes 4 --threads 3 如果提示端口已经被占用,这时可以把相关的进程 kill 掉。 probably another instance of uWSGI is running on the same address (:8002). bind(): Address already in use [core/socket.c line 764] 按照端口进行查询进程 lsof -i :8002 可以查出: COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME uwsgi 2208 tu 4u IPv4 0x53492abadb5c9659 0t0 TCP *:teradataordbms (LISTEN) uwsgi 2209 tu 4u IPv4 0x53492abadb5c9659 0t0 TCP *:teradataordbms (LISTEN) 这时根据 PID 可以用下面的命令 kill 掉相关程序:
sudo kill?-9?2208?2209- 运行django项目 # --chdir 项目目录 --home 虚拟环境目录 project.wsgi 指的是 project/wsgi.py 文件 uwsgi --http :8000 --chdir=/path/to/project --home=/path/to/env --module project.wsgi
- 配置文件运行 上面这样使用一行命令太长了,我们使用 ini 配置文件来搞定,比如项目在 /home/ray/project 这个位置,在其中新建一个 uwsgi.ini 全路径为 /home/ray/project/uwsgi.ini [uwsgi] #socket 为上线使用,http为直接作为服务器使用。 socket = 127.0.0.1:8080 #ip和端口号可以改 http = 127.0.0.1:8000 #项目目录 chdir=/home/ray/project module=project.wsgi #虚拟环境目录 #home = home/ray/MxOnline/mxonlineEnv master = true processes=4 threads=2 # 下面的参数不一定要加 # pidfile=uwsgi.pid uwsgi.pid 和uwsgi.log会在启动uwsgi时自动生成在项目目录下。 # daemonize=uswgi.log # max-requests=2000 # chmod-socket=664 # vacuum=true# uwsgi启动 uwsgi --ini uwsgi.ini #uwsgi 停止 uwsgi --stop uwsgi.pid
- 安装nginx,在普通用户下安装。 # 安装 sudo apt install nginx #重载 sudo /etc/init.d/nginx reload sudo nginx -s reload # 启动 sudo /etc/init.d/nginx start # 停止 sudo /etc/init.d/nginx stop # 重启 sudo /etc/init.d/nginx restart #查看nginx是否启动 ps -ef | grep nginx root 24956 1 0 19:41 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx nobody 24957 24956 0 19:41 ? 00:00:00 nginx: worker process root 24959 10533 0 19:41 pts/0 00:00:00 grep --color=auto nginx
- 配置 nginx ##### sites-enable 和 sites-available These directories are used to define configurations for your websites. Files are generally created in the "sites-available" directory, and thensymbolically linked to the "sites-enabled" directory when they are ready to go live. ? 都是在nginx.conf作修改,因为nginx.conf include指令已经包括了sites-enabled的内容,在site-enabled作修改就相当于在nginx.conf作修改,可维护性高。include /etc/nginx/conf.d/*.conf;include /etc/nginx/sites-enabled/*;ites-available是存放当前的server配置, 在这里修改。sites-enabled是激活并使用的server配置(从sites_available的文件创建快捷方式到sites-enabled)新建一个网站 test
# 不用sudo没有权限修改
sudo vim /etc/nginx/sites-available/test.conf #配置负载均衡
# upstream ray {
# server 127.0.0.1:8000; # for a web port socket
#}
server {
listen 80;
server_name www.helloray.cn;#域名或者ip地址
charset utf-8;
# Django 的static和 media等静态资源交给Nginx处理
location /static {
# 路径必须和STATIC_ROOT一样
alias /var/www/myApp/static/;
}
location /media {
#项目下的media路径
alias /var/www/myApp/media/;
}
location /{
# 必须和uwsgi.ini中socket一样,配置了upstream可以将uwsgi_pass配置为:http:// + upstream名称,即“http://ray”.
uwsgi_pass 127.0.0.1:8080;
#uwsgi_pass http://ray;
include uwsgi_params;
}
}激活网站:建立软链接
sudo ln -s?/etc/nginx/sites-available/test.conf?/etc/nginx/sites-enabled/test.confnginx创建静态文件目录,并更改权限
sudo mkdir -vp /var/www/myApp/static/
sudo chmod 777 /var/www/myApp/static/在项目下setting.py 文件中
STATIC_URL = 'static'
STATIC_ROOT = '/var/www/myApp/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'),
]
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media')在项目目录下迁移静态文件
python manage.py collectstaticDjango中settings.py中的五个设置参数的一些故事:
1、MEDIA_ROOT与MEDIA_URL
事实上MEDIA_ROOT和MEDIA_URL代表的是用户上传后的文件一般保存的地方。我的理解是,可变文件的文件夹。
与这两个参数有联系的,是在Django的FileField和ImageField这样的Model类中,有upload_to参数可选。当upload_to设置相关的地址后,如:upload_to="username";文件上传后将自动保存到 os.path.join(MEDIA_ROOT, upload_to)。
而MEDIA_URL,,则代表用户通过URL来访问这个本地地址的URL。如本机http://127.0.0.1/, MEDIA_URL设置为"/site_media/",那么通过 http://127.0.0.1/site_media/*** 就可以访问相关的上传图片或者其他资源。
2、STATIC_ROOT与STATIC_URL
STATIC_ROOT和STATIC_URL则是网站中,用于网站显示的静态图片、CSS、JS等文件的保存地址。我的理解是,运行中不会再变文件的文件夹(即不会删除或者新增)
2.1 STATIC_URL
同MEDIA_URL类似;STATIC_URL为"/static/"时候,通过http://127.0.0.1/static/***就可以访问相关的静态文件了。
2.2 STATIC_ROOT
STATIC_ROOT是一个比较特殊的文件夹。这是区别Django的开发模式和部署模式下最大的地方了。
通常我们在开发模式下,可以在我们所在的project下建立相应的app, 然后每个app下都建立相应的static文件夹。在开发模式下(Debug=True),Django将为我们自动查找这些静态文件(每个app)并在网页上显示出来。然而,在部署模式下,Django认为这些工作交由web服务器来运行会更有效率。
因此,在部署时,我们需要运行一下python manage.py collectstatic 这个命令。这个命令将会把每个app里的static目录下的文件copy到STATIC_ROOT这个文件夹下,这时候如果在部署模式下(Debug=False),网页中相关的,如: http://127.0.0.1/static/*** 的访问,将不会访问Django下各个App中的static,而是STATIC_ROOT中所指定的文件夹。
3、Debug=False后,为何无法访问图片和js等文件了?
其实这个问题,是在于web服务器没有对STATIC_ROOT以及MEDIA_ROOT这两个文件夹进行映射所导致的。
以apache为例,假定:
STATIC_ROOT="/home/user/static/"
STATIC_URL="/static/"
MEDIA_ROOT="/home/user/media/"
MEDIA_URL="/media/"
那么可以在apache的配置文件中,增加以下:
<Location "/static/">
Order deny,allow
Allow from all
Satisfy Any
</Location>
Alias /static/ "/home/user/static"
<Location "/media/">
Order deny,allow
Allow from all
Satisfy Any
</Location>
Alias /media/ "/home/user/media/"
4、STATICFILES_DIRS:和TEMPLATE_DIRS的含义差不多,就是除了各个app的static目录以外还需要管理的静态文件,添加到这里的文件会在collectstatic时 copy到STATIC_ROOT中负载均衡的设置
网站的访问量越来越大,服务器的服务模式也得进行相应的升级,比如分离出数据库服务器、分离出图片作为单独服务,这些是简单的数据的负载均衡,将压力分散到不同的机器上。有时候来自web前端的压力,也能让人十分头痛。怎样将同一个域名的访问分散到两台或更多的机器上呢?这其实就是另一种负载均衡了,nginx自身就可以做到,只需要做个简单的配置就行。
nginx不单可以作为强大的web服务器,也可以作为一个反向代理服务器,而且nginx还可以按照调度规则实现动态、静态页面的分离,可以按照轮询、ip哈希、URL哈希、权重等多种方式对后端服务器做负载均衡,同时还支持后端服务器的健康检查。
nginx 的 upstream目前支持 4 种方式的分配
轮询:将请求依次轮询发给每个服务器,如果后端服务器down掉,能自动剔除。
最少链接:将请求发送给持有最少活动链接的服务器。
ip哈希:通过ip的哈希函数结果决定请求发送给哪个服务器。这样每个访客固定访问一个后端服务器,可以解决session的问题。
权重:服务器的权重越高,处理请求的概率越大。用于后端服务器性能不均的情况。
轮询负载均衡
在nginx.conf配置文件中添加如下配置,此配置有三台服务器提供支付服务。
- 缺省配置就是轮询策略;
- nginx负载均衡支持http和https协议,只需要修改 proxy_pass后面的协议即可;nginx支持FastCGI, uwsgi, SCGI,memcached的负载均衡,只需将 proxy_pass改为uwsgi_pass, fastcgi_pass, scgi_pass,memcached_pass即可。
- 此策略适合服务器配置相当,无状态且短平快的服务使用。
http {
upstream CashServers {
server CashServers1.com;
server CashServers2.com;
server CashServers3.com;
}
server {
listen 80;
location / {
proxy_pass http://CashServers;
}
}
}最少链接负载均衡
- 最少链接负载均衡通过least_conn指令定义;
- 此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况;
http {
upstream CashServers {
least_conn;
server CashServers1.com;
server CashServers2.com;
server CashServers3.com;
}
server {
listen 80;
location / {
proxy_pass http://CashServers;
}
}
}ip哈希负载均衡
- ip哈希负载均衡使用ip_hash指令定义;
- nginx使用请求客户端的ip地址进行哈希计算,确保使用同一个服务器响应请求;
- 此策略适合有状态服务,比如session;
http {
upstream CashServers {
ip_hash;
server CashServers1.com;
server CashServers2.com;
server CashServers3.com;
}
server {
listen 80;
location / {
proxy_pass http://CashServers;
}
}
}权重负载均衡
- 权重负载均衡需要使用weight指令定义;
- 权重越高分配到需要处理的请求越多;
- 此策略可以与最少链接负载和ip哈希策略结合使用;
- 此策略比较适合服务器的硬件配置差别比较大的情况;
http {
upstream CashServers {
server CashServers1.com weight=3;
server CashServers2.com weight=2;
server CashServers3.com weight=1;
}
server {
listen 80;
location / {
proxy_pass http://CashServers;
}
}
}附录:参数说明
>----------------附录:uwsgi参数说明----------------
>
>- http : 协议类型和端口号
>- processes : 开启的进程数量
>- workers : 开启的进程数量,等同于processes(官网的说法是spawn the specified number ofworkers / processes)
>- chdir : 指定运行目录(chdir to specified directory before apps loading)
>- wsgi-file : 载入wsgi-file(load .wsgi file)
>- stats : 在指定的地址上,开启状态服务(enable the stats server on the specified address)
>- threads : 运行线程。由于GIL的存在,我觉得这个真心没啥用。(run each worker in prethreaded mode with the specified number of threads)
>- master : 允许主进程存在(enable master process)
>- daemonize : 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器(daemonize uWSGI)。实际上最常
> 用的,还是把运行记录输出到一个本地文件上。
>- daemonize : 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器(daemonize uWSGI)。实际上最常
> 用的,还是把运行记录输出到一个本地文件上。
>- vacuum : 当服务器退出的时候自动清理环境,删除unix socket文件和pid文件(try to remove all of the generated file/sockets)
相关推荐
- windowsxp教程(xp系统步骤)
-
如何激活xp系统:1.当我们安装原始XP系统时,我们需要激活它,而我们没有激活码,然后会出现以下现象。2.当出现这种未激活现象时,我们可以在网上下载一个XP激活.exe软件,保存在电脑中,无需安装,然...
- 电脑自动重装系统软件(电脑自动重新安装系统)
-
这个需要看你的电脑是不是品牌机。如果你的电脑是品牌机的话,那么一般都设置了系统的还原镜像,也可以叫做还原点,你只要按照说明书操作,把系统还原就可以了这个时候不需要任何软件,如果你的电脑是组装的话,那么...
- win7激活在哪里输入激活码(win7系统激活在哪输入激活码)
-
1、右键桌面上的计算机选择“属性”打开。 2、在打开窗口最下方显示需要立即激活Windows,点开激活链接。 3、在弹出的激活窗口中,输入win7激活密钥。 4、激活过程将需要一些时间,请稍候...
- pp助手ios安装官网(pp助手ios版官网网址)
-
为了安装苹果手机pp助手,您需要按照以下步骤进行:1.在您的苹果手机上打开Safari浏览器。2.在浏览器中搜索“pp助手”并打开官方网站。3.下载并安装pp助手。4.一旦下载完成,您需要在“设置”中...
- 笔记本电脑cpu温度高(笔记本电脑CPU温度高怎么设置自动降温)
-
1、小心拆开背盖,清理风扇和排风口,肯定风扇叶片都积满灰尘了,排风口都堵死了。2、清理干净后给本子配个空调,外置风扇就可以,35左右,尤其长时间用一定要加装。3、彻底杀毒。有些病毒也会引起高温。估计到...
-
- 关闭windows更新(组策略关闭windows更新)
-
1、点击左下角开始菜单2、接着点击设置3、点击Windows更新,接着点击高级选项4、点击WindowsUpdate,接着在启动类型中选择禁用,最后点击确定即可1.按Win+R打开运行,输入”services.msc“打开服务。2.找到/...
-
2025-12-08 06:03 off999
- 电脑装linux系统教程(电脑如何装linux系统)
-
1.选择“中文(简体)”,然后点击“安装Ubuntu”。2.点击“继续”。3.然后点击“现在安装”。4.选择地址的时区,然后点击“继续”。5.选择“汉语”,然后点击“继续”。6.输入用户的名字。7.设...
- 文件恢复助手免费(文件恢复助手破解版)
-
文件传输助手删除的信息是不能再进行找回的。查看文件传输助手信息记录的具体操作步骤如下1、首先在手机上点击打开微信应用程序,然后在此应用程序的页面上点击右上角的放大镜图案。2、接着在此页面的搜索栏内输入...
-
- 智能拼音输入法打字(使用智能拼音输入法)
-
要想拼音快速打字,首先你得下载一个适合自己的输入法软件,比如讯飞输入法。每一个输入法软件都带有自动“存储记忆”功能,当你频道输入三次以上,下一次直接就打拼音首字母就可以了。比如:wochifanla。下次打首字母:wcfl。这样就可以...
-
2025-12-08 04:51 off999
- windows系统xp下载(windows系统xp下载官网)
-
下载地方很多的哦,可以安装大番茄一键重装系统,大白菜一键重装系统等重装软件,还可以到系统之家官网下载。也可以买U盘,用U盘进行安装。附:系统之家链接:http://www.xitongzhi...
-
- sd卡怎样格式化(sd卡怎么格式化为内部存储)
-
打开手机设置,点击运存与存储空间。点击格式化SD卡。点击底部的格式化SD卡,等待格式化完成。内存卡怎么格式化1、首先需要将内存卡插在读卡器上,然后插在电脑的USB接口。、2、在电脑上打开此电脑,可以看到读取了内存卡。3、右键点击内存卡,选择...
-
2025-12-08 03:03 off999
- 手机网速太慢了(手机怎么显示网速)
-
1、首先查看手机当前网络情况,在上方信号烂边上的显示,是否为4G,若是3G或者2G(E),根据手机制式设置开启4G网络,同时需要SIM卡也支持哦。开启4G后,上网速度明显提升。2、APN设置:有些网站...
- 电脑摄像头驱动异常怎么办(电脑摄像头驱动异常怎么办啊)
-
1.开始菜单打开或者双击桌面图标打开360驱动大师2.点击全面诊断。3.等待诊断完成,找到需要修复的,点击修复即可。4.点击驱动安装,可以找到可更新的驱动,点击升级即可。 4、接着我们点击主界面上面...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
使用 python-fire 快速构建 CLI_如何搭建python项目架构
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
