When you realize you want to spend the rest of your life with somebody,you want the rest of your life to start as soon as possible.<br/>
當你意識到想和某人共度餘生時,便會恨不得下半場人生馬上開始。——《當哈利遇到莎莉》1989
或許當提前80埠和443埠的時候,我們就能想起對應的Http存取[基於HTTP協定]和Https存取[基於HTTP協定+SSL證書]。記憶中比較深刻的,就是開發微信小程式時,對應域名設定述求,必須是備案認證通過的Https的服務。因此,在設定之前,我們需要了解Nginx包含著那些模組以及設定規則,工作原理才能更好地使用Nginx以及認識Nginx。
Nginx由核心和模組組成,其中,核心的設計非常微小和簡潔,完成的工作也非常簡單,僅僅通過查詢組態檔將使用者端請求對映到一個location block(location是Nginx設定中的一個指令,用於URL匹配),而在這個location中所設定的每個指令將會啟動不同的模組去完成相應的工作。
Nginx的模組從結構上分為核心模組、基礎模組和第三方模組, HTTP模組、EVENT模組和MAIL模組等屬於核心模組,HTTP Access模組、HTTP FastCGI模組、HTTP Proxy模組和HTTP Rewrite模組屬於基本模組,而HTTP Upstream Request Hash模組、Notice模組和HTTP Access Key模組屬於第三方模組,使用者根據自己的需要開發的模組都屬於第三方模組。正是有了這麼多模組的支撐,Nginx的功能才會如此強大。
Nginx由核心和模組組成,其中,核心的設計非常微小和簡潔,完成的工作也非常簡單,僅僅通過查詢組態檔將使用者端請求對映到一個location block(location是Nginx設定中的一個指令,用於URL匹配),而在這個location中所設定的每個指令將會啟動不同的模組去完成相應的工作。
以nginx-1.19.8版本為例:
Nginx的原始碼主要分佈在src/目錄下,而src/目錄下主要包含三部分比較重要的模組:
Nginx的核心原始碼,包括常用資料結構的以及Nginx 核心實現的核心程式碼。
Nginx事件驅動模型,以及定時器的實現相關程式碼。
Nginx 實現http 伺服器相關的程式碼。
Nginx 實現郵件代理伺服器相關的程式碼。
輔助程式碼,測試C++頭 的相容性,以及對Google_PerfTools 的支援。
不同體系統結構所提供的系統函數的封裝,提供對外統一的系統呼叫介面。
Nginx(tcp/udp)反向代理及與上游通訊的基礎模組。
Nginx提供支援的模型主要有Select庫,Eventport庫,Poll庫,Epoll庫,Kqueue庫,Devpoll庫以及Eventport庫等。
Nginx的模組從功能上分為三類,分別是:
在Nginx的模組下,一次常規的HTTP請求和響應的過程:
在工作方式上,Nginx分為單工作程序和多工作程序兩種模式:
Nginx預設為單工作程序模式。Nginx的模組直接被編譯進Nginx,因此屬於靜態編譯方式。啟動Nginx後,Nginx的模組被自動載入,不像在Apache一樣,首先將模組編譯為一個so檔案,然後在組態檔中指定是否進行載入。在解析組態檔時,Nginx的每個模組都有可能去處理某個請求,但是同一個處理請求只能由一個模組來完成
Nginx常用的模組:
location / {
root html;
index index.html index.htm;
allow 127.0.0.1; ##允許127.0.0.1存取
deny 127.0.0.1; ##拒絕127.0.0.1存取
}
location / {
root html;
index index.html index.htm;
auth_basic "Admin"; ##認證對話方塊的提示字串顯示的內容
auth_basic_user_file /etc/nginx/conf/htpasswd; ##存放認證用的使用者名稱和檔案,需要用htpasswd命令生成
}
對於htpasswd的應用需要安裝httpd-tools:
yum install httpd-tools
使用命令生成:htpasswd -c /etc/nginx/conf/htpasswd nginx
[root@cotos-pivotal nginx]# htpasswd -c /etc/nginx/conf/htpasswd nginx
New password:
Re-type new password:
Adding password for user nginx
location / {
root html;
index index.html index.htm;
auth_basic "Admin"; ##認證對話方塊的提示字串顯示的內容
auth_basic_user_file /etc/nginx/conf/htpasswd; ##存放認證用的使用者名稱和檔案,需要用htpasswd命令生成
stub_status;
}
狀態引數解析:
gzip on;
gzip_comp_level 6;
gzip_min_length 64;
gzip_proxied any;
gzip_types text/xml text/css application/javascript;
server {
listen 443 ssl;
server_name www.ice.com;
root /var/www/html;
ssl on;
ssl_certificate /usr/local/nginx/ssl/ssl.crt;
ssl_certificate_key /usr/local/nginx/ssl/ssl.key;
ssl_session_cache shared:sslcache:20m;
location / {
index index.html index.htm;
}
}
rewrite regex replacement [flag]:將使用者請求的URI基於regex所描述的模式進行檢查,匹配到時將其替換為replacement指定的新的URI;
在同一級設定塊中存在多個rewrite規則,那麼會自下而下逐個檢查;被某條件規則替換完成後,會重新一輪的替換檢查,因此,隱含有迴圈機制;[flag]所表示的標誌位用於控制此迴圈機制;
其中:
定義referer首部的合法可用值:
valid_referers none block server_names *.pivotal.com ;
if($invalid_referer) {return 403; }
完整的 Nginx組態檔:
#Setting Nginx User Group
user root;
#Setting Nginx Processes
worker_processes 1;
#Setting Nginx Max Nofile
worker_rlimit_nofile 51200;
#Setting Nginx Events
events {
worker_connections 51200;
}
#Setting Nginx Http
http {
include mime.types;
default_type application/octet-stream;
#Setting Nginx FastCGI[避免504 502等]
fastcgi_connect_timeout 600s;
fastcgi_send_timeout 600s;
fastcgi_read_timeout 600s;
fastcgi_buffer_size 256k;
fastcgi_buffers 16 256k;
fastcgi_busy_buffers_size 512k;
fastcgi_temp_file_write_size 512k;
send_timeout 60000;
client_header_buffer_size 64k;
large_client_header_buffers 4 64k;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
#keepalive_timeout 0;
keepalive_timeout 120;
#檔案上傳最大限制50M 預設是1m
client_max_body_size 100m;
#gzip on;
#Setting Nginx Gzip
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
#Setting Nginx Reverse Proxy [反向代理設定 負載均衡]
#後臺系統web層tomcat埠 monitor-8090
upstream monitor.com{
ip_hash;
server localhost:8090 ;
}
#前臺介面web層tomcat埠proscenium-8091
upstream proscenium.com{
ip_hash;
server localhost:8091;
}
#移動介面web層tomcat埠mobile-8092
upstream mobile.com{
ip_hash;
server localhost:8092;
}
#後臺系統web層tomcat埠 schedule-8093
upstream schedule.com{
ip_hash;
server localhost:8093;
}
server {
listen 80;
server_name localhost;
#處理websocket請求
location /monitor {
#請求轉向定義的伺服器列表
proxy_pass http://monitor.com/zhimeng;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 超時設定 預設300s
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
location /proscenium {
#請求轉向定義的伺服器列表
proxy_pass http://proscenium.com;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 超時設定 預設300s
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
location /mobile {
#請求轉向定義的伺服器列表
proxy_pass http://mobile.com;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 超時設定 預設300s
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
location /schedule {
#請求轉向定義的伺服器列表
proxy_pass http://schedule.com/;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 超時設定 預設300s
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location /staticFile {
alias /root/repository/staticFile;
autoindex on;
autoindex_exact_size on;
autoindex_localtime on;
}
}
}
版權宣告:本文為博主原創文章,遵循相關版權協定,如若轉載或者分享請附上原文出處連結和連結來源。