uWSGI+Nginx+Django安装和配置

2024-06-02 13:58
文章标签 配置 安装 django nginx uwsgi

本文主要是介绍uWSGI+Nginx+Django安装和配置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


WSGI是为python语言定义的通用网关接口,它承担python web框架(django、flask、web.py等)和web服务器(nginx、apache、lighttpd等)之间的中间层。

浏览器                      chrome、firefox、ie等|web服务器                   nginx、apache等|网关接口                    CGI、FastCGI、WSGI等|Python(程序、Web框架)     Django、Flask、Tornado等

python中自带的wsgiref就是一种wsgi接口的标准实现,但是,由于100%使用python实现等原因,导致wsgiref实在过于缓慢,只能用于测试和学习。生产环境中我们需要使用性能更高的服务器,目前常用的wsgi服务器有:uWSGI、Gunicorn、twisted.web。

1 uWSGI的安装

uWSGI是用C语言写的高性能WSGI服务器,安装uWSGI前我们需要安装Python和C编译器(GCC)。推荐使用python包管理器pip安装uWSGI。


#安装最新稳定版
pip install uWSGI
#也可以安装长期支持版(LTS版本)
#pip install http://projects.unbit.it/downloads/uwsgi-lts.tar.gz

在ubuntu下可以使用apt-get来安装


apt-get install uwsgi  

在fedora、redhat、centos下使用yum安装


yum groupinstall "Development Tools"
yum install python  

编译安装,从github下载uwsgi代码,cd到目录下


python uwsgiconfig.py --build

2 测试uwsgi是否安装成功

在终端中输入以下命令查看uwsgi的版本号,如果输出正常,说明uswgi已安装成功


$ uwsgi --version
2.0.11.1

我们可以编写一个简单的wsgi应用来测试uwsgi是否被安装成功,首先创建一个test.py文件:


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

运行uwsgi:


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

参数中,http :8000表示使用http协议,端口号为8000,wigi-file则表示要运行的wsgi应用程序文件。uwsgi运行后打开浏览器,访问http://127.0.0.1:8000/ ,或者是相应服务器地址的8000端口,就可以看到hello world 页面了。

上面的例子中,我们用浏览器直接访问了uwsgi运行的python程序(只有一个入口函数的wsgi测试应用test.py),其访问结构如下所示。

浏览器 <-> uWSGI <-> Python

上述方式运行uWSGI服务的过程中,可以使用CTRL+C即可停止服务,在后续的章节中会讲到自动管理和部署。

3 nginx和django的配置

nginx和django的安装不是本文的重点,故在此略去,只讨论配置部分。在这里,我们要实现的效果如下:

浏览器 <-> nginx <-> uWSGI <-> Django(python)

uwsgi_params 配置文件

uWSGI使用的协议不完全是标准的WSGI协议,我们需要从Github下载uwsgi_paraments配置文件,并将该文件拷贝到项目路径中(例如:/user/home/pengquanxin/projects/mysite1/)。

Nginx服务器配置

接下来,要配置nginx服务器和uWSGI互通,可以使用unix套接字方式和TCP端口方式。在nginx配置文件夹(/etc/naginx/site-enabled 或 /usr/local/etc/nginx/sites-enabled)中新建网站的配置文件mystie_nginx.conf,输入以下内容:


# mysite_nginx.conf# nginx需要连接的上游
upstream django {server unix:///path/to/your/mysite/mysite.sock; # 使用unix套接字#server 127.0.0.1:8001; # 使用TCP端口请注释上一行,并取消本行注释,这里的端口指的是跑uwsgi的端口
}# nginx服务器配置
server {# 监听端口listen      80;# 域名server_name .example.com;# 编码charset     utf-8;# 最大上传大小client_max_body_size 75M;   # Django 的media路径location /media  {alias /path/to/your/mysite/media;  }# 静态文件路径location /static {alias /path/to/your/mysite/static;}# 将动态请求转发到uwsgi跑的django程序location / {uwsgi_pass  django;include     /path/to/your/mysite/uwsgi_params; # 从github上下载的uwsgi_params 文件路径}
}

你也可以把这个配置文件放在项目路径中,然后建立一个链接到nginx配置文件夹:


sudo ln -s ~/path/to/your/mysite/mysite_nginx.conf /etc/nginx/sites-enabled/

部署静态文件

在部署服务器之前,需要先将Django的静态文件部署到静态文件夹中,首先,编辑django网站的settings.py文件


STATIC_ROOT = os.path.join(BASE_DIR, "static/")

然后,运行以下命令


python manage.py collectstatic

4 启动服务

在启动nginx之前,我们需要先启动uWSGI,进入项目目录然后输入以下命令,在这里我们使用unix套接字方式:


#注:django1.6 前的版本需要手动添加wsgi.py
uwsgi --socket mysite.sock

如果nginx和uwsgi跑在同一台服务器上,使用unix套接字就可以了,unix套接字方式性能要高很多,但不能跨机器访问。当nginx和uWSGI不在一台服务器上时,就需要使用TCP端口方式(别忘了更改nginx配置文件,取消相应注释):


uwsgi --socket :8001 --module mysite.wsgi --chmod-socket=664

接下来,启动nginx服务器,就可以访问django站点了。

5 使用ini配置文件跑uWSGI

到这里,我们已经把nginx+uWSGI+Django跑起来了,但uWSGI的参数比较多的时候,每次都要输入非常麻烦,这时,我们可以在django项目目录下建立一个mysite.uwsgi.ini


[uwsgi]
# 项目根目录路径(full path)
chdir           = /path/to/your/project
# Django的 wsgi 文件
module          = mysite.wsgi
# virtualenv目录 (full path)
home            = /path/to/virtualenvmaster          = true
# 最大工作进程数(CPU密集型建议设为CPU核心数,IO密集型建议设为CPU核心数的两倍)
processes       = 16
# unix套接字文件路径
socket          = /path/to/your/project/mysite.sock
# socket文件权限
# chmod-socket    = 664
# 退出时清空环境
vacuum          = true

然后,直接根据配置文件运行uwsgi即可:


uwsgi --ini mysite.uwsgi.ini

6 管理uwsgi

Emperor模式

uWSGI的Epreror模式可以用来管理机器上部署的uwsgi服务,在这种模式下,会有一个特殊的进程(皇帝)对其它部署的服务(诸侯)进行监视。我们将所有配置文件(ini或xml文件,如上一节中的mysite.uwsgi.ini)统一放到一个文件夹(如:/etc/uwsgi/vassals)中,然后启动Emperor模式:


uwsgi --emperor /etc/uwsgi/vassals

这样,就会自动读取文件夹中的配置文件,并自动监控这些uwsgi服务: - 检测文件夹中有新的配置文件时,会启动新的uwsgi服务实例 - 检测到一个配置文件发生改变,会自动重启该服务 - 检测到一个配置文件被移除,则自动停止该服务 - 如果一个服务死了(诸侯),皇帝进程会重启该服务 - 如果监控进程(皇帝)死了,所有服务(诸侯)都会停止

用systemd管理uwsgi服务

配合Eperor模式,在centos、fedora、archlinux中,我们可以用systemd来管理uwsgi,首先,创建一个systemd service文件(/etc/systemd/system/emperor.uwsgi.service)


[Unit]
Description=uWSGI Emperor
After=syslog.target

[Service]
ExecStart=/root/uwsgi/uwsgi --emperor /etc/uwsgi/vassals
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all

[Install]
WantedBy=multi-user.target

这样我们就可以用systemd来管理uwsgi服务了。启动服务:


$ systemctl start emperor.uwsgi.service

查询服务运行状态:


$ systemctl status emperor.uwsgi.service

停止服务


systemctl stop emperor.uwsgi.service

linux系统中,还有一种通用的方法,就是在init.d 或 rc.d 中加入启动脚本,这种方式不够智能,而且网上资料很多,在这里暂不讨论。

7 常用参数和选项

关于参数的具体使用,可以阅读官方文档http://uwsgi-docs.readthedocs.org/en/latest/Options.html ,在这里列出一些常用的参数:

  • chdir 项目目录
  • home virtualenv目录(如没有运行virtualenv虚拟环境,则无需设置)
  • socket 套接字文件或TCP套接字,例如:site1.uwsgi.sock 或 127.0.0.1:8000
  • uid 用户id
  • gid 用户组id
  • processes 工作进程数
  • harakiri 进程超过该时间未响应就重启该进程(默认单位为秒)
  • module 要启动的wsgi模块入口,如:mysite.wsgi:application
  • ini 指定ini配置文件
  • xml 指定xml配置文件(与ini类似)
  • file 指定要运行的wsgi程序文件,如:test.py
  • emperor Emperor模式
  • so-keepalive 开启TCP KEEPALIVE(unix套接字方式下无效)
  • vacuum 退出时清空环境

这篇关于uWSGI+Nginx+Django安装和配置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1024163

相关文章

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

mysql8.0.43使用InnoDB Cluster配置主从复制

《mysql8.0.43使用InnoDBCluster配置主从复制》本文主要介绍了mysql8.0.43使用InnoDBCluster配置主从复制,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录1、配置Hosts解析(所有服务器都要执行)2、安装mysql shell(所有服务器都要执行)3、

java程序远程debug原理与配置全过程

《java程序远程debug原理与配置全过程》文章介绍了Java远程调试的JPDA体系,包含JVMTI监控JVM、JDWP传输调试命令、JDI提供调试接口,通过-Xdebug、-Xrunjdwp参数配... 目录背景组成模块间联系IBM对三个模块的详细介绍编程使用总结背景日常工作中,每个程序员都会遇到bu

python依赖管理工具UV的安装和使用教程

《python依赖管理工具UV的安装和使用教程》UV是一个用Rust编写的Python包安装和依赖管理工具,比传统工具(如pip)有着更快、更高效的体验,:本文主要介绍python依赖管理工具UV... 目录前言一、命令安装uv二、手动编译安装2.1在archlinux安装uv的依赖工具2.2从github

JDK8(Java Development kit)的安装与配置全过程

《JDK8(JavaDevelopmentkit)的安装与配置全过程》文章简要介绍了Java的核心特点(如跨平台、JVM机制)及JDK/JRE的区别,重点讲解了如何通过配置环境变量(PATH和JA... 目录Java特点JDKJREJDK的下载,安装配置环境变量总结Java特点说起 Java,大家肯定都

linux配置podman阿里云容器镜像加速器详解

《linux配置podman阿里云容器镜像加速器详解》本文指导如何配置Podman使用阿里云容器镜像加速器:登录阿里云获取专属加速地址,修改Podman配置文件并移除https://前缀,最后拉取镜像... 目录1.下载podman2.获取阿里云个人容器镜像加速器地址3.更改podman配置文件4.使用po

Nginx实现端口映射的示例代码

《Nginx实现端口映射的示例代码》本文主要介绍了Nginx实现端口映射的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1. 找到nginx的部署路径2. 备份原来的配置文件3. 编辑nginx.conf文件4. 在