Nginx配置管理與Flask登錄日志查詢優(yōu)化實(shí)戰(zhàn)指南
引言
在 Web 開發(fā)和服務(wù)器運(yùn)維中,Nginx 的配置管理和后端 API 的數(shù)據(jù)查詢優(yōu)化是常見的需求。本文將通過(guò)兩個(gè)典型場(chǎng)景進(jìn)行詳細(xì)講解:
- Nginx 新增配置如何生效而不影響現(xiàn)有服務(wù)
- Flask 后端如何優(yōu)化登錄日志查詢,使其按時(shí)間倒序排列
文章包含詳細(xì)的操作步驟、代碼示例和優(yōu)化建議,適合運(yùn)維工程師和 Python 開發(fā)者閱讀。
第一部分:Nginx 新增配置生效管理
1. 背景
假設(shè)我們有一個(gè) Nginx 服務(wù)器,現(xiàn)有配置文件 /etc/nginx/conf.d/doudian.conf,現(xiàn)在需要新增 doudian_v2.conf 但不影響當(dāng)前服務(wù)。
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 配置語(yǔ)法
nginx -t
如果輸出 syntax is ok,說(shuō)明配置正確。
(3) 平滑重載 Nginx
nginx -s reload
這樣不會(huì)中斷現(xiàn)有連接,新配置 doudian_v2.conf 會(huì)生效。
(4) 驗(yàn)證新配置
nginx -T | grep doudian_v2
如果輸出包含 doudian_v2.conf 的內(nèi)容,說(shuō)明配置已加載。
(5) 避免配置沖突
- 監(jiān)聽相同端口和域名:Nginx 會(huì)按文件名順序加載,可能導(dǎo)致沖突。
- 解決方案:
- 使用不同的
server_name - 或使用不同的端口(如
listen 8080)
- 使用不同的
(6) 回滾方案
如果新配置出現(xiàn)問(wèn)題:
mv /etc/nginx/conf.d/doudian_v2.conf /etc/nginx/conf.d/doudian_v2.conf.bak nginx -s reload
3. 關(guān)鍵點(diǎn)總結(jié)
| 步驟 | 命令 | 說(shuō)明 |
|---|---|---|
| 檢查配置 | nginx -t | 確保語(yǔ)法正確 |
| 重載配置 | nginx -s reload | 不中斷服務(wù)生效 |
| 驗(yàn)證配置 | nginx -T | 檢查是否加載 |
| 沖突管理 | 不同 server_name 或端口 | 避免新舊配置沖突 |
| 回滾 | mv + reload | 快速恢復(fù) |
第二部分:Flask 登錄日志查詢優(yōu)化
1. 背景
現(xiàn)有 Flask 登錄日志查詢未排序,需改為按 login_time 倒序排列(最新記錄在前)。
2. 優(yōu)化方案
(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
}
問(wèn)題:未指定排序方式,可能導(dǎo)致數(shù)據(jù)無(wú)序返回。
(2) 優(yōu)化后的代碼
@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
}
優(yōu)化點(diǎn):
- 使用
order_by(LoginLog.login_time.desc())確保最新記錄在前。 - 增加異常處理,避免因查詢錯(cuò)誤導(dǎo)致 API 崩潰。
(3) 日志記錄優(yōu)化
import logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
避免使用 print(),改用標(biāo)準(zhǔn)日志模塊。
3. 關(guān)鍵點(diǎn)總結(jié)
| 優(yōu)化項(xiàng) | 原代碼問(wèn)題 | 優(yōu)化方案 |
|---|---|---|
| 排序 | 未指定順序 | order_by(LoginLog.login_time.desc()) |
| 異常處理 | 無(wú)錯(cuò)誤捕獲 | 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):
"""分頁(yè)查詢登錄日志,按時(shí)間倒序排列"""
try:
query = db.session.query(LoginLog)
if username:
query = query.filter(LoginLog.username.like(f"%{username}%"))
# 關(guān)鍵優(yōu)化:按 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"]
})
第四部分:總結(jié)與最佳實(shí)踐
1. Nginx 配置管理最佳實(shí)踐
- 每次修改配置前先
nginx -t檢查語(yǔ)法。 - 使用
nginx -s reload平滑重載,避免服務(wù)中斷。 - 新舊配置避免監(jiān)聽相同
server_name和端口。
2. Flask 查詢優(yōu)化最佳實(shí)踐
- 排序:使用
order_by確保數(shù)據(jù)有序返回。 - 分頁(yè):使用
paginate或limit/offset提高性能。 - 異常處理:避免 API 因數(shù)據(jù)庫(kù)錯(cuò)誤崩潰。
- 日志記錄:使用
logging替代print,方便排查問(wèn)題。
結(jié)語(yǔ)
本文通過(guò) Nginx 配置管理和 Flask 查詢優(yōu)化兩個(gè)案例,詳細(xì)講解了運(yùn)維和開發(fā)中的常見問(wèn)題及解決方案。希望讀者能從中受益,并在實(shí)際工作中應(yīng)用這些優(yōu)化技巧。
以上就是Nginx配置管理與Flask登錄日志查詢優(yōu)化實(shí)戰(zhàn)指南的詳細(xì)內(nèi)容,更多關(guān)于Nginx配置管理與Flask日志查詢的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Nginx服務(wù)器上搭建圖片緩存服務(wù)的基本配置解析
這篇文章主要介紹了Nginx服務(wù)器上搭建圖片緩存服務(wù)的基本配置解析,分別介紹了通過(guò)proxy_store模塊和proxy_cache模塊兩種方式的配置,需要的朋友可以參考下2016-04-04
Nginx反向代理實(shí)現(xiàn)Vue跨域的示例
本文主要介紹了Nginx反向代理實(shí)現(xiàn)Vue跨域的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
nginx 配置location匹配規(guī)則實(shí)例講解
在本篇文章里小編給大家整理的是關(guān)于nginx 配置location匹配規(guī)則實(shí)例講解內(nèi)容,需要的朋友們學(xué)習(xí)下。2020-03-03
Nginx 如何限制訪問(wèn)頻率,下載速率和并發(fā)連接數(shù)的方法
這篇文章主要介紹了Nginx 如何限制訪問(wèn)頻率,下載速率和并發(fā)連接數(shù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08

