在 Web 开发和服务器运维中,Nginx 的配置管理和后端 API 的数据查询优化是常见的需求。本文将通过两个典型场景进行详细讲解:
文章包含详细的操作步骤、代码示例和优化建议,适合运维工程师和 Python 开发者阅读。
假设我们有一个 Nginx 服务器,现有配置文件 /etc/nginx/conf.d/doudian.conf,现在需要新增 doudian_v2.conf 但不影响当前服务。
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.confnginx -t如果输出 syntax is ok,说明配置正确。
nginx -s reload这样不会中断现有连接,新配置 doudian_v2.conf 会生效。
nginx -T | grep doudian_v2如果输出包含 doudian_v2.conf 的内容,说明配置已加载。
server_namelisten 8080)如果新配置出现问题:
mv /etc/nginx/conf.d/doudian_v2.conf /etc/nginx/conf.d/doudian_v2.conf.bak
nginx -s reload步骤 | 命令 | 说明 |
|---|---|---|
检查配置 | nginx -t | 确保语法正确 |
重载配置 | nginx -s reload | 不中断服务生效 |
验证配置 | nginx -T | 检查是否加载 |
冲突管理 | 不同 server_name 或端口 | 避免新旧配置冲突 |
回滚 | mv + reload | 快速恢复 |
现有 Flask 登录日志查询未排序,需改为按 login_time 倒序排列(最新记录在前)。
@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
}问题:未指定排序方式,可能导致数据无序返回。
@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()) 确保最新记录在前。import logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)避免使用 print(),改用标准日志模块。
优化项 | 原代码问题 | 优化方案 |
|---|---|---|
排序 | 未指定顺序 | order_by(LoginLog.login_time.desc()) |
异常处理 | 无错误捕获 | try-except + logging.error |
日志管理 | 使用 print | 改用 logging 模块 |
/etc/nginx/conf.d/doudian_v2.conf:
server {
listen 8080;
server_name example.com;
location / {
proxy_pass http://backend_v2;
}
}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"]
})nginx -t 检查语法。nginx -s reload 平滑重载,避免服务中断。server_name 和端口。order_by 确保数据有序返回。paginate 或 limit/offset 提高性能。logging 替代 print,方便排查问题。本文通过 Nginx 配置管理和 Flask 查询优化两个案例,详细讲解了运维和开发中的常见问题及解决方案。希望读者能从中受益,并在实际工作中应用这些优化技巧。
如果你有任何问题或建议,欢迎留言讨论! 🚀