Nginx配置管理与Flask登录日志查询优化实战指南

 更新时间:2025年05月16日 11:06:32   作者:码农阿豪@新空间  
在 Web 开发和服务器运维中,Nginx 的配置管理和后端 API 的数据查询优化是常见的需求,本文将通过两个典型场景进行详细讲解文章包含详细的操作步骤、代码示例和优化建议,需要的朋友可以参考下

引言

在 Web 开发和服务器运维中,Nginx 的配置管理和后端 API 的数据查询优化是常见的需求。本文将通过两个典型场景进行详细讲解:

  1. Nginx 新增配置如何生效而不影响现有服务
  2. 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日志查询的资料请关注脚本之家其它相关文章!

相关文章

  • nginx中配置pathinfo模式示例

    nginx中配置pathinfo模式示例

    这篇文章主要介绍了nginx中配置pathinfo模式示例,本文详细记录了摸索过程和成功的配置案例,需要的朋友可以参考下
    2014-08-08
  • 使用Nginx反向代理到go-fastdfs的方法示例

    使用Nginx反向代理到go-fastdfs的方法示例

    这篇文章主要介绍了使用Nginx反向代理到go-fastdfs的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • Nginx服务器上搭建图片缓存服务的基本配置解析

    Nginx服务器上搭建图片缓存服务的基本配置解析

    这篇文章主要介绍了Nginx服务器上搭建图片缓存服务的基本配置解析,分别介绍了通过proxy_store模块和proxy_cache模块两种方式的配置,需要的朋友可以参考下
    2016-04-04
  • Nginx反向代理实现Vue跨域的示例

    Nginx反向代理实现Vue跨域的示例

    本文主要介绍了Nginx反向代理实现Vue跨域的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 关于nginx proxy_set部分常见配置

    关于nginx proxy_set部分常见配置

    这篇文章主要介绍了关于nginx proxy_set部分常见配置,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • 欧拉部署nginx的实现步骤

    欧拉部署nginx的实现步骤

    本文主要介绍了欧拉部署nginx的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • nginx 配置location匹配规则实例讲解

    nginx 配置location匹配规则实例讲解

    在本篇文章里小编给大家整理的是关于nginx 配置location匹配规则实例讲解内容,需要的朋友们学习下。
    2020-03-03
  • Nginx代理中使用斜杠的区别小结

    Nginx代理中使用斜杠的区别小结

    在使用nginx代理的过程中,斜线是一个非常重要的符号,因为它涉及到了请求路径的匹配问题,本文主要介绍了Nginx代理中使用斜杠的区别小结,感兴趣的可以了解一下
    2023-09-09
  • Nginx 如何限制访问频率,下载速率和并发连接数的方法

    Nginx 如何限制访问频率,下载速率和并发连接数的方法

    这篇文章主要介绍了Nginx 如何限制访问频率,下载速率和并发连接数的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Nginx负载均衡中的Memcached缓存模块

    Nginx负载均衡中的Memcached缓存模块

    Nginx 的 ngx_http_memcached_module 模块本身并没有提供缓存功能,它只是一个将用户请求转发到 Memcached 服务器的代理模块,这篇文章主要介绍了Nginx负载均衡之Memcached缓存模块,需要的朋友可以参考下
    2024-06-06

最新评论