uWSGI + Nginx + Django 部署

1. uWSGI 服务器

Django 默认使用 WSGI(Python Web Server Gateway )
作为 Web 服务器,一般仅用来作为测试使用,实际生产环境而是使用 uWSGI 和 Nginx 作为服务器。

uWSGI 代码完全用C编写,效率高、性能稳定,但是处理 静态文件能力较弱,因此实际生产环境中,一般采用 uWSGI + Nginx 两者搭配使用:

  • uWSGI:处理动态请求(css、js、图片文件等)
  • Nginx:处理静态文件请求(提交表单、mysql、动态渲染 html)

安装:

 pip3 install uWSGI


settings.py 配置

设置 ALLOWED_HOSTS

ALLOWED_HOSTS = [
    # 加上本机的IP地址
    '192.168.xx.xxx',
    '127.0.0.1',
    'localhost'
]

也可以这样设置:

ALLOWED_HOSTS = ['*']

1.1 通过参数启动 uWSGI

# 请更换成你服务器 ip 和端口,其中 Celery_Test/wsgi.py 为Django 项目中自带的 wsgi web 服务
[email protected]:~/桌面/Celery_Test$ uwsgi --http 192.168.21.128:8080 --file Celery_Test/wsgi.py --static-map=/static=static

出现如下效果便是运行成功了:

查看启动端口:

[email protected]:~/桌面/Celery_Test/script$ ps -ef|grep uwsgi

hj       17176  5231  0 15:37 pts/1    00:00:00 uwsgi --http 192.168.xx.128:8080 --file Celery_Test/wsgi.py --static-map=/static=static
hj       17177 17176  0 15:37 pts/1    00:00:00 uwsgi --http 192.168.xx.128:8080 --file Celery_Test/wsgi.py --static-map=/static=static
hj       17206  6554  0 15:38 pts/2    00:00:00 grep --color=auto uwsgi

访问 192.168.21.128:8080

1.2 通过配置文件启动 uWSGI

在项目根目录创建一个名为 uwsgi.ini 的配置文件,配置如下:

[uwsgi]
# 项目目录
chdir=/home/hj/桌面/Celery_Test/
# 指定项目的application
module=Celery_Test.wsgi:application
# 指定sock的文件路径
socket=/home/hj/桌面/Celery_Test/script/uwsgi.sock
# 进程个数
workers=5
pidfile=/home/hj/桌面/Celery_Test/script/uwsgi.pid
# 指定IP端口
http=192.168.21.128:8080
# 指定静态文件
static-map=/static=/home/hj/桌面/Celery_Test/static
# 启动uwsgi的用户名和用户组
uid=root
gid=root
# 启用主进程
master=true
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启用线程
enable-threads=true
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=4096
# 设置日志目录
daemonize=/home/hj/桌面/Celery_Test/script/uwsgi.log

配置好之后,运行 uwsgi --ini uwsgi.ini 启动 uwsgi,出现如下信息即表示启动成功:

[email protected]:~/桌面/Celery_Test$ uwsgi --ini uwsgi.ini
[uWSGI] getting INI configuration from uwsgi.ini
[uwsgi-static] added mapping for /static => /home/hj/桌面/Celery_Test/static

查看运行情况:

ps ajx|grep uwsgi

效果如下图:

常用命令:

uwsgi --ini uwsgi.ini       # 启动
    # 启动时会生成两个文件,分别为:
    # PID文件 标识这个程序所处的状态
    # SOCK文件  用来和其他程序通信的
uwsgi --stop uwsgi.pid      # 停止
uwsgi --reload uwsgi.ini    # 重置

Tips

停止时出现 signal_pidfile()/kill(): No such process [core/uwsgi.c line 1693]

原因:当前端口进程与 uwsgi.pid 不一致,查看当前端口实际进程 ID,并修改 uwsgi.pid

# 根据端口,查看进程
[email protected]:~/桌面/Celery_Test$ sudo netstat -nap | grep 8080
tcp        0      0 192.168.21.128:8080     0.0.0.0:*               LISTEN      6943/uwsgi       

# 修改 uwsgi.pid 的值为 6943,并再重新停止
[email protected]:~/桌面/Celery_Test$ uwsgi --stop script/uwsgi.pid

# 查看发现已经成功停止
[email protected]:~/桌面/Celery_Test$ ps ajx|grep uwsgi
 5231 14550 14549  5231 pts/1    14549 S+    1000   0:00 grep --color=auto uwsgi


Linux 中怎么查看端口和进程号

# 加上 sudo
# 根据进程 pid 查看端口
lsof -i | grep pid

# 根据端口查看进程
lsof -i:port

# 根据进程 pid 查看端口
netstat -nap | grep pid

# 根据端口查看进程号
netstat -nap | grep port

2. Nginx 服务器

我们知道 uWSGI 处理静态文件请求能力比较弱,因此一般实际生产环境中以 动静分离 的方式处理动静请求,即 uWSGI + Nginx。

Nginx 作用还包括负载均衡、反向代理等。

2.1 Ubuntu 上安装 Nginx

Nginx 的软件包在 Ubuntu 默认软件仓库中可用。 安装非常简单,只需键入以下命令:

sudo apt update
udo apt install nginx

查看服务器版本信息:

sudo nginx -v

nginx version: nginx/1.14.0 (Ubuntu)

查看服务器状态:

# 两个都可以
sudo systemctl status nginx
ps -ef | grep nignx

配置防火墙

打开 80 和 443 端口允许通过防火墙:

[email protected]:~$ sudo ufw allow 'Nginx Full'
防火墙规则已更新
规则已更新(v6)

检查是否更改:

[email protected]:~$ sudo ufw status
状态: 激活

至                          动作          来自
-                          --          --
22                         ALLOW       Anywhere
4200                       ALLOW       Anywhere
Nginx Full                 ALLOW       Anywhere
22 (v6)                    ALLOW       Anywhere (v6)
4200 (v6)                  ALLOW       Anywhere (v6)
Nginx Full (v6)            ALLOW       Anywhere (v6)

测试安装

访问:http://192.168.21.128/

使用 systemctl 管理 Nginx 服务

您可以像任何其他 systemd 单位一样管理 Nginx 服务:

# 停止Nginx服务
sudo systemctl stop nginx

# 再次启动
sudo systemctl start nginx

# 重新启动Nginx服务:
sudo systemctl restart nginx

# 在进行一些配置更改后重新加载 Nginx 服务:
$sudo systemctl reload nginx

# 如果你想禁用Nginx服务在启动时启动:
$sudo systemctl disable nginx

# 并重新启用它:
$sudo systemctl enable nginx

参考链接:如何在Ubuntu 18.04上安装Nginx

2.2 CentOS 上安装

以CentOS6.x 系统为例

  1. 更换源:
# 备份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

# 更换成国内源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo

# 生成缓存
yum makecache
  1. 安装 Nginx:
yum -y install nginx

2.3 与 uWSGI 结合使用部署 Django

为 Nginx 添加配置文件,Ngnix 默认配置文件加载是在 /etc/nginx/conf.d/ 目录下,新建一个配置文件(名字随意),编辑如下:

# 新建到配置文件 conf.d
vim /etc/nginx/conf.d/

# 编辑配置文件
server {            # 开始配置了
        listen 80;   # 监听端口
        server_name 10.129.xxx.183 ;  # 你访问的路径前面的 url名称
        access_log  /var/log/nginx/access.log  main;  # Nginx日志配置
        charset  utf-8; # Nginx编码
        gzip on;  # 启用压缩,这个的作用就是给用户一个网页,比如3M压缩后1M这样传输速度就会提高很多
        gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream;  # 支持压缩的类型

        error_page  404           /404.html;  # 错误页面
        error_page   500 502 503 504  /50x.html;  # 错误页面

        # 指定项目路径 uwsgi
        location / {        # 类似于 Django的 url(r'^admin/', admin.site.urls),
            include uwsgi_params;  # 导入一个Nginx模块他是用来和uWSGI进行通讯的
            uwsgi_connect_timeout 30;  # 设置连接uWSGI超时时间
            uwsgi_pass unix:/opt/project_teacher/script/uwsgi.sock;  # 指定uwsgi的sock文件所有动态请求就会直接丢给他
        }

        # 指定静态文件路径
        location /static/ {
            alias  /opt/project_teacher/teacher/static/;
            index  index.html index.htm;
        }

        }

参考:

server {
        listen 80;
        server_name 192.168.xx.128 ;
        access_log  /var/log/nginx/access.log  main;
        charset  utf-8;
        gzip on;
        gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream;
        error_page  404           /404.html;
        error_page   500 502 503 504  /50x.html;  

        location / {
            include uwsgi_params;
            uwsgi_connect_timeout 30;
            uwsgi_pass unix:/home/hj/桌面/Celery_Test/script/uwsgi.sock;
        }

        location /static/ {
            alias  /home/hj/桌面/Celery_Test/static/;
        index index.html index.htm

启动 Nginx 服务 /etc/init.d/nginx start,访问:http://192.168.21.128:8080/app/index/,效果如下图:

常用命令:

/etc/init.d/nginx start     # 启动
/etc/init.d/nginx stop      # 关闭

#  Nginx配置是重启才生效,若修改配置不知道是否对不对,可以用来测试
/etc/init.d/nginx configtest

# 生产环境直接 reload就行了,不要 stop start 或者 restart
/etc/init.d/nginx reload 


配置 Django 静态文件

admin 所需的静态文件都在 Django 的安装内,我们没有配置指向 Django 的配置文件。

解决办法:

  1. 设置 settings.py ,将所有静态文件收集到 static_all 中:
# settings.py
STATIC_ROOT = os.path.join(BASE_DIR, "static_all")

# 收集成功提示(仅供参考)
120 static files copied to '/home/hj/桌面/Celery_Test/static_all'.
  1. 收集静态文件到 static_all 这个目录中(可不创建 static_all):
python3 manage.py collectstatic --noinput
  1. 修改 /etc/nginx/conf.d/test.ini 中静态文件路径:
alias  /home/hj/桌面/Celery_Test/static_all;


指定其他地方放置静态文件

# 新建目录
sudo mkdir -vp /var/www/test2/static/

# 赋予权限
sudo chmod 777 /var/www/test2/static/

# 修改项目中 settings.py,指定静态文件路径
STATIC_ROOT = '/var/www/test2/static/'
STATIC_URL = '/static/'

# 收集静态文件到 /var/www/test2/static/ 中
python3 manage.py collectstatic

# 输入 yes,开始收集,重新加载 Nginx 服务

原文地址:https://www.cnblogs.com/midworld/p/10992005.html

时间: 2024-11-10 08:31:47

uWSGI + Nginx + Django 部署的相关文章

Nginx + uWSGI + Python + Django部署实例

Nginx: Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性: 作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎.能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型. 作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器

阿里云 centos7 django + uWSGI+Nginx + python3 部署攻略

centos7+nginx+python3+django+uwsgi配置Django 项目部署 1.租的服务器(选择centos)的话,需要在阿里云后台控制台开放几个端口,克隆一下已开放的端口,tcp自定义就行,mysql(3306),nginx(8000以上都行).(都切换到root用户操作) 2.安装python3 3.安装nginx 4.安装mysql(这一步如果暂时用不上数据库也可以不操作) 5.确定2,3两步安装成功了,接下来就用pip3 安装django 和uwsgi, 在进行下一步

Django+uwsgi+Nginx安装部署

安装 安装Nginx Nginx是最流行的高性能HTTP服务器. wget http://nginx.org/download/nginx-1.10.1.tar.gz tar -zxvf nginx-1.10.1.tar.gz cd nginx-1.10.1 ./configure --prefix=/usr/local/nginx --with-http_stub_status_module make && make install 安装MySQL-python MySQL-python

Flask+uwsgi+Nginx+Ubuntu部署教程

学习 Flask,写完一个 Flask 应用需要部署的时候,就想着折腾自己的服务器.根据搜索的教程照做,对于原理一知半解,磕磕碰碰,只要运行起来了,谢天谢地然后不再折腾了,到下一次还需要部署时,这样的过程就会重复一次.不知道多少人的膝盖中箭了呢?我也这样干过,这么做确实很蠢,所以我决定写一篇 Flask+uwsgi+Nginx+Ubuntu 的部署教程,解答一些我自己在这个过程中的疑问,从原理到方案,以一个小白的角度,总结一下部署.运维这件事,应该对初学 Flask 需要部署的同学有些帮助. 环

Flask+uwsgi+Nginx+Ubuntu部署

学了一段时间flask,可是一直没有做过部署, 于是想着怎么部署呢, 想想,先吧服务给搞通吧,于是呢 就先想着去吧服务给搞起来,这里选择的是Flask+uwsgi+Nginx+Ubuntu, Python选择的是2.7.2这个是Ubuntu系统自带的学起来感觉还是简单的 不用去软连,目前自己的flask是python3写的 ,慢慢去过渡,先吧这个给搞通了,那么在优化也是很顺手的.其实对于很多的原理自己也是一知半解,先吧这个给搭起来,慢慢去了解里面的逻辑什么的. Nginx Nginx 是高效的

django+uwsgi+nginx+sqlite3部署

一:项目(github) ssh [email protected] ip         #  连接你的服务器 git clone -b https://mygithub.com     #  -b 指定分支 安装virtualenv及配置环境变量     详细见:https://www.cnblogs.com/tangpg/p/8458233.html mkvirtualenv envname -p python3 # 创建项目使用的python版本的虚拟环境,创建成功默认回进入该虚拟环境

django1.8+uwsgi+nginx+supervisord部署项目笔记

学这个搞了我2天.最好的东西学会了怎排除问题. 直接贴代码,我同时部署2个项目,一个直接返回' hello',另一个空. hello 项目: /root/27env/hello/uwsgi.ini: ################################## [uwsgi] vhost = false plugins = python socket = 127.0.0.1:8080 master = true enable-threads = true workers = 1 wsgi

django2+uwsgi+nginx上线部署到服务器Ubuntu16.04(最新最详细版)

1.前期准备 1.打开Terminal终端,执行以下命令,将项目所需要的依赖包,都记录到一个文件内备用. pip freeze >requirements.txt 2.将项目文件夹→右键→添加压缩文件,压缩为zip包 3.准备软件 1.xshell(用于远程操作服务器) 2.FileZilla(用于从客户端将项目包上传到服务器) 3.Navicat 12 (用于同步数据库) 4.环境 云服务器/云主机:京东云 (云服务还是要选大厂的,我也试过一些比较小的厂的云服务,不说是哪家了,哇,简直是坑啊,

flask+uwsgi+nginx+docker-compose部署

简单介绍 Flask这里就不多阐述了,已经是很流行的一个轻量级python框架了,对于小.中型项目特别适合.这里用docker的compose编排部署.uwsgi 简单的说明下,uWSGI是一个Web服务器,它实现了WSGI协议.uwsgi.http等协议. Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换. WSGI是一种Web服务器网关接口.它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范. 这是官方