当前位置: 首页 > seo网站 > 正文

seo网站数据查询命令是什么意思_基于群晖开发自己的Flask应用

如何在群辉上开发自己的Restful API,并实现公网访问。

牛皮seo

起因想做自己的简化版图床,满足自己用Typora写markdown自动上传图片的需要,但是后来采用兰空图床lsky部署成功了,后面再写文章详细说明部署过程;但是写flask应用的思路也是可以用在其他方面进行开发的,比如可以做公开的restful api,小范围内使用足够了,所以记录下开发流程,大家一起交流下。

技术栈群晖(需要可以安装docker)FlaskGunicornNginxDDNSTO(用于将内网端口映射到公网域名)向日葵(用于将内网端口映射到公网域名)流程群晖群晖是非常流行的个人NAS,功能有很多,大家可自行网上搜索,本次我们主要需要:

安装Ubuntu Docker,创建Ubuntu开发环境;安装DDNSTO组件,参考安装流程,安装完成后会在DDNSTO官网显示;Flask进入群晖中Ubuntu Docker的终端机:

image-20231104132802533安装和进入Python虚拟环境:python3 -m pip install virtualenv -i https://pypi.tuna.tsinghua.edu.cn/simple

virtualenv flaskenvsource flaskenv/bin/activate安装Flask & Gunicornpip install gunicorn flask -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install flask_restful flask_httpauth -i https://pypi.tuna.tsinghua.edu.cn/simple应用脚本准备Flask应用app.py,主要实现端点功能:1、上传图片api及页面;2、统计图片数量;3、获取图片;当然整体比较粗糙,跟真正的图床还有比较大的差距,大家可以自行改进。

from flask import Flask, request, redirect, url_for, flash, send_from_directory, jsonify, render_template

from flask_uploads import UploadSet, configure_uploads, IMAGESimport osapp = Flask(__name__)app.config[

SECRET_KEY] = your_secret_key_here# 修改为你自己的密钥photos = UploadSet(photos, IMAGES)UPLOAD_FOLDER = /nas/web/static/images/

app.config[UPLOADED_PHOTOS_DEST] = UPLOAD_FOLDER  # 上传图片的保存目录configure_uploads(app, photos)@app.route(

/)def index():    num_files = len([f for f in os.listdir(UPLOAD_FOLDER) if os.path.isfile(os.path.join(UPLOAD_FOLDER, f))])

return jsonify({"total_images": num_files})@app.route(/upload_page)def upload_page():return    

                    @app.route(/upload, methods=[

POST])def upload():ifphotoin request.files:        filename = photos.save(request.files[photo])        flash(

"Photo uploaded successfully!")        photo_url = url_for(get_image, filename=filename)return jsonify({

"success": True, "photo_url": photo_url}), 200else:return jsonify({"success": False, "message": "No photo in request"

}), 400@app.route(/images/)def get_image(filename):return send_from_directory(UPLOAD_FOLDER, filename)

if __name__ == __main__:    app.run(debug=True)验证方式:export FLASK_APP=app.pyflask run --host=0.0.0.0 --port=5000

这时在局域网内应该可以通过IP:Port进行访问和测试了WSGI服务器wsgi.pyWSGI服务器脚本wsgi.py:from app import app as applicationif __name__ == 。

"__main__":    application.run()启动方式:gunicorn --workers 4 --bind unix:/var/run/app.sock -m 007 wsgi:application &

sleep 5chown root:www-data /var/run/app.sock以下是命令及其参数的详细解释:gunicorn:这是启动 Gunicorn 服务器的命令--workers 4:此选项指定处理请求的工作进程数。

更多的工作进程可以处理更多的并发请求通常推荐的工作进程数是 2-4 倍的 ,其中(NUM_CORES) 是您机器上的 CPU 核心数--bind unix:app.sock:此选项告诉 Gunicorn 绑定到一个 Unix 套接字而不是 TCP 端口。

Unix 套接字通常用于与像 Nginx 这样的网络服务器进行反向代理设置,因为它们比 TCP 套接字更有效率app.sock 是用于 Nginx 和 Gunicorn 之间通信的 Unix 套接字文件的名称。

-m 007:这设置 Unix 套接字文件的文件模式(权限)在这种情况下,007 是一个八进制数,在取反后(因为默认权限是 777)等同于 rwxrwx--- 的权限这意味着所有者及组可以读取、写入和执行,而其他人没有任何权限。

这是一个安全措施,以确保只有授权用户才能与套接字文件交互wsgi:application:告诉 Gunicorn 加载 WSGI 应用程序wsgi 是模块名称(即名为 wsgi.py 的 Python 文件),。

application 是该模块内应由 Gunicorn 服务的可调用对象这个可调用对象是 WSGI 应用程序对象,Gunicorn 将使用它与您的网络应用程序通信chown是将app.sock的所有组设置为www-data,保证nginx的进程有权限访问。

总之,这个命令启动了带有 4 个工作进程的 Gunicorn,将其绑定到具有限制权限的 Unix 套接字,并服务于在 wsgi.py 文件中定义的 WSGI 应用程序这种设置通常用于部署 Flask 或 Django 应用程序,并且会放在像 Nginx 这样的网络服务器后面,该服务器将处理传入的 HTTP 请求并通过 Unix 套接字将它们传递给 Gunicorn。

拓展功能在wsgi.py文件中,除了基本的应用程序导入和启动之外,还可能包含一些其他的设置和配置,以便为生产环境准备应用程序以下是一些可能包含在wsgi.py文件中的内容:环境变量设置: 在启动应用程序之前,可能需要设置环境变量,例如数据库的URI、秘钥或其他配置变量。

import osos.environ[DATABASE_URI] = postgres://user:password@localhost/dbname应用配置: 可能会从一个配置文件或模块中加载配置到应用程序。

app.config.from_pyfile(config.py)日志配置: 对于生产环境,可能需要配置日志记录的方式,以便记录错误和事务信息import logginglogging.basicConfig(level=logging.INFO)。

中间件添加: 可能会添加一些WSGI中间件来处理请求,例如用于加载均衡、安全性、缓存等from werkzeug.middleware.proxy_fix import ProxyFixapp.wsgi_app = ProxyFix(app.wsgi_app)。

应用扩展初始化: 如果应用程序使用了Flask扩展,可能需要在这里初始化它们from myapp.extensions import dbdb.init_app(app)应用工厂模式: 如果使用了应用工厂模式,。

wsgi.py将调用工厂函数来创建应用实例from myapp import create_appapplication = create_app()应用上下文推送: 在某些情况下,可能需要在没有实际请求的情况下激活应用上下文。

with app.app_context():# 在这里执行需要应用上下文的代码数据迁移工具: 对于像Alembic或Flask-Migrate这样的数据迁移工具,可能需要在wsgi.py中设置from。

 flask_migrate import Migratemigrate = Migrate(app, db)健康检查或启动检查: 有时候,你可能想在应用启动时执行一些健康检查或确保依赖服务可用# 检查数据库连接等。

其他服务的启动: 如果你的应用程序需要在启动时连接到消息队列或启动后台任务,这些也可能在wsgi.py中配置from myapp.tasks import start_background_tasksstart_background_tasks()

wsgi.py是部署时的入口点,因此通常会包含所有必要的引导和配置代码,以确保应用程序能够在生产环境中正确运行这些设置应该根据应用程序的具体需求和生产环境的配置来定制Nginx服务器安装:apt install nginx。

启动、停止、与重载:service nginx startservice nginx stopservice nginx reload配置APP应用增加应用配置文件/etc/nginx/sites-available/app

server {    listen 5000;    server_name _;location / {  include proxy_params;  proxy_pass http://unix:/var/run/app.sock;

    }}加入启动目录ln -s /etc/nginx/sites-available/app /etc/nginx/sites-enabled    # 在sites-enabled目录建立app软链接

rm /etc/nginx/sites-enabled/default  # 删除default软链接,因为其中包含的default server的配置与目前冲突关于 server_name的说明server_name

指令在 Nginx 配置中用来指定哪些域名或 IP 地址可以用来访问你的服务器这对于运行多个网站或应用在同一服务器上的情况特别有用,因为它允许 Nginx 根据请求的 Host HTTP 头信息来确定请求应该被转发到哪个站点或应用。

单个域名:如果你有一个域名 example.com,你可以直接将其设置为 server_name 的值server_name example.com;多个域名:如果你想要同一个应用响应多个域名,你可以将它们都列在 。

server_name 指令后面,用空格分隔server_name example.com www.example.com;通配符:你也可以使用通配符来匹配子域名server_name *.example.com;。

默认服务器:如果你想要一个配置来响应所有未在其他 server 块中定义的域名和 IP 地址,你可以使用默认服务器server_name _;配置好后的作用域名定向:server_name 允许你将特定的域名请求定向到特定的网站或应用。

这是虚拟主机的基础,允许单个服务器托管多个网站安全性:它还可以增强安全性,因为你可以为不同的域名设置不同的安全策略seo:确保正确的域名定向到正确的内容,对搜索引擎优化(SEO)也是有益的证书匹配:在使用 SSL/TLS 时,

server_name 用于匹配证书中的 Common Name 或 Subject Alternative Name,确保 HTTPS 连接的安全性在配置 server_name 时,确保你的 DNS 设置已经将域名指向了你的服务器的 IP 地址。

配置完成后,当用户访问 example.com,DNS 解析将用户指向你的服务器 IP 地址,然后 Nginx 根据 server_name 指令将请求转发到正确的站点或应用本文采用默认服务器配置worker_processes VS workers。

worker_processes auto; 是 Nginx 的配置指令,位于/etc/nginx/nginx.conf配置文件,而 gunicorn --workers 4 是 Gunicorn 的启动参数。

它们都用于设置进程数,但分别适用于不同的服务Nginx 的 worker_processes:这个指令告诉 Nginx 应该启动多少个工作进程来处理请求当设置为 auto 时,Nginx 会自动检测你的 CPU 核心数,并为每个核心启动一个工作进程。

Nginx 是一个异步服务器,这意味着每个工作进程都能处理成千上万个并发连接,不过实际数目还取决于 worker_connections 的设置这个设置在 Nginx 启动时生效,通常在 /etc/nginx/nginx.conf。

文件中配置Gunicorn 的 --workers:这个参数设置了 Gunicorn 应该启动多少个工作进程来运行你的 Python 应用Gunicorn 是一个 WSGI HTTP 服务器,用于运行 Python web 应用,如 Flask 或 Django。

Gunicorn 的工作进程是同步的,通常推荐的设置是 (2 x $num_cores) + 1,这意味着对于一个 4 核心的 CPU,你可能会设置为 9 个工作进程这个设置在 Gunicorn 启动时生效,可以在命令行中指定,也可以在 Gunicorn 的配置文件中设置。

区别和联系:区别: Nginx 主要处理静态内容、客户端连接和请求的反向代理,而 Gunicorn 作为应用服务器,运行你的 Python 代码Nginx 的工作进程可以非阻塞地处理多个连接,而 Gunicorn 的工作进程通常一次只处理一个请求。

联系: 在一个典型的部署中,Nginx 作为前端服务器,接收来自客户端的请求并将它们转发到 GunicornGunicorn 处理这些请求并返回响应给 Nginx,然后 Nginx 将响应返回给客户端在什么情况下生效

:Nginx 的 worker_processes 在 Nginx 启动时生效,影响 Nginx 如何处理入站连接和请求Gunicorn 的 --workers 在 Gunicorn 启动时生效,影响你的 Python 应用如何处理请求。

在配置这两个值时,需要考虑到服务器的 CPU 资源、内存资源、以及预期的负载对于高流量的应用,可能需要通过压力测试来确定最佳的工作进程数问题排查日志所在位置:/var/log/nginx/error.log。

/var/log/nginx/access.log检测配置合法性nginx -t域名映射DDNSTO方式DDNSTO 4M带宽1年26元,如果用户访问映射域名需要拥有者的微信验证,比较适合个人使用群晖的Ubuntu Docker将容器端口5000和22映射到对外端口,假设如下:。

image-20231104170131815使用DDNSTO的域名映射将9003端口映射到公网域名:

image-20231105161838154Ubuntu安装好openssh-server并配置root可链接,使用DDNSTO远程应用将9022端口映射到ssh应用,这样就可以通过网页来访问Ubuntu Docker的terminal了(

可选,用户名密码必填,否则可能出现连接不上的情况):

image-20231104170737719向日葵方式使用方式与DDNSTO类似,免费版1M带宽,2条映射,优点是每次访问映射域名不需要验证。最终测试使用MobaXterm的命令行工具测试:

image-20231105165251440大功告成!!!备注Flask/Gunicorn/Nginx三者关系理解Flask应用、WSGI服务器和NGINX之间的关系对于Web工程师来说非常重要这三者共同构成了Web应用的部署架构,每个部分都有其独特的职责和作用。

Flask AppFlask是一个轻量级的Web应用框架,用Python编写它提供了构建Web应用的基本工具和库,例如请求响应处理、路由、模板渲染等Flask应用是业务逻辑的核心,它定义了如何响应客户端的请求。

职责:处理HTTP请求和响应路由请求到正确的视图函数处理表单数据、文件上传等与数据库交互,执行CRUD操作渲染HTML模板WSGI服务器WSGI(Web Server Gateway Interface)是Python中定义的一个标准接口,它允许Web服务器与Web应用进行通信。

WSGI服务器的作用是作为Web应用和Web服务器(如NGINX)之间的桥梁职责:接收来自Web服务器(如NGINX)的客户端请求将请求转换为WSGI兼容的格式调用Flask应用并传递请求信息获取Flask应用的响应并转发回Web服务器。

常见的WSGI服务器有Gunicorn、uWSGI等NGINXNGINX是一个高性能的HTTP和反向代理服务器它可以处理静态文件、SSL终端、请求路由等职责:监听和接收来自客户端的HTTP请求作为反向代理,将请求转发到WSGI服务器。

提供静态文件服务,直接响应静态资源请求,减轻应用服务器的负担管理SSL/TLS,为应用提供加密的数据传输负载均衡,将请求分发到多个应用实例缓存内容,提高响应速度提供安全性保护,如防止DDoS攻击关系和工作流程

客户端请求: 客户端(如浏览器)发起一个HTTP请求NGINX接收: NGINX作为Web服务器,接收这个请求如果请求是对静态资源的请求,NGINX会直接响应转发给WSGI服务器: 如果请求需要动态处理(如数据库查询或模板渲染),NGINX会将请求转发给WSGI服务器。

WSGI服务器处理: WSGI服务器(如Gunicorn)接收请求,将其传递给Flask应用Flask应用处理: Flask应用处理请求,并返回响应给WSGI服务器WSGI服务器转发响应: WSGI服务器将Flask应用的响应返回给NGINX。

NGINX响应客户端: NGINX将最终响应发送回客户端这个流程确保了每个组件都能在其擅长的领域内工作,同时提供了灵活性、扩展性和安全性NGINX处理它擅长的静态文件和安全性,WSGI服务器处理Python应用的通信,而Flask则专注于业务逻辑。

Flask/Gunicorn/Nginx历史发展从历史的角度来看,Flask、WSGI服务器和NGINX的发展反映了Web技术的演进和对高效、可扩展Web应用的需求增长NGINXNGINX(发音为“engine-x”)是由俄罗斯程序员Igor Sysoev开发的,他在2002年开始编写代码,2004年首次公开发布。

NGINX是作为Apache HTTP Server的替代品而设计的,目的是解决C10k问题,即同时处理成千上万个网络连接的能力NGINX采用了异步事件驱动的架构,这使得它在处理高并发请求时非常高效随着时间的推移,NGINX不仅作为Web服务器使用,还常被用作负载均衡器和反向代理服务器。

WSGI服务器WSGI(Web Server Gateway Interface)是Python社区的一个重要发展,它定义了Web服务器和Python Web应用之间的标准接口在WSGI之前,Python的Web应用框架(如Zope, Django等)通常有自己的服务器网关接口,这导致了服务器和应用之间的紧密耦合,限制了框架的选择和部署灵活性。

WSGI标准的提出是在2003年,由Phillip J. Eby提出的PEP 333这个标准的目的是为了促进Web服务器和Web应用或框架之间的可互操作性随后,WSGI服务器如Gunicorn、uWSGI等成为了连接Web服务器和Python应用的标准方式。

FlaskFlask是较晚出现的Python Web框架,由Armin Ronacher于2010年发布它是基于Werkzeug WSGI工具箱和Jinja2模板引擎的Flask的设计哲学是“微框架”,即保持核心简单但可扩展。

它没有提供诸如数据库抽象层、表单验证或任何其他已有多种库可以完成的功能这种设计哲学使得Flask非常灵活,适用于小型项目到大型企业应用发展的融合随着时间的推进,这三者开始相互融合,形成了现代Web应用的标准部署模式。

Flask提供了快速开发的能力,WSGI服务器提供了与Web服务器通信的标准方式,而NGINX则提供了高性能的静态文件处理和请求代理这种分离的架构允许开发者选择最适合他们需求的组件,同时也促进了Python Web应用的快速发展和部署。

随着云计算和容器化技术的兴起,这种模式进一步得到了强化,因为它们提供了更高的灵活性和可扩展性


上一篇: 常用seo查询工具_如何用"高级搜索指令"开发谷歌客户? 下一篇:seo网站综合查询_Python重点知识万字汇总
返回顶部