1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > nginx+docker+gunicorn+flask部署到云服务器

nginx+docker+gunicorn+flask部署到云服务器

时间:2024-03-30 23:01:06

相关推荐

nginx+docker+gunicorn+flask部署到云服务器

项目结构图:

app:app 第一个app是文件名,第二个app是flask实例

1. nginx

安装:apt instll nginx

配置:在/etc/nginx/conf.d/目录下新建配置文件:default.conf

由于下面gunicorn的配置文件里面写了日志文件的路径,所以nginx配置这里就注释掉了

server {listen 80;#你想服务器的端口server_name ; #例如 198.198.22.22location / {proxy_pass http://127.0.0.1:8000; #这个是Gunicorn与Ningx通信的端口。和Gunicorn的配置相同}}server {listen 80;#你想服务器的端口server_name ; #例如 198.198.22.22location / {proxy_pass http://127.0.0.1:5000; #这个是Gunicorn与Ningx通信的端口。和Gunicorn的配置相同}}

2. Dockerfile配置文件

# 基于的基础镜像FROM python:3.8# 设置app文件夹是工作目录WORKDIR /usr/src/app# COPY指令和ADD指令功能和使用方式类似。只是COPY指令不会做自动解压工作。。COPY . /usr/src/app# 执行指令,安装依赖# RUN pip install --no-cache-dir -r requirements.txtRUN pip install -r requirements.txt -i https://pypi.tuna./simpleWORKDIR /usr/src/app/docker_test03# 执行命令#CMD ["python", "/usr/src/app/docker_test03/app.py", "runserver", "-h0.0.0.0", "-p5000"]#CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:5000", "app:app"]#CMD ["gunicorn", "-c", "/usr/src/app/gunicorn.conf.py", "app:app"]CMD ["/bin/sh", "/usr/src/app/run.sh"]

3. docker-compose.yml文件

version: '3'services:flask_web:# 第一部分: Building(构建镜像)build: # 使用定制化的Dockerfile,指定新目录相对路径和文件名context: .dockerfile: ./Dockerfileimage: py38_flask_democontainer_name: py38_flask_demo01 # 自定义容器名restart: on-failure:10 # 错误重试次数# 第二部分 Ports(端口)ports: # 指定端口映射,HOST:Container# - "6379" # 指定容器的端口6379,宿主机会随机映射端口- "5000:5000" # 宿主机端口7000,对应容器5000volumes:- .:/usr/src/app # 目录挂载,宿主机在前,容器在后networks:default:external:name: my-docker-compose-network # 加入已经存在的外部网络

4. requirements.txt文件

alembic==1.6.5cffi==1.14.6click==8.0.1colorama==0.4.4Flask==1.1.2Flask-Migrate==2.7.0Flask-Script==2.0.6Flask-SQLAlchemy==2.4.4gevent==21.1.2greenlet==1.1.0gunicorn==20.1.0itsdangerous==2.0.1Jinja2==3.0.1Mako==1.1.4MarkupSafe==2.0.1protobuf==3.17.3pycparser==2.20PyMySQL==1.0.2python-dateutil==2.8.1python-editor==1.0.4redis==3.5.3six==1.16.0SQLAlchemy==1.3.24Werkzeug==2.0.1zope.event==4.5.0zope.interface==5.4.0

5. app.py文件

from flask import Flaskapp = Flask(__name__)@app.route('/')def hello_world():return 'Hello, Docker_test04、Uwsgi、Nginx mayanan_esc_01、哈哈!'

6.gunicorn.conf.py配置文件内容

"""gunicorn 配置文件"""import gevent.monkeygevent.monkey.patch_all()import multiprocessing# 要绑定的套接字。# 形式为:HOST, HOST:PORT, unix:PATH, 的 字符串fd://FD。IP 是有效的HOST.bind = '0.0.0.0:5000'workers = multiprocessing.cpu_count() * 2 + 1 # 处理请求的工作进程数。worker_class = 'gevent' # 要使用的工人类型。threads = 2 # 用于处理请求的工作线程数。# 任何大于零的值都将限制工作人员在自动重新启动之前将处理的请求数。这是一种帮助限制内存泄漏损害的简单方法。# 如果将其设置为零(默认值),则禁用自动重新启动工作程序max_requests = 0 # 1000000 重新启动前工作程序将处理的最大请求数# 抖动导致每个工作器的重启被随机化 。这是为了错开工作人员重新启动以避免所有工作人员同时重新启动max_requests_jitter = 0 # 1000 添加到max_requests设置的最大抖动。timeout = 60 # 沉默超过这么多秒的工人被杀死并重新启动。keep_alive = 5 # 保持链接多少秒daemon = False # 守护 Gunicorn 进程。loglevel = "info" # 日志级别access_log_format = ( # 日志格式'%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s" "%({X-Real-IP}i)s" "%({X-Forwarded-For})s"')# 切记这里目录是相对于容器的目录,而不是外面的目录accesslog = "/usr/src/app/logs/access.log" # 普通日志文件errorlog = "/usr/src/app/logs/error.log" # 错误日志文件

配置参考网址:

【Gunicorn】gunicorn配置文件详解_寒泉-CSDN博客_gunicorn 配置文件

配置官方网址:Settings — Gunicorn 20.1.0 documentation

7. run.sh脚本文件

#!/bin/shif [ ! -d logs ]; thenmkdir -p /usr/src/app/logsfiif [ ! -d logs ]; thenmkdir -p /usr/src/app/logsfigunicorn -c /usr/src/app/gunicorn.conf.py app:app

注意:如果是windows下编辑的脚本文件,上传到Linux后有可能报错:Syntax error: end of file unexpected (expecting “then”)

原因:这是因为我在windows下些的脚本,windows和linux的回车换行时不一样的字符,所以脚本在解释时会出现问题,在windows里,换行用的两个符号,回车换\r行符号\n,在linux下只需一个符号\n就可以了。

解决办法见链接:Linux提示Syntax error: end of file unexpected (expecting "then") 提示错误 - 流逝的轻风 - 博客园

6. 启动docker容器同时自动启动gunicorn拉起我们的Web服务

docker-compose up 或后台启动docker-compose up -d

7. 启动Nginx服务

sudo systemctl start nginx

浏览器访问一下试试吧

8. 中途遇到的问题

(1)查看systemctl status nginx状态显示错误 :Failed to parse PID from file /run/nginx.pid: Invalid argument

解决办法四步:

mkdir -p /etc/systemd/system/nginx.service.dprintf "[Service]\nExecStartPost=/bin/sleep 0.1\n" >/etc/systemd/system/nginx.service.d/override.confsystemctl daemon-reloadsystemctl restart nginx.service

在查看状态正常了。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。