原文請訪問我的技術部落格番茄技術小站
花了一週時間瞭解nginx相關的知識,主要內容有:基礎知識: Nginx的快速部署安裝、模組、基礎配置語法,Nginx的日誌輸出、Nginx預設配置模組、Nginx做為http代理服務,介紹代理服務的型別,正向反向代理配置,nginx作為的應用層負載均衡服務的各種應用,hash負載均衡策略,Nginx快取,高階知識: Nginx常用配置模組,rewirte的配置語法和規則,配置基於指定地域的規則訪問,geoip模組、https的實現原理,配置nginx的https服務,secure_link_module的防盜鏈實現,講解,講解Lua的開發語法、配合Nginx實現高效的認證系統和其他場景。
基礎知識
環境
初始環境
docker啟動
docker run -d -p 8088:80 --name nginx_8088 nginx_80:latest /sbin/init
複製程式碼
四項確認
- 確認系統網路(ping)
- 確認yum可用 (yum list | grep gcc
- 確認關閉iptables (iptables -F)
- 確認停用selinux
兩項安裝
yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake
yum -y install wget httpd-tools vim
複製程式碼
一次初始化
cd /opt/ mkdir app download logs work backup
複製程式碼
nginx安裝
確定nginx源
cd /etc/yum.repos.d
vim nginx.repo
新增:
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
複製程式碼
安裝
yum list | grep nginx
yum install nginx
複製程式碼
檢視版本
nginx -v
複製程式碼
檢視nginx 編譯的引數
nginx -V
複製程式碼
nginx啟動
nginx -c /etc/nginx/nginx.conf
複製程式碼
重啟nginx服務
systemctl restart nginx.service
複製程式碼
柔和重啟
nginx -s reload -c /etc/nginx/nginx.conf
複製程式碼
檢查配置檔案
nginx -t -c /etc/nginx/nginx.conf
複製程式碼
中介軟體架構
nginx簡述
nginx是一個開源且高效能、可靠的http中介軟體,代理服務。Nginx(發音同engine x)是一個 Web伺服器,也可以用作反向代理,負載平衡器和 HTTP快取。該軟體由 Igor Sysoev 建立,並於2004年首次公開發布。同名公司成立於2011年,以提供支援。
為什麼選擇nginx
io多路複用epoll
多個描述符的i/o操作都能在一個執行緒內併發交替地順序完成,這就教i/o多路複用,這裡的”複用“指的是複用同一個執行緒。i/o多路複用的實現方式為:select、poll、epoll
什麼是select
epoll模型
- 當FD就緒,採用系統的回撥函式之間將fd放入,效率更高
- 最大連線無限制
輕量級
- 功能模組少
- 程式碼模組化
cpu親和(affinity)
是一種cpu核心和nginx工作程式繫結方式,把每個worker程式固定在一個cpu上執行,減少切換cpu的cache miss,獲得更好的效能。
說白了就是減少cpu切換所損耗的效能
sendfile
nginx版本
- Mainline version 開發版
- Stable version 穩定版
- Legacy version 歷史版本
基本引數使用
rpm
rpm命令是RPM軟體包的管理工具。rpm原本是Red Hat Linux發行版專門用來管理Linux各項套件的程式,由於它遵循GPL規則且功能強大方便,因而廣受歡迎。逐漸受到其他發行版的採用。RPM套件管理方式的出現,讓Linux易於安裝,升級,間接提升了Linux的適用度。
安裝目錄
列出服務的安裝目錄
rpm -ql nginx
列出下面目錄
/etc/logrotate.d/nginx
/etc/nginx
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf
/etc/nginx/fastcgi_params
/etc/nginx/koi-utf
/etc/nginx/koi-win
/etc/nginx/mime.types
/etc/nginx/modules
/etc/nginx/nginx.conf
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params
/etc/nginx/win-utf
/etc/sysconfig/nginx
/etc/sysconfig/nginx-debug
/usr/lib/systemd/system/nginx-debug.service
/usr/lib/systemd/system/nginx.service
/usr/lib64/nginx
/usr/lib64/nginx/modules
/usr/libexec/initscripts/legacy-actions/nginx
/usr/libexec/initscripts/legacy-actions/nginx/check-reload
/usr/libexec/initscripts/legacy-actions/nginx/upgrade
/usr/sbin/nginx
/usr/sbin/nginx-debug
/usr/share/doc/nginx-1.12.2
/usr/share/doc/nginx-1.12.2/COPYRIGHT
/usr/share/man/man8/nginx.8.gz
/usr/share/nginx
/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
/var/cache/nginx
/var/log/nginx
複製程式碼
目錄解釋
路徑 | 型別 | 作用 |
---|---|---|
/etc/logrotate.d/nginx | 配置檔案 | nginx日誌輪轉,用於logrotate服務的日誌切割 |
/etc/nginx /etc/nginx/conf.d /etc/nginx/conf.d/default.conf /etc/nginx/nginx.conf |
目錄、配置檔案 | nginx主配置檔案 |
/etc/nginx/fastcgi_params /etc/nginx/scgi_params /etc/nginx/uwsgi_params |
配置檔案 | cgi配置相關,fastcgi配置 |
/etc/nginx/koi-utf /etc/nginx/koi-win /etc/nginx/win-utf |
配置檔案 | 編碼對映轉化檔案 |
/etc/nginx/mime.types | 配置檔案 | 設定http協議的Content-Type與副檔名對應關係 |
/etc/sysconfig/nginx /etc/sysconfig/nginx-debug /usr/lib/systemd/system/nginx-debug.service /usr/lib/systemd/system/nginx.service |
配置檔案 | 用於配置出系統守護程式管理器管理方式 |
/etc/nginx/modules /usr/lib64/nginx/modules |
目錄 | nginx模組目錄 |
/usr/sbin/nginx /usr/sbin/nginx-debug |
命令 | nginx服務的啟動管理的終端命令 |
/usr/share/doc/nginx-1.12.2 /usr/share/doc/nginx-1.12.2/COPYRIGHT /usr/share/man/man8/nginx.8.gz |
檔案目錄 | nginx的手冊和幫助檔案 |
/var/cache/nginx | 目錄 | nginx的快取目錄 |
/var/log/nginx | 目錄 | nginx的日誌目錄 |
編譯引數
列出編譯引數的命令
nginx -V
結果
nginx version: nginx/1.12.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
複製程式碼
** 引數解釋**
路徑 | 型別 |
---|---|
--prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock |
安裝目的目錄或路徑 |
--http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp |
執行對應模組時,nginx所保留的臨時性檔案 |
--user=nginx --group=nginx | 設定nginx程式啟動的使用者和組使用者 |
--with-cc-opt=parameters | 設定額外的引數將被新增到CFLAGS變數 |
--with-ld-opt=parameters | 設定附加的引數,連結系統庫 |
nginx基本配置語法
http相關
展示每次請求的請求頭
curl -v http://www.baidu.com
複製程式碼
結果
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* About to connect() to www.baidu.com port 80 (#0)
* Trying 61.135.169.121...
* Connected to www.baidu.com (61.135.169.121) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: www.baidu.com
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: bfe/1.0.8.18
< Date: Thu, 30 Nov 2017 02:14:02 GMT
< Content-Type: text/html
< Content-Length: 2381
< Last-Modified: Mon, 23 Jan 2017 13:27:32 GMT
< Connection: Keep-Alive
< ETag: "588604c4-94d"
< Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
< Pragma: no-cache
< Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
< Accept-Ranges: bytes
<
{ [data not shown]
100 2381 100 2381 0 0 88266 0 --:--:-- --:--:-- --:--:-- 91576
* Connection #0 to host www.baidu.com left intact
複製程式碼
nginx日誌型別
- error.log、 access.log
- log_format
格式*
syntax: log_format name [escape=default | json] string...;
default: log_format combined "...";
context:http
複製程式碼
nginx變數
nginx配置的內容
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
複製程式碼
變數型別
- http請求變數:arg_PARAMETER,http_header,sent_http_header
- 內建變數:nginx內建的
- 自定義變數: 自己定義
nginx模組
- nginx官方模組
- 第三方模組
default.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
複製程式碼
nginx開啟的模組
--with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module
複製程式碼
安裝編譯模組
編譯選項 | 作用 |
---|---|
--with-http_stub_status_module | nginx的客戶端狀態 |
--with-http_random_index_module | 目錄中選擇一個隨機主頁 |
--with-http_sub_module | http內容替換 |
--limit_conn_module | 連線頻率限制 |
--limit_req_module | 請求頻率限制 |
http_access_module | 基於ip的訪問控制 |
http_auth_basic_module | 基於使用者的信任登入 |
http_stub_status_module 配置
配置語法
syntax: stub_status;
default:-
context:server, location
複製程式碼
在default.conf中新增:
# my config
location /mystatus {
stub_status;
}
複製程式碼
檢查和重新啟動配置
nginx -tc /etc/nginx/nginx.conf
複製程式碼
重啟服務
nginx -s reload -c /etc/nginx/nginx.conf
複製程式碼
檢查效果 輸入:http://127.0.0.1:8088/mystatus
表示nginx的活躍連線數;握手的總次數、處理連線數;讀、寫、等待個數
http_random_index_module
配置語法
syntax: random_index on | off;
default:random_index off;
context:location
複製程式碼
在default.conf中將下面的配置:
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
複製程式碼
改為:
location / {
root /usr/share/nginx/html;
random_index on;
#index index.html index.htm;
}
複製程式碼
重啟後多刷幾次網頁:
主頁出現不同了。
http_sub_module (替換)
配置語法
syntax: sub_filter string replacement;
default:-
context:http,server,location
複製程式碼
syntax: sub_filter_last_modified on | off (重要使用者快取)
default:sub_filter_last_modified off;
context:http,server,location
複製程式碼
syntax: sub_filter_once on | off
default:sub_filter_once on;
context:http,server,location
複製程式碼
是否只替換一次
連線限制
壓力測試
ab -n 50 -c 20 http://127.0.0.1/index.html
複製程式碼
-n 表示請求次數 -c 表示併發數
配置語法
連線限制
syntax: limit_conn_zone key zone=name:size;
default:-
context:http
複製程式碼
syntax:limit_conn zone number;
default:-
context:http, server, location
複製程式碼
請求限制
syntax: limit_req_zone key zone=name:size rate=rate;
default:-
context:http
複製程式碼
syntax: limit_req_zone name [burst=number] [nodelay];
default:-
context:http,server,location
複製程式碼
在default.conf中將下面的配置:
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
# my config
location /mystatus {
stub_status;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
複製程式碼
改為:
limit_conn_zone $binary_remote_addr zone=conn_zone:1m;
limit_req_zone $binary_remote_addr zone=req_zone:1m rate=1r/s;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
#limit_conn conn_zone 1;
limit_req zone=req_zone;
# limit_req zone=req_zone burst nodelay;
# limit_req zone=req_zone burst nodelay;
index index.html index.htm;
}
# my config
location /mystatus {
stub_status;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
複製程式碼
壓測結果
限制前
限制後
http_access_module
配置語法
syntax: allow address | CIDR | unix: | all
default:-
context:http,server,location,limit_except
複製程式碼
syntax:deny address | CIDR | unix: | all
default:-
context:http, server, location ,limit_except
複製程式碼
測試 配置如下
location ~ ^/admin.html {
root /opt/app/code;
deny all;
index index.html index.htm;
}
複製程式碼
結果
侷限性
http_x_forwarded_for
http_x_forwarded_for = client ip, proxy(1)ip,proxy(2)ip,...
解決方法
- 採用別的http頭資訊控制訪問,如http_x_forward_for
- 結合geo模組操作
- 通過http自定義變數傳遞
http_auth_basic_module
配置語法
syntax: auth_basic string | off;
default:-
context:http,server,location,limit_except
複製程式碼
syntax:auth_basic_user_file file;
default:-
context:http, server, location ,limit_except
複製程式碼
生成password檔案
htpasswd -c ./auth_conf wujunqi
複製程式碼
修改conf檔案
location ~ ^/admin.html {
root /opt/app/code;
auth_basic "please input you user name and passwd";
auth_basic_user_file /etc/nginx/auth_conf;
index index.html index.htm;
}
複製程式碼
測試
侷限性
- 使用者資訊依賴檔案方式
- 操作管理機械、效率低下
解決方案
- nginx 結合LUA實現高效驗證
- nginx和LDAP打通,利用nginx-auth-ldap模組
場景實踐
靜態資源web服務
靜態資源
定義
非伺服器動態生成的檔案
靜態資源服務場景-CDN
檔案讀取配置
sendfile
syntax: sendfile on | off;
default:sendfile off
context:http,server,location,if in location
複製程式碼
注
--with-file-aio非同步檔案讀取
tcp_nopush
作用:sendfile 開啟的情況下,提高網路包的傳輸效率(等待,一次傳輸)
syntax:tcp_nopush on | off
default:tcp_nopush off
context:http, server, location
複製程式碼
相反的
syntax:tcp_nodelay on | off
default:tcp_nodelay on
context:http, server, location
複製程式碼
作用 在keepalive連線下,提高網路包的傳輸實時性
壓縮
作用
壓縮傳輸
syntax:gzip on | off
default:gzip off
context:http, server, if in location
複製程式碼
syntax:gzip_comp_level level;
default:gzip_comp_level 1;
context:http, server, location
複製程式碼
擴充套件nginx壓縮模組
- http_gzip_static_module:預讀gzip功能
- http_gunzip_module: 應用支援gunzip的壓縮方式
配置截圖
瀏覽器快取
http協議定義的快取機制(如:expires,cache-control 等)
- 瀏覽器無快取
- 瀏覽器有快取
檢測過期機制
作用 | 請求頭 |
---|---|
檢驗是否過期 | expires, cache-control (max-age) |
協議中Etag頭資訊校驗 | etag |
last-modified 頭資訊校驗 | last-modified |
** 瀏覽器請求伺服器過程(快取版本)**
相關配置
expires
新增cache-control、expires頭
syntax: expires [modified] time;
expires epoch | max | off;
default: expires off;
context:http, server, location
複製程式碼
配置例子
跨域訪問
為什麼瀏覽器禁止跨域訪問
不安全,容易出現CSRF攻擊
nginx配置
syntax: add_header name value [always]
default: -
context:http, server, location, if in location
複製程式碼
新增請求頭:Access-Control-Allow-Origin
配置截圖
防盜鏈
目的
防止資源被盜用
** 防盜鏈設定思路**
首要方式:區別哪些請求是非正常的使用者請求
基於http_refer防盜鏈配置模組
syntax: valid_referers none | blocked | server_names | string...;
default: -
context:server, location
複製程式碼
配置截圖
none:表示如果沒帶refer blocked:代表不是標準的http寫過過來的
一個命令
curl -e "http://www.baidu.com" -I http://116.62.103.228/wei.png
複製程式碼
-e:表示refer -i:表示只顯示請求頭
代理服務
代理-代為辦理(代理理財、代理收貨等)
代理服務
代理區別
區別在於代理的物件不一樣
- 正向代理的物件是客戶端
- 反向代理代理的是伺服器
正向代理
反向代理
代理的配置
syntax: proxy_pass URL;
default: -
context:location, if in location, limit_except
複製程式碼
url一般為:
- http://localhost:8000/uri/
- https://192.168.1.1:8000/uri/
- http://unix:/tmp/backend.socket:/uri/;
反向代理配置截圖
想訪問8080,只能訪問到80,通過80然後通過反向代理可以訪問到8080
正向代理配置截圖
116.62.103.228的配置如下(其實和反向代理配置參不多)
客戶端配置
快取區配置
syntax: proxy_buffering on | off
default: proxy_buffering on
context:location,http,server
複製程式碼
擴充套件
- proxy_buffer_size
- proxy_buffers
- proxy_busy_buffers size
跳轉重定向配置
syntax: proxy_redirect default;proxy_redirect off;proxy_redirect redirect replacement;
default: proxy_redirect default;
context:location,http,server
複製程式碼
頭資訊配置
syntax: proxy_set_header field value;
default: proxy_set_header host $proxy_host
proxy_set_header connection close;
context:location,http,server
複製程式碼
超時配置
syntax: proxy_connect_timeout time;
default: proxy_connect_timeout 60s;
context:location,http,server
複製程式碼
擴充套件
- proxy_read_timeout
- proxy_send_timeout
總的配置
負載均衡排程器 SLB
nginx負載均衡
GSLB
GSLB 是英文Global Server Load Balance的縮寫,意思是全域性負載均衡。作用:實現在廣域網(包括網際網路)上不同地域的伺服器間的流量調配,保證使用最佳的伺服器服務離自己最近的客戶,從而確保訪問質量。
SLB
負載均衡(Server Load Balancer,簡稱SLB)是一種網路負載均衡服務,針對阿里雲彈性計算平臺而設計,在系統架構、系統安全及效能,擴充套件,相容性設計上都充分考慮了彈性計算平臺雲伺服器使用特點和特定的業務場景。
4層負載均衡
在iso模型中的傳輸層(包的轉發)
7層負載均衡
在應用層實現
nginx實現的負載均衡(7層)
配置
syntax: upstream name{...}
default: -
context:http
複製程式碼
配置截圖
upstream舉例
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;
server backup1.exmple.com:8080 backup;
server backup2.example.com:8080 backup;
}
複製程式碼
後端伺服器在負載均衡排程中的狀態
欄位 | 作用 |
---|---|
down | 當前的server暫時不參與負載均衡 |
backup | 預留的備份伺服器 |
max_fails | 允許請求失敗的次數 |
fail_timeout | 經過max_fails失敗後,服務暫停的時間 |
max_conns | 限制最大的接收的連線數 |
配置截圖
排程演算法
欄位 | 作用 |
---|---|
輪詢 | 按時間順序逐一分配到不同的後端伺服器 |
加權輪詢 | weight值越大,分配到的訪問機率越高 |
ip_hash | 每個請求按訪問ip的hash結果分配,這樣來自同一個ip的固定訪問一個後端伺服器 |
least_conn | 最少連結數,那個機器連線數少就分發 |
url_hash | 按照訪問的url的hash結果來分配請求,是每個url定向到同一個後端伺服器 |
hash關鍵值 | hash自定義的key |
iphash
url——hash
配置語法
url_hash
syntax: hash key [consistent];
default:-
context:upstream
this directive appeared in version 1.7.2
複製程式碼
配置截圖
動態快取
快取的型別
代理快取
proxy_cache配置語法
Syntax: proxy_cache_path path [levels=levels]
Default:-
context:http
複製程式碼
開關
syntax: proxy_cache zone | off;
default:proxy_cache off;
context:http, sercer, location
複製程式碼
過期週期
syntax: proxy_cache_valid[code] time;
default:-
context:http, sercer, location
複製程式碼
快取的維度
syntax: proxy_cache_key string;
default: proxy_cache_key $scheme$proxy_host$request_uri;
context:http,server,location
複製程式碼
配置截圖
level:目錄分級 inactive:不活躍就清理
如何清理指定快取
- rm-rf快取目錄內容
- 第三方擴充套件模組ngx_cache_purge
如何讓部分頁面不快取
syntax : proxy_no_cache string ...;
default: -;
context:http,server,location
複製程式碼
配置截圖
大檔案分片請求
syntax : slice size
default: slice o
context:http,server,location
複製程式碼
http_slice_module
優勢
- 每個子請求收到的資料都會形成一個獨立的檔案,一個請求斷了,其它請求不受到影響
缺點
- 當檔案很大或者slice很小的時候, 可能會導致檔案描述符耗盡等情況。
深度學習
動靜分離
通過中介軟體將動態請求和靜態請求分離
為什麼
- 分離資源,減少不必要的請求消耗,減少請求延時
場景
rewrite規則
應用場景
- url訪問跳轉,支援開發設計
- 頁面跳轉、相容性支援、展示效果等
- seo優化
- 維護
- 後臺維護、流量轉發
- 安全
配置語法
syntax: rewrite regex replacement [flag];
default:-
context:server, location,if
複製程式碼
維護頁面例項
rewrite ^(.*)$ /pages/maintain.html break;
複製程式碼
flag
欄位 | 作用 |
---|---|
last | 停止rewrite檢測 |
break | 停止rewrite檢測 |
redirect | 返回302臨時重定向,位址列會顯示跳轉後的地址 |
permanent | 返回301永久重定向,位址列會顯示跳轉後的地址(瀏覽器下次直接訪問重定向後的地址 |
一些例項
rewrite規則優先順序
- 執行server塊的rewrite指令
- 執行location匹配
- 執行指定的locaiton中的rewrite
nginx高階模組
secure_link_module模組
- 制定並允許檢查請求的連結的真實性以及保護資源免遭未經授權的訪問。
- 限制連結生效週期
syntax: secure_link expression
default:-
context:server, location,server
複製程式碼
syntax: secure_link_md5 expression
default:-
context:server, location,http
複製程式碼
圖示
配置例子
http_geoip_module使用場景
基於ip地址匹配MaxMind GeoIp 二進位制檔案,讀取ip所在地域資訊
yum install nginx-module-geoip
複製程式碼
- 區別國內外做http訪問規則
- 區別國內城市地域做http訪問規則
配置截圖
https服務
對傳輸內容進行加密以及身份驗證。
為什麼需要https
- 傳輸資料被中間人盜用,資訊洩露
- 資料內容劫持,篡改
對稱加密和非對稱加密
https加密協議原理
中間人偽造客戶端和伺服器
如何解決
生成金鑰和CA證照
安裝openssl和http_ssl_module模組
#openssl version
openSSL 1.0.1e-fips 11 feb 2013
#nginx -V
--with-http_ssl_module
複製程式碼
步驟
- 生成key金鑰
openssl genrsa -idea -out jesonc.key 1024
複製程式碼
結果
- 生成證照籤名請求檔案(csr檔案)
openssl req -new -key jesonc.key -out jesonc.csr
複製程式碼
結果
- 生成證照籤名檔案(CA檔案)
openssl x509 -req -days 3650 -in jesonc.csr -signkey jesonc.key -out jesonc.crt
複製程式碼
結果
相關實驗
配置docker(443)
docker run -d -p 443:443 --name nginx_443 nginx_443:latest /sbin/init
nginx -c /etc/nginx/nginx.conf
複製程式碼
conf檔案配置
server {
listen 443;
server_name localhost;
ssl on;
ssl_certificate /etc/nginx/ssl_key/jesonc.crt;
ssl_certificate_key /etc/nginx/ssl_key/jesonc.key;
location / {
root /usr/share/nginx/html;
#limit_conn conn_zone 1;
#limit_req zone=req_zone;
# limit_req zone=req_zone burst nodelay;
# limit_req zone=req_zone burst nodelay;
index index.html index.htm;
}
# my config
location /mystatus {
stub_status;
}
#error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
複製程式碼
測試結果
https服務優化
- 啟用keepalive長連線
- 設定ssl session快取
配置截圖
Nginx架構
以後補上
原文請訪問:http://fanqieto.top/2017/11/29/nginx%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E5%AE%9E%E8%B7%B5/
-------------------------華麗的分割線--------------------
看完的朋友可以點個喜歡/關注,您的支援是對我最大的鼓勵。
想了解更多,歡迎關注我的微信公眾號:番茄技術小棧,所有文章都會第一時間同步到微信公眾號上!