引言
在 web 开发和服务器运维中,nginx 的配置管理和后端 api 的数据查询优化是常见的需求。本文将通过两个典型场景进行详细讲解:
- nginx 新增配置如何生效而不影响现有服务
- flask 后端如何优化登录日志查询,使其按时间倒序排列
文章包含详细的操作步骤、代码示例和优化建议,适合运维工程师和 python 开发者阅读。
第一部分:nginx 新增配置生效管理
1. 背景
假设我们有一个 nginx 服务器,现有配置文件 /etc/nginx/conf.d/doudian.conf
,现在需要新增 doudian_v2.conf
但不影响当前服务。
2. 操作步骤
(1) 检查 nginx 配置目录
cd /etc/nginx/conf.d ls -l
输出示例:
-rw-r--r-- 1 root root 1159 may 5 09:07 doudian.conf -rw-r--r-- 1 root root 1162 may 16 00:38 doudian_v2.conf
(2) 检查 nginx 配置语法
nginx -t
如果输出 syntax is ok
,说明配置正确。
(3) 平滑重载 nginx
nginx -s reload
这样不会中断现有连接,新配置 doudian_v2.conf
会生效。
(4) 验证新配置
nginx -t | grep doudian_v2
如果输出包含 doudian_v2.conf
的内容,说明配置已加载。
(5) 避免配置冲突
- 监听相同端口和域名:nginx 会按文件名顺序加载,可能导致冲突。
- 解决方案:
- 使用不同的
server_name
- 或使用不同的端口(如
listen 8080
)
- 使用不同的
(6) 回滚方案
如果新配置出现问题:
mv /etc/nginx/conf.d/doudian_v2.conf /etc/nginx/conf.d/doudian_v2.conf.bak nginx -s reload
3. 关键点总结
步骤 | 命令 | 说明 |
---|---|---|
检查配置 | nginx -t | 确保语法正确 |
重载配置 | nginx -s reload | 不中断服务生效 |
验证配置 | nginx -t | 检查是否加载 |
冲突管理 | 不同 server_name 或端口 | 避免新旧配置冲突 |
回滚 | mv + reload | 快速恢复 |
第二部分:flask 登录日志查询优化
1. 背景
现有 flask 登录日志查询未排序,需改为按 login_time
倒序排列(最新记录在前)。
2. 优化方案
(1) 原代码分析
@staticmethod def login_log_list(page=1, page_size=10, username=none): query = db.session.query(loginlog) if username: query = query.filter(loginlog.username.like(f"%{username}%")) pagination = query.paginate(page=page, per_page=page_size) return { "data": [login_log.to_dict() for login_log in pagination.items], "total": pagination.total, "page": page, "page_size": page_size }
问题:未指定排序方式,可能导致数据无序返回。
(2) 优化后的代码
@staticmethod def login_log_list(page=1, page_size=10, username=none): try: query = db.session.query(loginlog) if username: query = query.filter(loginlog.username.like(f"%{username}%")) # 按 login_time 降序排列 query = query.order_by(loginlog.login_time.desc()) pagination = query.paginate( page=page, per_page=page_size, error_out=false ) return { "data": [login_log.to_dict() for login_log in pagination.items], "total": pagination.total, "page": page, "page_size": page_size } except exception as e: logging.error(f"error fetching login logs: {e}") return { "data": [], "total": 0, "page": page, "page_size": page_size }
优化点:
- 使用
order_by(loginlog.login_time.desc())
确保最新记录在前。 - 增加异常处理,避免因查询错误导致 api 崩溃。
(3) 日志记录优化
import logging logging.basicconfig( level=logging.info, format='%(asctime)s - %(levelname)s - %(message)s' )
避免使用 print()
,改用标准日志模块。
3. 关键点总结
优化项 | 原代码问题 | 优化方案 |
---|---|---|
排序 | 未指定顺序 | order_by(loginlog.login_time.desc()) |
异常处理 | 无错误捕获 | try-except + logging.error |
日志管理 | 使用 print | 改用 logging 模块 |
第三部分:完整代码示例
1. nginx 配置示例
/etc/nginx/conf.d/doudian_v2.conf
:
server { listen 8080; server_name example.com; location / { proxy_pass http://backend_v2; } }
2. flask 登录日志查询完整代码
from datetime import datetime from flask import jsonify, request from extensions.ext_database import db from models.model import loginlog, user import logging logging.basicconfig(level=logging.info) class userservice: @staticmethod def login_log_list(page=1, page_size=10, username=none): """分页查询登录日志,按时间倒序排列""" try: query = db.session.query(loginlog) if username: query = query.filter(loginlog.username.like(f"%{username}%")) # 关键优化:按 login_time 降序排列 query = query.order_by(loginlog.login_time.desc()) pagination = query.paginate( page=page, per_page=page_size, error_out=false ) return { "data": [login_log.to_dict() for login_log in pagination.items], "total": pagination.total, "page": page, "page_size": page_size } except exception as e: logging.error(f"error fetching login logs: {e}") return { "data": [], "total": 0, "page": page, "page_size": page_size } # flask api 路由示例 @app.route("/api/login_logs", methods=["post"]) def get_login_logs(): data = request.json page = data.get("page", 1) page_size = data.get("page_size", 10) username = data.get("username") result = userservice.login_log_list(page, page_size, username) return jsonify({ "code": 200, "result": "success", "data": result["data"], "page": page, "page_size": page_size, "total": result["total"] })
第四部分:总结与最佳实践
1. nginx 配置管理最佳实践
- 每次修改配置前先
nginx -t
检查语法。 - 使用
nginx -s reload
平滑重载,避免服务中断。 - 新旧配置避免监听相同
server_name
和端口。
2. flask 查询优化最佳实践
- 排序:使用
order_by
确保数据有序返回。 - 分页:使用
paginate
或limit/offset
提高性能。 - 异常处理:避免 api 因数据库错误崩溃。
- 日志记录:使用
logging
替代print
,方便排查问题。
结语
本文通过 nginx 配置管理和 flask 查询优化两个案例,详细讲解了运维和开发中的常见问题及解决方案。希望读者能从中受益,并在实际工作中应用这些优化技巧。
以上就是nginx配置管理与flask登录日志查询优化实战指南的详细内容,更多关于nginx配置管理与flask日志查询的资料请关注代码网其它相关文章!
发表评论