Code前端首页关于Code前端联系我们

Docker 部署 django 框架,部署 nginx 负载均衡

terry 2年前 (2023-09-28) 阅读数 64 #未命名

docker 部署 django 项目

生产环境使用 python Manage.py runserver

docker部署django框架并实现nginx负载均衡

不合适。您可以使用uWSGI服务器来运行Django项目。不过,由于我的机器上无法安装uws,所以我使用docker来安装。这里用于测试的Django项目称为sjor或todj,它们是简单的新创建的Django项目。

docker部署django框架并实现nginx负载均衡

首先,使用uwsg创建一个可以使用http的环境。您可以直接从浏览器访问它。

绘制python:3.8图像和地图端口。使用命令 docker cp /path id:/sjor 将带有容器 ID 的项目文件复制到 /sjor 目录。

由于python镜像的CMD是python3,所以应该使用命令docker exec -it id container basha。使用 pip install -rrequirements.txt 安装依赖项。参考依赖:ini复制代码

asgiref==3.5.1
backports.zoneinfo==0.2.1
Django==4.0.4
mysqlclient==2.1.0
PyMySQL==1.0.2
sqlparse==0.4.2
typing_extensions==4.2.0
uWSGI==2.0.20

使用代码uwsgi --ini uwsgi.ini运行项目。示例代码如下:ini复制代码

[uwsgi]
http = :8002
chdir = /sjor
wsgi-file = sjor/wsgi.py
process = 4
threads = 2
pidfile = pro.pid
daemonize=sjor.log
master=true

可以使用uwsgi --stop pro.pid停止服务。

上面显示http请求发送到容器8002端口,如果容器启动时就做了端口映射,进入浏览器就可以直接看到:

docker部署django框架并实现nginx负载均衡

可以在容器中使用 ps -aux查看进程列表:

docker部署django框架并实现nginx负载均衡

您还可以考虑使用 uwsg 和 nginx 方法创建用于发送套接字的后端。这里,uswgi无法直接用浏览器访问。

可以使用uwsg套接字服务代替http,速度更快。 ini 复制代码

[uwsgi]
socket = :8002
chdir = /sjor
wsgi-file = sjor/wsgi.py
process = 4
threads = 2
pidfile = pro.pid
daemonize = sjor.log
master = true
vacuum = true
max-requests = 1000
limit-as = 512
buffer-size = 30000

打开 nginx 容器,将 80 端口连接到主机,如下所示: ini 复制代码

upstream todj{
    server 119.23.182.180:10003 weight=1;
}

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    access_log  /var/log/nginx/host.access.log  main;

    location / {
        uwsgi_pass todj;
        include /etc/nginx/uwsgi_params;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

}

此处的流名称必须添加到字段 ALLOW_HOST 项目 。例如这里todj

在localhost上打开绑定的端口,可以看到已经成功访问​​了:

docker部署django框架并实现nginx负载均衡

但是在本地docker Python容器中运行uwsg时,使用nginx进行上述连接会报错。txt 复制代码

An error occurred.
Sorry, the page you are looking for is currently unavailable.
Please try again later.

If you are the system administrator of this resource then you should check the error log for details.

Faithfully yours, nginx.

nginx转发django负载均衡

背景:如果有多台服务器,可以部署多个后端进行分布式数据处理。使用docker这样的工具,即使有多个服务器,前端在发出请求时也只询问nginx服务器,nginx处理剩下的工作。并且使用nginx反向代理可以解决跨域请求的问题。如果各个服务器端配置不同,可以通过nginx来实现端口转发和负载控制操作。我碰巧有几台服务器,因此我可以部署 Django 后端。并且您可以使用 nginx 代理操作来排除某些请求端口号。

在宝塔或者阿里云控制台等打开防火墙端口,运行django直接访问。

Django应用程序视图可以添加以下功能: python 复制代码

def showG(request):
    print('Request from {}:'.format(request.META['REMOTE_ADDR']))
    return HttpResponse('get')

使用命令runserver运行服务器。

要在本地运行 Docker 的 nginx 容器,请使用以下命令 docker run -it -d -p 12345:80 nginx

在 ginx 浏览器中打开 http://127.0.0.1:12345。默认页面

docker部署django框架并实现nginx负载均衡

可以更改配置文件etc/nginx/conf.d/defalut.conf制作反向代理ini复制代码

server {
    listen       80;
    listen  [::]:80;
    server_name  www.masaikk.xyz;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        proxy_pass http://www.masaikk.xyz:10003;
        proxy_redirect default;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

}

这里发送本地80:http://www .masaikk.xyz:10003

,可以正常访问。

docker部署django框架并实现nginx负载均衡

后端也能正常接收请求并保存。

docker部署django框架并实现nginx负载均衡

添加多服务器的配置,在配置文件中添加以下流:css复制代码

upstream todj{
    server www.masaikk.xyz:10003;
    server 119.23.182.180:10003;
}

这个流名称​​todj必须添加到django ALLOW_HOSTS中。

编辑配置文件ini,复制代码

upstream todj{
    server www.masaikk.xyz:10003;
    server 119.23.182.180:10003;
}

server {
    listen       80;
    listen  [::]:80;
    server_name  www.masaikk.xyz;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        proxy_pass http://todj;
        proxy_redirect default;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

}

重启容器即可达到预期效果:

docker部署django框架并实现nginx负载均衡

两台服务器都能收到请求。

同时可以通过设置权重来设置每台服务器的访问流量控制。 ini 复制代码

upstream todj{
    server www.masaikk.xyz:10003 weight=1;
    server 119.23.182.180:10003 weight=3;
}

还可以使用上面介绍的socket方式与Nginx通信。但需要注意的是,使用socket的IP不需要用http://等前缀保存。作者:马赛克克
链接:https://juejin.cn/post/7150093955105816612
来源:稀土掘金
版权归作者所有。商业转载请联系作者获取授权。非商业转载请注明出处。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门