Nginx七層(應用層)反向代理:UWSGI代理uwsgi_pass篇

Nginx七層(應用層)反向代理
UWSGI代理uwsgi_pass篇

- 文章信息 - Author: 李俊才 (jcLee95)
Visit me at CSDN: https://jclee95.blog.csdn.net
My WebSitehttp://thispage.tech/
Email: 291148484@163.com.
Shenzhen China
Address of this article:https://blog.csdn.net/qq_28550263/article/details/140253227
HuaWei:https://bbs.huaweicloud.com/blogs/XXXXXXXXXX

【介紹】:Nginx提供了多種應用層反向代理支持,包括proxy_pass、uwsgi_pass、fastcgi_pass和scgi_pass等。其中,proxy_pass指令可以接受一個URL參數,用于實現對HTTP/HTTPS協議的反向代理;uwsgi_pass用于代理到uWSGI應用服務器;fastcgi_pass用于代理到FastCGI服務器;而scgi_pass則用于代理到SCGI(Simple Common Gateway Interface)應用。這些指令使Nginx能夠靈活地處理不同類型的后端服務和應用程序。本文介紹的重點是proxy_pass。


相關文章:
Nginx七層反向代理:HTTP反向代理proxy_pass篇

Nginx七層反向代理:UWSGI代理uwsgi_pass篇
Nginx七層反向代理:SCGI代理scgi_pass篇
Nginx七層反向代理:FastCGI代理fastcgi_pass篇

在這里插入圖片描述


1. 概述

1.1 什么是反向代理

反向代理是一種常見的服務器架構模式,它位于用戶和原始服務器之間,接收用戶的請求并將其轉發到一個或多個后端服務器。然后,反向代理將從后端服務器獲取的響應返回給用戶,就好像這些內容都是由代理服務器本身直接提供的一樣。

在這個過程中,用戶只與反向代理服務器進行直接交互,而不知道后端服務器的存在。這種架構為系統提供了額外的抽象和控制層,使得系統管理員能夠靈活地部署和管理后端資源,同時為用戶提供一致的訪問體驗。

反向代理與正向代理有所不同。正向代理主要用于幫助客戶端訪問其無法直接訪問的資源,而反向代理則是代表服務器接收并處理來自客戶端的請求。

1.2 為什么需要反向代理

反向代理通過隱藏后端服務器的IP地址和架構細節,增強了系統安全性。管理員可以在反向代理服務器上集中實施SSL/TLS加密、訪問控制和防火墻規則,從而減輕后端服務器的安全管理負擔。

反向代理實現負載均衡,將請求分發到多個后端服務器。這種機制提高了系統吞吐量,能夠處理更高的并發請求,同時改善響應時間。

緩存功能存儲靜態內容和常訪問的動態內容,減少后端服務器負載,加快內容交付速度。對高流量網站,緩存降低服務器壓力和帶寬消耗。

內容壓縮減少帶寬使用,加快頁面加載速度。移動用戶和網絡條件欠佳地區的用戶從中受益。

URL重寫和重定向優化路由邏輯。例如,將/api/v1的請求重寫到實際后端服務路徑,無需修改客戶端代碼,簡化API設計和版本管理。

系統擴展性通過添加或移除后端服務器來調整系統容量,客戶端無需感知這些變化。這種透明的擴展能力應對流量波動和系統升級。

在微服務架構中,反向代理作為API網關,統一處理認證、限流、監控等橫切關注點。各個微服務的實現得以簡化,開發團隊專注于核心業務邏輯。

A/B測試和金絲雀發布通過配置規則,將部分流量導向新版本服務,實現功能平穩迭代和風險控制。

2. UWSGI協議簡介

2.1 UWSGI協議的特點

UWSGI協議是一種二進制協議,專為Web服務器和Web應用程序之間的通信而設計。它采用二進制格式傳輸數據,相比文本協議如HTTP,能夠更高效地處理請求和響應。

UWSGI協議使用簡單的數據包結構,包含頭部和主體兩部分。頭部包含數據包長度和變量數量等信息,主體包含實際的鍵值對數據。這種結構使得數據解析和處理變得快速高效。

該協議支持多種數據類型,包括字符串、整數和自定義類型,允許靈活傳輸不同格式的信息。它還提供了豐富的環境變量支持,可以傳遞請求相關的詳細信息。

UWSGI協議具有可擴展性,允許添加自定義頭部和變量,以滿足特定應用程序的需求。這種靈活性使得它能夠適應各種復雜的Web應用場景。

2.2 UWSGI vs HTTP協議

UWSGI協議與HTTP協議在設計目標和應用場景上有明顯區別。HTTP協議主要用于客戶端和服務器之間的通信,而UWSGI協議專注于服務器內部組件之間的通信。

性能方面,UWSGI協議通常比HTTP協議更高效。它的二進制格式減少了數據傳輸量,降低了解析開銷。相比之下,HTTP協議的文本格式雖然人類可讀,但在高并發場景下可能導致更多的處理開銷。

UWSGI協議的設計更加緊湊,減少了冗余信息。它省略了HTTP協議中的一些頭部字段,如用戶代理和接受語言等,這些信息在服務器內部通信中通常不需要。

然而,UWSGI協議的使用范圍較窄,主要限于Web服務器和應用服務器之間。HTTP協議則具有更廣泛的應用,包括瀏覽器、移動應用和API調用等各種場景。

2.3 UWSGI在Web應用中的角色

UWSGI協議在Web應用架構中充當了Web服務器和應用服務器之間的橋梁。它允許Web服務器(如Nginx)將請求高效地傳遞給應用服務器(如uWSGIGunicorn)。

在典型的部署中,Nginx作為前端服務器接收客戶端請求,然后通過UWSGI協議將這些請求轉發給后端的PythonRubyPHP應用程序。這種架構提高了整體系統的性能和可擴展性。

UWSGI協議使得Web服務器能夠更好地管理連接和請求分發。它支持長連接和請求復用,減少了連接建立和斷開的開銷,提高了系統的并發處理能力。

對于Python Web應用,UWSGI協議與WSGIWeb服務器網關接口)標準兼容。這意味著使用UWSGI協議的服務器可以無縫地與遵循WSGI標準的Python應用程序集成。

UWSGI協議還支持進程管理和監控功能,使得應用服務器可以動態調整工作進程數量,實現負載均衡和故障恢復。這些特性增強了Web應用的穩定性和可靠性。

3. Nginx中的uwsgi_pass指令

3.1 uwsgi_pass指令的基本語法

uwsgi_pass指令在Nginx配置中用于將請求轉發到運行uWSGI協議的后端服務器。其基本語法如下:

uwsgi_pass backend;

這里的backend可以是以下幾種形式:

  • IP地址加端口號:uwsgi_pass 127.0.0.1:8000;
  • Unix域套接字路徑:uwsgi_pass unix:/tmp/uwsgi.sock;
  • 上游服務器組名稱:uwsgi_pass myapp;

uwsgi_pass指令通常放在location塊內,用于指定特定URL路徑的請求處理方式。例如:

location /myapp {uwsgi_pass 127.0.0.1:8000;
}

此配置將所有/myapp路徑的請求轉發到本地8000端口的uWSGI服務器。

3.2 uwsgi_pass vs proxy_pass

uwsgi_passproxy_pass都是Nginx中用于請求轉發的指令,但它們針對不同的協議和應用場景。

uwsgi_pass專門用于與使用uWSGI協議的后端服務器通信。它理解并處理uWSGI協議的特定格式和頭部,適用于PythonRuby等使用uWSGI服務器的應用。

proxy_pass是一個通用的反向代理指令,主要用于HTTP協議。它可以將請求轉發到任何支持HTTP的后端服務器,包括其他Web服務器、應用服務器或API服務。

使用uwsgi_pass時,Nginx會自動添加必要的uWSGI協議頭部,而proxy_pass則保持原始的HTTP請求格式。

在性能方面,對于支持uWSGI協議的應用,uwsgi_pass通常比proxy_pass更高效,因為它避免了HTTPuWSGI的協議轉換開銷。

3.3 uwsgi_pass的工作原理

Nginx接收到客戶端請求后,uwsgi_pass指令觸發以下處理流程:

Nginx解析客戶端的HTTP請求,提取相關信息如URL、請求方法、頭部等。

Nginx將這些信息轉換為uWSGI協議格式,包括創建uWSGI數據包頭部和正文。

Nginx通過配置的后端地址(TCP套接字或Unix域套接字)建立與uWSGI服務器的連接。

Nginx將轉換后的uWSGI請求發送給后端服務器。

后端uWSGI服務器處理請求并生成響應。

Nginx接收uWSGI服務器的響應,將其轉換回HTTP格式。

Nginx將轉換后的HTTP響應發送給客戶端。

這個過程中,Nginx充當了HTTPuWSGI協議之間的轉換器,使得客戶端和uWSGI應用服務器能夠無縫通信。uwsgi_pass指令還處理連接池管理、超時控制、錯誤處理等細節,確保高效可靠的請求轉發。

4. 配置Nginx使用uwsgi_pass

4.1 基本配置示例

Nginx中使用uwsgi_pass的基本配置示例展示了如何將請求轉發到運行uWSGI協議的后端服務器。這個配置通常包含在Nginx的服務器塊或位置塊中。例如:

server {listen 80;server_name example.com;location / {uwsgi_pass 127.0.0.1:8000;include uwsgi_params;}
}

在這個例子中,server塊定義了一個監聽80端口的虛擬主機,域名為example.comlocation /塊指定了對根路徑的請求處理方式。

uwsgi_pass 127.0.0.1:8000;指令告訴Nginx將請求轉發到本地運行在8000端口的uWSGI服務器。這里使用的是TCP套接字連接。

include uwsgi_params;指令包含了一個預定義的配置文件,其中包含了一系列uWSGI參數。這些參數確保Nginx正確地將HTTP請求轉換為uWSGI格式。

對于使用Unix域套接字的情況,配置可以修改如下:

location / {uwsgi_pass unix:/tmp/uwsgi.sock;include uwsgi_params;
}

這里,uwsgi_pass指向一個Unix域套接字文件,通常提供比TCP套接字更好的性能,特別是在同一臺機器上運行NginxuWSGI服務器時。

如果需要對靜態文件進行特殊處理,可以添加額外的位置塊:

location /static {alias /path/to/static/files;
}location / {uwsgi_pass 127.0.0.1:8000;include uwsgi_params;
}

這個配置將/static路徑下的請求直接映射到服務器上的靜態文件目錄,而其他請求則轉發到uWSGI服務器。

對于需要設置特定uWSGI參數的情況,可以在位置塊中直接指定:

location / {uwsgi_pass 127.0.0.1:8000;include uwsgi_params;uwsgi_param UWSGI_SCHEME $scheme;uwsgi_param UWSGI_CHDIR /path/to/your/project;uwsgi_param UWSGI_SCRIPT your_wsgi_module_name:application;
}

這里,uwsgi_param指令用于設置額外的uWSGI參數,如項目目錄和WSGI腳本位置。

4.2 upstream模塊的使用

Nginx的upstream模塊允許定義一組服務器,可用于負載均衡和故障轉移。在使用uwsgi_pass時,upstream模塊特別有用,因為它可以將請求分發到多個uWSGI后端服務器。

upstream塊通常定義在Nginx配置文件的http上下文中,位于server塊之外。基本語法如下:

upstream backend_name {server backend1.example.com:8000;server backend2.example.com:8000;server backend3.example.com:8000;
}

在這個例子中,"backend_name"是自定義的上游服務器組名稱,后面列出了三個后端服務器。

定義好upstream后,可以在uwsgi_pass指令中引用它:

location / {uwsgi_pass backend_name;include uwsgi_params;
}

這樣,Nginx會自動在定義的后端服務器之間分發請求。

upstream模塊支持多種負載均衡算法。默認情況下,Nginx使用加權輪詢算法。可以通過在server指令后添加參數來調整權重:

upstream backend_name {server backend1.example.com:8000 weight=3;server backend2.example.com:8000;server backend3.example.com:8000;
}

在這個配置中,backend1的權重為3,而其他服務器的默認權重為1。這意味著backend1將接收大約60%的請求。

除了輪詢,Nginx還支持其他負載均衡方法。例如,最少連接數方法:

upstream backend_name {least_conn;server backend1.example.com:8000;server backend2.example.com:8000;server backend3.example.com:8000;
}

least_conn指令指示Nginx將請求發送到當前活動連接數最少的服務器。

對于需要會話一致性的應用,可以使用ip_hash方法:

upstream backend_name {ip_hash;server backend1.example.com:8000;server backend2.example.com:8000;server backend3.example.com:8000;
}

ip_hash確保來自同一IP地址的請求總是被發送到同一個后端服務器,除非該服務器不可用。

upstream模塊還提供了服務器健康檢查和故障轉移功能。可以使用max_failsfail_timeout參數來配置:

upstream backend_name {server backend1.example.com:8000 max_fails=3 fail_timeout=30s;server backend2.example.com:8000 max_fails=3 fail_timeout=30s;server backend3.example.com:8000 max_fails=3 fail_timeout=30s;
}

這個配置指定如果一個服務器在30秒內失敗3次,它將被標記為不可用30秒。

對于需要備用服務器的情況,可以使用backup參數:

upstream backend_name {server backend1.example.com:8000;server backend2.example.com:8000;server backend3.example.com:8000 backup;
}

標記為backup的服務器只有在其他服務器都不可用時才會接收請求。

通過合理配置upstream模塊,可以顯著提高Web應用的可用性、性能和可擴展性。它使得Nginx能夠智能地分發請求,處理后端服務器的故障,并優化資源利用。

4.3 Unix socket vs TCP socket

在配置Nginx使用uwsgi_pass時,我們可以選擇使用Unix域套接字或TCP套接字來連接后端的uWSGI服務器。這兩種方式各有優缺點,選擇哪種方式取決于具體的部署環境和性能需求。

Unix域套接字是一種進程間通信機制,它使用文件系統中的特殊文件作為通信端點。在Nginx配置中,Unix域套接字的使用方式如下:

uwsgi_pass unix:/path/to/your/uwsgi.sock;

Unix域套接字的主要優勢在于其性能。由于它們不需要經過網絡協議棧,因此在同一臺機器上的進程間通信時,Unix域套接字通常比TCP套接字更快。它們減少了數據復制和上下文切換的次數,從而降低了延遲并提高了吞吐量。

另一個優點是安全性。Unix域套接字文件可以使用文件系統權限來控制訪問,這提供了一個額外的安全層。只有具有適當權限的進程才能連接到套接字。

然而,Unix域套接字也有其局限性。它們只能用于同一臺機器上的進程間通信,不能跨網絡使用。這意味著如果NginxuWSGI服務器需要運行在不同的機器上,就不能使用Unix域套接字。

相比之下,TCP套接字使用IP地址和端口號作為通信端點。在Nginx配置中,TCP套接字的使用方式如下:

uwsgi_pass 127.0.0.1:8000;

TCP套接字的主要優勢是靈活性。它們可以用于本地和遠程通信,允許NginxuWSGI服務器運行在不同的機器上。這種靈活性使得系統更容易擴展,因為可以輕松地添加更多的后端服務器。

TCP套接字還提供了更好的負載均衡能力。使用Nginx的upstream模塊,可以輕松地在多個后端服務器之間分發請求,這在使用Unix域套接字時較難實現。

然而,TCP套接字的性能通常略低于Unix域套接字,特別是在高并發場景下。這是因為TCP通信涉及更多的系統調用和數據復制操作。

在選擇使用哪種套接字時,需要考慮幾個因素。如果NginxuWSGI服務器運行在同一臺機器上,并且性能是首要考慮因素,那么Unix域套接字可能是更好的選擇。如果需要跨機器通信或者系統可能需要橫向擴展,那么TCP套接字會更合適。

在實際部署中,可以通過性能測試來確定哪種方式更適合特定的應用場景。有時,即使NginxuWSGI在同一臺機器上,使用TCP套接字也可能更方便管理和監控。

無論選擇哪種方式,都應確保正確設置權限和安全措施。對于Unix域套接字,要注意設置適當的文件權限。對于TCP套接字,考慮使用防火墻規則限制訪問,并在可能的情況下使用SSL/TLS加密通信。

5. uwsgi_pass的高級配置

5.1 超時設置

Nginx中配置uwsgi_pass時,合理設置超時參數對于保證系統的穩定性和性能至關重要。超時設置可以防止長時間運行的請求占用過多資源,同時也能在后端服務器無響應時快速失敗,提高用戶體驗。

uwsgi_read_timeout指令用于設置NginxuWSGI服務器讀取響應的超時時間。默認值為60秒。如果在指定時間內Nginx沒有從uWSGI服務器接收到數據,連接將被關閉,并向客戶端返回錯誤。例如,設置5分鐘的讀取超時:

uwsgi_read_timeout 300s;

uwsgi_send_timeout指令控制NginxuWSGI服務器發送請求的超時時間。這個超時同樣默認為60秒。如果在指定時間內Nginx無法將請求發送完畢,連接將被關閉。可以這樣設置2分鐘的發送超時:

uwsgi_send_timeout 120s;

uwsgi_connect_timeout指令定義了NginxuWSGI服務器建立連接的超時時間。默認值為60秒。如果在這個時間內無法建立連接,Nginx將嘗試下一個服務器或返回錯誤。例如,設置30秒的連接超時:

uwsgi_connect_timeout 30s;

這些超時設置可以在http、server或location塊中配置,根據需要選擇合適的作用域。通常,在處理復雜請求或大文件上傳時,可能需要增加這些超時值。例如,對于文件上傳接口,可以這樣配置:

location /upload {uwsgi_pass backend;uwsgi_read_timeout 300s;uwsgi_send_timeout 300s;client_max_body_size 50m;
}

這里將讀取和發送超時都設置為5分鐘,并允許最大50MB的上傳文件大小。

對于需要長時間處理的API請求,可以單獨設置更長的超時:

location /api/long-running {uwsgi_pass backend;uwsgi_read_timeout 600s;
}

這個配置為特定的API端點設置了10分鐘的讀取超時。

在設置超時時,需要考慮應用程序的特性和用戶體驗。過短的超時可能導致正常請求被中斷,而過長的超時則可能造成資源浪費。理想的做法是根據應用程序的實際需求和性能特征來調整這些值。

此外,還應該考慮與uWSGI服務器端的超時設置保持一致。如果Nginx的超時設置比uWSGI服務器的短,可能會導致一些請求在uWSGI服務器處理完成前就被Nginx中斷。

在生產環境中,建議監控這些超時事件的發生頻率。如果發現特定類型的請求經常觸發超時,可能需要優化應用程序的性能或調整超時設置。通過日志分析和性能監控,可以不斷優化這些參數,以達到最佳的平衡點。

5.2 緩沖區配置

Nginx中配置uwsgi_pass時,合理設置緩沖區參數對于優化性能和資源利用至關重要。緩沖區配置允許Nginx在將響應發送給客戶端之前,先從uWSGI服務器接收并存儲響應內容。這種機制可以提高大型響應的處理效率,減少網絡延遲對性能的影響。

uwsgi_buffering指令控制Nginx是否對uWSGI響應進行緩沖。默認情況下,該指令是啟用的。可以通過以下方式顯式設置:

uwsgi_buffering on;

當緩沖開啟時,Nginx會盡可能快地從uWSGI服務器讀取響應,并將其存儲在內存或磁盤上。這允許uWSGI進程快速釋放,以處理新的請求,而Nginx則負責將緩沖的響應逐步發送給客戶端。

uwsgi_buffers指令用于設置用于讀取uWSGI響應的緩沖區數量和大小。其語法為:

uwsgi_buffers number size;

例如,設置8個4k大小的緩沖區:

uwsgi_buffers 8 4k;

這意味著Nginx將分配8個4KB的緩沖區來存儲uWSGI響應。總緩沖大小為32KB。

對于大型響應,Nginx可能需要使用更多的緩沖區。uwsgi_buffer_size指令設置用于讀取uWSGI響應頭的緩沖區大小:

uwsgi_buffer_size 4k;

如果響應頭超過這個大小,Nginx會分配一個更大的緩沖區。

當內存中的緩沖區不足以存儲整個響應時,Nginx會將部分響應寫入臨時文件。uwsgi_max_temp_file_size指令控制這些臨時文件的最大大小:

uwsgi_max_temp_file_size 1024m;

這里設置了1GB的最大臨時文件大小。如果將此值設為0,Nginx將禁用臨時文件的使用,所有響應都將存儲在內存中。

uwsgi_temp_file_write_size指令控制寫入臨時文件的數據塊大小:

uwsgi_temp_file_write_size 8k;

這個設置可以影響磁盤I/O性能,特別是在處理大型響應時。

對于某些特殊情況,可能需要禁用特定位置的緩沖。例如,對于實時流媒體應用:

location /stream {uwsgi_pass backend;uwsgi_buffering off;
}

禁用緩沖后,Nginx會立即將從uWSGI服務器接收到的數據轉發給客戶端,這對于需要低延遲的應用很有用。

5.3 連接池管理

連接池管理是優化NginxuWSGI服務器之間通信的關鍵策略。通過有效管理連接池,可以顯著提高系統性能,減少資源消耗,并增強整體穩定性。

Nginx提供了keepalive指令來管理與上游服務器的持久連接。這個指令通常在upstream塊中配置,用于指定每個工作進程應該保持的空閑keepalive連接的最大數量。例如:

upstream backend {server 127.0.0.1:8000;keepalive 32;
}

在這個配置中,Nginx將為每個工作進程維護最多32個空閑的keepalive連接。這些連接可以被重復使用,避免了頻繁建立和關閉連接的開銷。

為了充分利用keepalive連接,需要在location塊中設置uwsgi_keepalive_requests指令。這個指令定義了在關閉連接之前,可以通過一個keepalive連接處理的最大請求數。例如:

location / {uwsgi_pass backend;uwsgi_keepalive_requests 100;
}

這個配置允許每個keepalive連接處理最多100個請求,之后連接將被關閉,Nginx會創建一個新的連接。

uwsgi_http_version指令也在連接池管理中扮演重要角色。將其設置為1.1可以啟用HTTP/1.1的持久連接特性:

uwsgi_http_version 1.1;

此外,uwsgi_next_upstream指令允許在特定條件下將請求傳遞給下一個服務器。這對于處理連接失敗或服務器錯誤非常有用:

uwsgi_next_upstream error timeout invalid_header http_500;

這個配置指示Nginx在遇到錯誤、超時、無效頭部或HTTP 500錯誤時嘗試下一個上游服務器。

為了防止在服務器出現問題時過度重試,可以使用uwsgi_next_upstream_triesuwsgi_next_upstream_timeout指令:

uwsgi_next_upstream_tries 3;
uwsgi_next_upstream_timeout 30s;

這限制了Nginx最多嘗試3次或在30秒內進行重試。

在管理連接池時,還需要考慮uwsgi_read_timeoutuwsgi_send_timeout指令。這些超時設置影響NginxuWSGI服務器之間的通信:

uwsgi_read_timeout 60s;
uwsgi_send_timeout 60s;

這些設置確保了在通信出現問題時,連接不會無限期地保持打開狀態。

對于需要處理大量并發連接的高流量網站,可以考慮增加Nginx工作進程的數量。這可以通過worker_processes指令來實現:

worker_processes auto;

設置為"auto"允許Nginx根據可用的CPU核心自動調整工作進程數量。

通過精心配置這些參數,以創建一個高效的連接池管理策略。這可以提高性能,增強系統的可靠性和可擴展性。

6. 關于安全性

在配置Nginxuwsgi_pass時,合理的安全措施不僅能保護后端服務器免受潛在攻擊。這章僅作為順帶提一下,關于安全性方面內容已另外獨立成多篇單獨的文章已經或將在后續發布于我的博客。

6.1 SSL/TLS配置

實施SSL/TLS加密是保護數據傳輸安全的基礎。在Nginx中配置SSL/TLS需要首先獲取有效的SSL證書。可以使用免費的證書或購買商業證書。獲得證書后,在Nginx配置文件中添加以下內容:

server {listen 443 ssl;server_name example.com;ssl_certificate /path/to/fullchain.pem;ssl_certificate_key /path/to/privkey.pem;ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers HIGH:!aNULL:!MD5;location / {uwsgi_pass backend;include uwsgi_params;}
}

這個配置啟用了HTTPS,并指定了SSL證書和私鑰的位置。ssl_protocols指令限制了允許的TLS版本,而ssl_ciphers指定了加密算法。

為了進一步增強安全性,可以添加HSTS(HTTP嚴格傳輸安全)頭:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

這告訴瀏覽器在指定時間內(這里是一年)只使用HTTPS連接。

6.2 訪問控制

訪問控制是限制未授權訪問的關鍵。Nginx提供了多種方法來實現訪問控制。

IP地址限制是一種基本的訪問控制方法。可以使用allowdeny指令來實現:

location /admin {allow 192.168.1.0/24;deny all;uwsgi_pass backend;
}

這個配置只允許來自192.168.1.0/24網段的IP訪問/admin路徑。

基本身份認證也是一種常用的訪問控制方法:

location /private {auth_basic "Restricted Access";auth_basic_user_file /etc/nginx/.htpasswd;uwsgi_pass backend;
}

這里使用.htpasswd文件存儲用戶名和密碼。可以使用htpasswd命令生成這個文件。

對于更復雜的認證需求,可以使用auth_request模塊,它允許將認證委托給外部服務:

location /secure {auth_request /auth;uwsgi_pass backend;
}location = /auth {internal;proxy_pass http://auth_service;proxy_pass_request_body off;proxy_set_header Content-Length "";proxy_set_header X-Original-URI $request_uri;
}

這個配置將認證請求發送到專門的認證服務。

6.3 請求限制

請求限制是防止濫用和DDoS攻擊的重要手段。Nginxlimit_req_zonelimit_req指令可以用來實現請求限制:

http {limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;server {location / {limit_req zone=one burst=5;uwsgi_pass backend;}}
}

這個配置限制了每個IP地址每秒只能發送一個請求,但允許短時間的突發流量(最多5個請求)。

除了請求頻率限制,還可以限制連接數:

http {limit_conn_zone $binary_remote_addr zone=addr:10m;server {location / {limit_conn addr 10;uwsgi_pass backend;}}
}

這限制了每個IP地址最多同時維持10個連接。

為了防止大文件上傳導致的DoS攻擊,可以限制請求體的大小:

client_max_body_size 10m;

這將限制請求體的最大大小為10MB。

此外,配置適當的超時設置也很重要:

uwsgi_read_timeout 30s;
uwsgi_send_timeout 30s;
uwsgi_connect_timeout 30s;

這些設置可以防止慢速攻擊,確保資源不會被長時間占用。

7. 實際應用案例

7.1 Django應用的uwsgi_pass配置

在部署Django應用時,使用Nginx作為反向代理,配合uWSGI作為應用服務器是一種常見且高效的方案。這種配置能夠充分發揮Nginx的靜態文件處理能力和負載均衡特性,同時利用uWSGI高效處理Python應用的優勢。

首先,確保Django項目已經正確配置并能夠通過uWSGI運行。通常,uWSGI配置文件(如uwsgi.ini)可能如下所示:

[uwsgi]
chdir = /path/to/your/django/project
module = yourproject.wsgi:application
master = true
processes = 4
socket = /tmp/yourproject.sock
chmod-socket = 666
vacuum = true

這個配置指示uWSGI使用Unix套接字/tmp/yourproject.sock來通信,并運行4個工作進程。

接下來,配置Nginx以使用uwsgi_pass將請求轉發到uWSGI服務器。在Nginx的配置文件中(通常位于/etc/nginx/sites-available/目錄),添加以下內容:

server {listen 80;server_name example.com;location = /favicon.ico { access_log off; log_not_found off; }location /static/ {root /path/to/your/django/project;}location / {include uwsgi_params;uwsgi_pass unix:///tmp/yourproject.sock;}
}

這個配置中,server_name指定了服務器的域名。location /static/塊處理靜態文件請求,直接從文件系統提供服務,無需經過uWSGI

location /塊使用uwsgi_pass指令將所有其他請求轉發到uWSGI服務器。unix:///tmp/yourproject.sock指定了uWSGI服務器監聽的Unix套接字路徑,這應與uWSGI配置文件中的socket設置相匹配。

include uwsgi_params;語句包含了一組預定義的uWSGI參數,這些參數對于NginxuWSGI之間的正確通信至關重要。

對于需要處理大文件上傳的Django應用,可能需要增加客戶端請求體的大小限制:

client_max_body_size 10M;

這將允許上傳最大10MB的文件。

如果Django應用需要處理長時間運行的請求,可能需要調整超時設置:

uwsgi_read_timeout 300s;
uwsgi_send_timeout 300s;

這將超時時間設置為5分鐘,給予長時間運行的請求更多的處理時間。

對于高流量的Django站點,可以考慮啟用Nginx的緩沖功能:

uwsgi_buffering on;
uwsgi_buffer_size 8k;
uwsgi_buffers 8 8k;

這些設置啟用了響應緩沖,并為每個請求配置了8個8KB的緩沖區。

如果Django應用部署在多個服務器上,可以使用Nginxupstream模塊實現負載均衡:

upstream django_cluster {server unix:///tmp/yourproject1.sock;server unix:///tmp/yourproject2.sock;server unix:///tmp/yourproject3.sock;
}server {location / {uwsgi_pass django_cluster;include uwsgi_params;}
}

這個配置將請求分發到三個不同的uWSGI實例,實現簡單的負載均衡。

最后,為了提高安全性,建議啟用HTTPS。可以使用免費的Let’s Encrypt證書:

server {listen 443 ssl;server_name example.com;ssl_certificate /path/to/fullchain.pem;ssl_certificate_key /path/to/privkey.pem;# 其他SSL相關配置...location / {uwsgi_pass unix:///tmp/yourproject.sock;include uwsgi_params;}
}

這個配置啟用了HTTPS,確保客戶端和服務器之間的通信是加密的。

通過這些配置,Nginx能夠高效地將請求轉發到Django應用,同時處理靜態文件、負載均衡和SSL加密。這種設置充分利用了Nginx的強大功能,為Django應用提供了一個穩定、高性能的生產環境。

7.2 Flask應用的uwsgi_pass配置

在使用Flask框架開發Web應用時,將其與NginxuWSGI結合是一種常見且高效的部署方式。這種配置能夠充分發揮Nginx的反向代理和負載均衡能力,同時利用uWSGI高效處理Python應用請求的優勢。下面詳細介紹如何為Flask應用配置Nginxuwsgi_pass

首先,確保Flask應用已經準備就緒,并且uWSGI已正確安裝和配置。典型的Flask應用入口文件"app.py"可能如下所示:

from flask import Flaskapp = Flask(__name__)@app.route('/')
def hello():return "Hello, World!"if __name__ == '__main__':app.run()

接下來,創建一個uWSGI配置文件,通常命名為"uwsgi.ini":

[uwsgi]
module = app:app
master = true
processes = 4
socket = /tmp/uwsgi.sock
chmod-socket = 660
vacuum = true
die-on-term = true

這個配置指定了Flask應用的入口模塊,設置了4個工作進程,并使用Unix域套接字/tmp/uwsgi.sock進行通信。

現在,配置Nginx服務器塊以使用uwsgi_pass將請求轉發到Flask應用。在Nginx配置文件中添加以下內容:

server {listen 80;server_name example.com;location / {include uwsgi_params;uwsgi_pass unix:/tmp/uwsgi.sock;}location /static {alias /path/to/your/static/files;}
}

這個配置將所有請求通過Unix域套接字轉發到uWSGI服務器,除了/static路徑下的靜態文件請求,這些請求將直接由Nginx處理。

為了優化性能,可以在Nginx配置中添加緩沖和超時設置:

location / {include uwsgi_params;uwsgi_pass unix:/tmp/uwsgi.sock;uwsgi_read_timeout 60s;uwsgi_send_timeout 60s;uwsgi_connect_timeout 60s;uwsgi_buffers 8 16k;uwsgi_buffer_size 32k;
}

這些設置增加了讀取、發送和連接的超時時間,并配置了適當的緩沖區大小,有助于處理較大的請求和響應。

如果Flask應用需要處理文件上傳,可能需要增加客戶端請求體的大小限制:

client_max_body_size 10M;

這將允許上傳最大10MB的文件。

對于需要SSL/TLS加密的生產環境,可以配置HTTPS

server {listen 443 ssl;server_name example.com;ssl_certificate /path/to/fullchain.pem;ssl_certificate_key /path/to/privkey.pem;ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers HIGH:!aNULL:!MD5;location / {include uwsgi_params;uwsgi_pass unix:/tmp/uwsgi.sock;}
}

這個配置啟用了HTTPS,并指定了SSL證書的位置。

如果Flask應用是一個API服務,可能需要處理CORS(跨源資源共享)問題。可以在Nginx配置中添加相應的頭部:

location / {include uwsgi_params;uwsgi_pass unix:/tmp/uwsgi.sock;add_header 'Access-Control-Allow-Origin' '*';add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
}

這將允許來自任何源的跨域請求。在生產環境中,應該根據實際需求限制允許的源。

最后,為了提高安全性,可以添加一些基本的安全頭部:

add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";

這些頭部可以防止點擊劫持、跨站腳本攻擊和MIME類型嗅探。

通過以上配置,Nginx可以有效地作為反向代理服務器,將請求轉發到運行Flask應用的uWSGI服務器。這種設置不僅提高了應用的性能和可擴展性,還增強了安全性。在實際部署中,可能還需要根據具體的應用需求和服務器環境進行進一步的優化和調整。

8. 總結

F. 參考文獻

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/web/43440.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43440.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43440.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據結構模板2

Trie樹&#xff1a;用來高效存儲和查找字符串集合的數據結構&#xff1a; 模板題&#xff1a;https://www.acwing.com/problem/content/837/ AC代碼&#xff1a; #include<bits/stdc.h> using namespace std; int son[100010][26],cnt[100010],idx; char str[100010]; …

數據的洞察力:SQL Server Analysis Services在數據分析中的卓越應用

數據的洞察力&#xff1a;SQL Server Analysis Services在數據分析中的卓越應用 在商業智能和數據分析領域&#xff0c;SQL Server Analysis Services (SSAS) 是一款強大的工具&#xff0c;它提供了多維數據和數據挖掘模型的創建、部署和管理功能。本文將深入探討如何在SQL Se…

云端生活,智能管理:在iCloud中打造您的個人購物清單與預算計劃

云端生活&#xff0c;智能管理&#xff1a;在iCloud中打造您的個人購物清單與預算計劃 在快節奏的現代生活中&#xff0c;個人財務管理和購物規劃變得尤為重要。iCloud提供了一個強大的平臺&#xff0c;讓我們能夠存儲、同步和共享個人購物清單與預算計劃。本文將詳細介紹如何…

代碼隨想錄算法訓練營第二十九天

452. 用最少數量的箭引爆氣球 這道題目我原本的想法是只要當前的氣球半徑范圍在已有的箭頭能夠擊穿的氣球半徑內就可以實現 但是 箭射出去的地方是一個值 而不是一個范圍 因此有相同的重疊范圍的許多氣球并一定都有相同的值&#xff0c;因此這種方法不可取 這題的主要局部最…

最短路徑算法(算法篇)

算法之最短路徑算法 最短路徑算法 概念&#xff1a; 考查最短路徑問題&#xff0c;可能會輸入一個賦權圖(也就是邊帶有權的圖)&#xff0c;則一條路徑的v1v2…vN的值就是對路徑的邊的權求和&#xff0c;這叫做賦權路徑長&#xff0c;如果是無權路徑長就是單純的路徑上的邊數。…

mac安裝配置cmake

本機是2015 macbook pro mid&#xff0c;已經有點老了&#xff0c;用homebrew下cmake老出問題 其實cmake官網安裝也不麻煩 一、官網下載對應安裝包 Download CMake 和所有dmg文件一樣安裝 二、改成命令行使用 一般來說 tutorial 給的都是命令行build 命令行的設置如下&am…

手機下載APP (uniapp/vue)

一、uniapp <template><view class"content"><view class"appName">{{ formData.appName }}</view><view class"appInfo">{{ formData.appInfo }}</view><image class"logo" :src"formDa…

批量修改Git歷史commit信息中的username

之前很長一段時間GitHub上的提交都在使用工作賬戶, 導致私人倉庫中的提交者比較混亂. 在StackOver里面找到了一個bash腳本可以批量修改username, 在這里記錄一下. 修改的步驟一共兩步: 執行修改腳本將本地修改同步到Git服務器 首先我們來看腳本: #!/bin/shgit filter-branch…

SFUZZ模糊測試平臺全新升級,從標準到實踐助力車企安全出海

開源網安模糊測試平臺SFuzz全新升級&#xff0c;參照各國相關標準要求進行針對性建設&#xff0c;可為智能網聯汽車信息安全測試提供更為強大的工具支持。SFuzz向被測系統輸入大量隨機數據&#xff0c;模擬各種異常情況&#xff0c;可以發現被測系統內潛在的缺陷和漏洞&#xf…

Spring中如何操作Redis

Spring畢竟是Java中的一個主流框架&#xff0c;如何在這個框架中使用Redis呢&#xff1f; 創建項目并引入相關依賴 然后進行創建。 至此就將Redis的相關依賴引入進來了。 編寫Redis配置 將application.properties修改成application.yml 然后編寫如下配置&#xff1a; spr…

usbserver工程師手記(二)設置定時任務

概述 部分銀行ukey 長時間不使用后會導致休眠&#xff0c;出現雖然有連接&#xff0c;但是讀不到證書&#xff0c;可以用定時重置端口的辦法&#xff0c;調用接口 http://ip/usb_server/reset_port,參數為 {"port":"B5-1-2","vid_pid":"09…

Golang | Leetcode Golang題解之第228題匯總區間

題目&#xff1a; 題解&#xff1a; func summaryRanges(nums []int) (ans []string) {for i, n : 0, len(nums); i < n; {left : ifor i; i < n && nums[i-1]1 nums[i]; i {}s : strconv.Itoa(nums[left])if left < i-1 {s "->" strconv.It…

多個標簽頁中復用同一 QTableView

在 PyQt 中實現在多個標簽頁中復用同一個 QTableView 實例&#xff0c;復用同一個 QTableView 實例可以減少內存和資源的使用。每個 QTableView 實例都會消耗一定的內存和處理資源&#xff0c;如果每個標簽頁都創建一個新的實例&#xff0c;會增加系統的負擔。通過復用實例&…

每天一個數據分析題(四百二十一)- 一元線性回歸模型

關于一元線性回歸的求解過程說法正確的是&#xff1f; A.一元線性回歸只需要求解出兩個參數系數即可 B.對于新來的樣例&#xff0c;建立好的一元線性回歸模型可以做出準確的預測 C.一元線性回歸模型的基本形式是YAxe&#xff0c;其中A為系數&#xff0c;e為隨機誤差 D.一元線性…

日常學習-20240710

1、一次一千萬條數據插入和刪除案例&#xff1a; 第一次&#xff1a;插入--批量插入&#xff0c;每次插入5000條數據&#xff0c;總耗時28min,數據無異常 刪除--通過sql語句一次性刪除&#xff0c;總耗時1h52min;一次刪除的數據過多導致mysql的備份恢復文件極其龐大&#xff0…

CentOS7 安裝 git 命令

通過yum源install下載的git版本比較低&#xff0c;不推薦此方式安裝。 官網下載最新版git源碼&#xff1a;Git 1. 解壓安裝包 tar -xzvf git-2.45.2.tar.gz 2. 安裝相關依賴 yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils…

uniapp使用高德地圖(公眾號+h5)

選擇微信小程序的話后果就是你的地圖出不來&#xff0c;出來了就報key異常 下面直接放配置和代碼&#xff1a; 打包后的高德uni-app,uniCloud,serverless,高德地圖,申請高德地圖Key,配置使用高德地圖,參數說明,高德開放平臺用戶名,百度地圖,申請百度地圖Key,配置使用百度地圖,…

線性代數|機器學習-P22逐步最小化一個函數

文章目錄 1. 概述2. 泰勒公式3. 雅可比矩陣4. 經典牛頓法4.1 經典牛頓法理論4.2 牛頓迭代法解求方程根4.3 牛頓迭代法解求方程根 Python 5. 梯度下降和經典牛頓法5.1 線搜索方法5.2 經典牛頓法 6. 凸優化問題6.1 約束問題6.1 凸集組合 Mit麻省理工教授視頻如下&#xff1a;逐步…

bert訓練的一些技巧(rand() < self.skipgram_prb)

rand() < self.skip_gram_prb) 是一個條件表達式&#xff0c;用來判斷是否進行skip-gram掩碼操作。這種掩碼操作通常用于自然語言處理中的數據增強&#xff0c;通過概率決定是否應用skip-gram掩碼。下面是對這個表達式的詳細解釋&#xff1a; 解釋 rand(): rand() 是一個隨…

uniapp 初始學習1

uni-app代碼基本包括js,vue,css.在app端支持原生渲染nvue&#xff0c;可編譯的kotlin和swift 掌握js就可以進行不同應用的開發 頁面文件遵循 Vue 單文件組件 (SFC) 規范&#xff0c;即每個頁面是一個.vue文件 .vue文件是一個自定義的文件類型&#xff0c;用類HTML語法描述一…