Nginx 反向代理、Rewrite


Rewrite功能配置

Rewrite是Nginx服務器提供的一個重要基本功能,是Web服務器產品中幾乎必備的功能。主要的作用是用來實現URL的重寫。www.jd.com
注意:Nginx服務器的Rewrite功能的實現依賴於PCRE的支持,因此在編譯安裝Nginx服務器之前,需要安裝PCRE庫。Nginx使用的是ngx_http_rewrite_module模塊來解析和處理Rewrite功能的相關配置。

Rewrite的相關命令

set指令
if指令
break指令
return指令
rewrite指令
rewrite_log指令

Rewrite的應用場景

域名跳轉
域名鏡像
獨立域名
目錄自動添加"/"
合並目錄
防盜鏈的實現

Rewrite的相關指令

set指令

該指令用來設置一個新的變量。

語法 set $variable value;
默認值
位置 server、location、if

variable:變量的名稱,該變量名稱要用"$"作為變量的第一個字符,且不要與Nginx服務器預設的全局變量同名。

value:變量的值,可以是字符串、其他變量或者變量的組合等。

Rewrite常用全局變量

變量 說明
$args 變量中存放了請求URL中的請求參數。比如http://192.168.200.133/server?arg1=value1&args2=value2中的"arg1=value1&arg2=value2",功能和$query_string一樣
$http_user_agent 變量存儲的是用戶訪問服務的代理信息(如果通過瀏覽器訪問,記錄的是瀏覽器的相關版本信息)
$host 變量存儲的是訪問服務器的server_name值
$document_uri 變量存儲的是當前訪問地址的URI。比如http://192.168.200.133/server?id=10&name=zhangsan中的"/server",功能和$uri一樣
$document_root 變量存儲的是當前請求對應location的root值,如果未設置,默認指向Nginx自帶html目錄所在位置
$content_length 變量存儲的是請求頭中的Content-Length的值
$content_type 變量存儲的是請求頭中的Content-Type的值
$http_cookie 變量存儲的是客戶端的cookie信息,可以通過add_header Set-Cookie 'cookieName=cookieValue'來添加cookie數據
$limit_rate 變量中存儲的是Nginx服務器對網絡連接速率的限制,也就是Nginx配置中對limit_rate指令設置的值,默認是0,不限制。
$remote_addr 變量中存儲的是客戶端的IP地址
$remote_port 變量中存儲了客戶端與服務端建立連接的端口號
$remote_user 變量中存儲了客戶端的用戶名,需要有認證模塊才能獲取
$scheme 變量中存儲了訪問協議
$server_addr 變量中存儲了服務端的地址
$server_name 變量中存儲了客戶端請求到達的服務器的名稱
$server_port 變量中存儲了客戶端請求到達服務器的端口號
$server_protocol 變量中存儲了客戶端請求協議的版本,比如"HTTP/1.1"
$request_body_file 變量中存儲了發給后端服務器的本地文件資源的名稱
$request_method 變量中存儲了客戶端的請求方式,比如"GET","POST"等
$request_filename 變量中存儲了當前請求的資源文件的路徑名
$request_uri 變量中存儲了當前請求的URI,並且攜帶請求參數,比如http://192.168.200.133/server?id=10&name=zhangsan中的"/server?id=10&name=zhangsan"

上述參數還可以在日志文件中使用,這個就要用到前面我們介紹的log_format指令

log_format main '$remote_addr - $request - $status-$request_uri  $http_user_agent';

access_log logs/access.log main;

if指令

該指令用來支持條件判斷,並根據條件判斷結果選擇不同的Nginx配置。

語法 if (condition)
默認值
位置 server、location

condition為判定條件,可以支持以下寫法:

  1. 變量名。如果變量名對應的值為空字符串或"0",if都判斷為false,其他條件為true。
if ($param){
	
}
  1. 使用"="和"!="比較變量和字符串是否相等,滿足條件為true,不滿足為false
if ($request_method = POST){
	return 405;
}

注意:此處和Java不太一樣的地方是字符串不需要添加引號,並且等號和不等號前后到需要加空格。

  1. 使用正則表達式對變量進行匹配,匹配成功返回true,否則返回false。變量與正則表達式之間使用"","*","!","!*"來連接。

    "~"代表匹配正則表達式過程中區分大小寫,

    "~*"代表匹配正則表達式過程中不區分大小寫

    "!"和"!*"剛好和上面取相反值,如果匹配上返回false,匹配不上返回true

if ($http_user_agent ~ MSIE){
	#$http_user_agent的值中是否包含MSIE字符串,如果包含返回true
}

注意:正則表達式字符串一般不需要加引號,但是如果字符串中包含"}"或者是";"等字符時,就需要把引號加上。

  1. 判斷請求的文件是否存在使用"-f"和"!-f",
if (-f $request_filename){
	#判斷請求的文件是否存在
}
if (!-f $request_filename){
	#判斷請求的文件是否不存在
}
  1. 判斷請求的目錄是否存在使用"-d"和"!-d"

  2. 判斷請求的目錄或者文件是否存在使用"-e"和"!-e"

  3. 判斷請求的文件是否可執行使用"-x"和"!-x"

break指令

該指令用於中斷當前相同作用域中的其他Nginx配置。與該指令處於同一作用域的Nginx配置中,位於它前面的指令配置生效,位於后面的指令配置無效。並且break還有另外一個功能就是終止當前的匹配並把當前的URI在本location進行重定向訪問處理。

語法 break;
默認值
位置 server、location、if

例子:

location /testbreak{
	default_type text/plain;
	set $username TOM;
	if ($args){
		Set $username JERRY;
        break;
		set $username ROSE;
	}
	add_header username $username;
	return 200 $username;
}

return指令

該指令用於完成對請求的處理,直接向客戶端返回。在return后的所有Nginx配置都是無效的。

語法 return code [text];
return code URL;
return URL;
默認值
位置 server、location、if

code:為返回給客戶端的HTTP狀態代理。可以返回的狀態代碼為0~999的任意HTTP狀態代理

text:為返回給客戶端的響應體內容,支持變量的使用

URL:為返回給客戶端的URL地址

location /testreturn {

	return 200 success;
}

location /testreturn {

	return https://www.baidu.com; // 302重定向到百度
}

location /testreturn {
	return 302 https://www.baidu.com;
}

location /testreturn {
	return 302 www.baidu.com;//不允許這么寫
}

rewrite指令

該指令通過正則表達式的使用來改變URI。可以同時存在一個或者多個指令,按照順序依次對URL進行匹配和處理。

語法 rewrite regex replacement [flag];
默認值
位置 server、location、if

regex:用來匹配URI的正則表達式

replacement:匹配成功后,用於替換URI中被截取內容的字符串。如果該字符串是以"http://"或者"https://"開頭的,則不會繼續向下對URI進行其他處理,而是直接返回重寫后的URI給客戶端。

location rewrite {
	rewrite ^/rewrite/url\w*$ https://www.baidu.com;
	rewrite ^/rewrite/(test)\w*$ /$1;
	rewrite ^/rewrite/(demo)\w*$ /$1;
}
location /test{
	default_type text/plain;
	return 200 test_success;
}
location /demo{
	default_type text/plain;
	return 200 demo_success;
}

flag:用來設置rewrite對URI的處理行為,可選值有如下:

  • last:終止繼續在本location塊中處理接收到的URI,並將此處重寫的URI作為一個新的URI,使用各location塊進行處理。該標志將重寫后的URI重寫在server塊中執行,為重寫后的URI提供了轉入到其他location塊的機會。
location rewrite {
	rewrite ^/rewrite/(test)\w*$ /$1 last;
	rewrite ^/rewrite/(demo)\w*$ /$1 last;
}
location /test{
	default_type text/plain;
	return 200 test_success;
}
location /demo{
	default_type text/plain;
	return 200 demo_success;
}

訪問 http://192.168.200.133:8081/rewrite/testabc,能正確訪問

1589475653252

  • break:將此處重寫的URI作為一個新的URI,在本塊中繼續進行處理。該標志將重寫后的地址在當前的location塊中執行,不會將新的URI轉向其他的location塊。
location rewrite {
    #/test   /usr/local/nginx/html/test/index.html
	rewrite ^/rewrite/(test)\w*$ /$1 break;
	rewrite ^/rewrite/(demo)\w*$ /$1 break;
}
location /test{
	default_type text/plain;
	return 200 test_success;
}
location /demo{
	default_type text/plain;
	return 200 demo_success;
}

訪問 http://192.168.200.133:8081/rewrite/demoabc,頁面報404錯誤

1589475732042
  • redirect:將重寫后的URI返回給客戶端,狀態碼為302,指明是臨時重定向URI,主要用在replacement變量不是以"http://"或者"https://"開頭的情況。
location rewrite {
	rewrite ^/rewrite/(test)\w*$ /$1 redirect;
	rewrite ^/rewrite/(demo)\w*$ /$1 redirect;
}
location /test{
	default_type text/plain;
	return 200 test_success;
}
location /demo{
	default_type text/plain;
	return 200 demo_success;
}

訪問http://192.168.200.133:8081/rewrite/testabc請求會被臨時重定向,瀏覽器地址也會發生改變

  • permanent:將重寫后的URI返回給客戶端,狀態碼為301,指明是永久重定向URI,主要用在replacement變量不是以"http://"或者"https://"開頭的情況。
location rewrite {
	rewrite ^/rewrite/(test)\w*$ /$1 permanent;
	rewrite ^/rewrite/(demo)\w*$ /$1 permanent;
}
location /test{
	default_type text/plain;
	return 200 test_success;
}
location /demo{
	default_type text/plain;
	return 200 demo_success;
}

訪問http://192.168.200.133:8081/rewrite/testabc請求會被永久重定向,瀏覽器地址也會發生改變

rewrite_log指令

該指令配置是否開啟URL重寫日志的輸出功能。

語法 rewrite_log on|off;
默認值 rewrite_log off;
位置 http、server、location、if

開啟后,URL重寫的相關日志將以notice級別輸出到error_log指令配置的日志文件匯總。

rewrite_log on;
error_log  logs/error.log notice;

Rewrite的案例

域名跳轉

》問題分析

先來看一個效果,如果我們想訪問京東網站,大家都知道我們可以輸入www.jd.com,但是同樣的我們也可以輸入www.360buy.com同樣也都能訪問到京東網站。這個其實是因為京東剛開始的時候域名就是www.360buy.com,后面由於各種原因把自己的域名換成了www.jd.com, 雖然說域名變量,但是對於以前只記住了www.360buy.com的用戶來說,我們如何把這部分用戶也遷移到我們新域名的訪問上來,針對於這個問題,我們就可以使用Nginx中Rewrite的域名跳轉來解決。

》環境准備

  • 准備三個域名:
vim /etc/hosts
127.0.0.1   www.itcast.cn
127.0.0.1   www.itheima.cn
127.0.0.1   www.itheima.com
  • 通過Nginx實現訪問www.itcast.cn
server {
	listen 80;
	server_name www.itcast.cn;
	location /{
		default_type text/html;
		return 200 '<h1>welcome to itcast</h1>';
	}
}

》通過Rewrite完成將www.ithema.com和www.itheima.cn的請求跳轉到www.itcast.com

server {
	listen 80;
	server_name www.itheima.com www.itheima.cn;
	rewrite ^/ http://www.itcast.cn;
}

問題描述:如何在域名跳轉的過程中攜帶請求的URI?

修改配置信息

server {
	listen 80;
	server_name www.itheima.com www.itheima.cn;
	rewrite ^(.*) http://www.itcast.cn$1;
}

域名鏡像

鏡像網站指定是將一個完全相同的網站分別放置到幾台服務器上,並分別使用獨立的URL進行訪問。其中一台服務器上的網站叫主站,其他的為鏡像網站。鏡像網站和主站沒有太大的區別,可以把鏡像網站理解為主站的一個備份節點。可以通過鏡像網站提供網站在不同地區的響應速度。鏡像網站可以平衡網站的流量負載、可以解決網絡寬帶限制、封鎖等。

1589560433192

而我們所說的域名鏡像和網站鏡像比較類似,上述案例中,將www.itheima.com和 www.itheima.cn都能跳轉到www.itcast.cn,那么www.itcast.cn我們就可以把它起名叫主域名,其他兩個就是我們所說的鏡像域名,當然如果我們不想把整個網站做鏡像,只想為其中某一個子目錄下的資源做鏡像,我們可以在location塊中配置rewrite功能,比如:

server {
    listen          80;
    server_name     www.itheima.cn www.itheima.com;
    location /user {
    	rewrite ^/user(.*)$ http://www.itcast.cn$1;
    }
    location /emp{
        default_type text/html;
        return 200 '<h1>emp_success</h1>';
    }
}

獨立域名

一個完整的項目包含多個模塊,比如購物網站有商品搜索模塊、商品詳情模塊和購物車模塊等,那么我們如何為每一個模塊設置獨立的域名。

需求:

http://search.itcast.com:81  訪問商品搜索模塊
http://item.itcast.com:82	  訪問商品詳情模塊
http://cart.itcast.com:83	  訪問商品購物車模塊
server{
	listen 81;
	server_name search.itcast.com;
	rewrite ^(.*) http://www.itcast.cn/search$1;
}
server{
	listen 82;
	server_name item.itcast.com;
	rewrite ^(.*) http://www.itcast.cn/item$1;
}
server{
	listen 83;
	server_name cart.itcast.com;
	rewrite ^(.*) http://www.itcast.cn/cart$1;
}

目錄自動添加"/"

問題描述

通過一個例子來演示下問題:

server {
	listen	8082;
	server_name localhost;
	location /heima {
		root html;
		index index.html;
	}
}

通過http://192.168.200.133:8082/heima和通過http://192.168.200.133:8082/heima/訪問的區別?

如果不加斜杠,Nginx服務器內部會自動做一個301的重定向,重定向的地址會有一個指令叫server_name_in_redirect on|off;來決定重定向的地址:

如果該指令為on
	重定向的地址為:  http://server_name:8082/目錄名/;
	http://localhost:8082/heima/
如果該指令為off
	重定向的地址為:  http://原URL中的域名:8082/目錄名/;
	http://192.168.200.133:8082/heima/

所以就拿剛才的地址來說,http://192.168.200.133:8082/heima如果不加斜杠,那么按照上述規則,如果指令server_name_in_redirect為on,則301重定向地址變為 http://localhost:8082/heima/,如果為off,則301重定向地址變為http://192.168.200.133:8082/heima/。后面這個是正常的,前面地址就有問題。

注意server_name_in_redirect指令在Nginx的0.8.48版本之前默認都是on,之后改成了off,所以現在我們這個版本不需要考慮這個問題,但是如果是0.8.48以前的版本並且server_name_in_redirect設置為on,我們如何通過rewrite來解決這個問題?

解決方案

我們可以使用rewrite功能為末尾沒有斜杠的URL自動添加一個斜杠

server {
	listen	80;
	server_name localhost;
	server_name_in_redirect on;
	location /heima {
		if (-d $request_filename){
			rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
		}
	}
}

合並目錄

搜索引擎優化(SEO)是一種利用搜索引擎的搜索規則來提高目的網站在有關搜索引擎內排名的方式。我們在創建自己的站點時,可以通過很多中方式來有效的提供搜索引擎優化的程度。其中有一項就包含URL的目錄層級一般不要超過三層,否則的話不利於搜索引擎的搜索也給客戶端的輸入帶來了負擔,但是將所有的文件放在一個目錄下又會導致文件資源管理混亂並且訪問文件的速度也會隨着文件增多而慢下來,這兩個問題是相互矛盾的,那么使用rewrite如何解決上述問題?

舉例,網站中有一個資源文件的訪問路徑時 /server/11/22/33/44/20.html,也就是說20.html存在於第5級目錄下,如果想要訪問該資源文件,客戶端的URL地址就要寫成 http://192.168.200.133/server/11/22/33/44/20.html,

server {
	listen 8083;
	server_name localhost;
	location /server{
		root html;
	}
}

但是這個是非常不利於SEO搜索引擎優化的,同時客戶端也不好記.使用rewrite我們可以進行如下配置:

server {
	listen 8083;
	server_name localhost;
	location /server{
		rewrite ^/server-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /server/$1/$2/$3/$4/$5.html last;
	}
}

這樣的花,客戶端只需要輸入http://www.web.name/server-11-22-33-44-20.html就可以訪問到20.html頁面了。這里也充分利用了rewrite指令支持正則表達式的特性。

防盜鏈

防盜鏈之前我們已經介紹過了相關的知識,在rewrite中的防盜鏈和之前將的原理其實都是一樣的,只不過通過rewrite可以將防盜鏈的功能進行完善下,當出現防盜鏈的情況,我們可以使用rewrite將請求轉發到自定義的一張圖片和頁面,給用戶比較好的提示信息。下面我們就通過根據文件類型實現防盜鏈的一個配置實例:

location /images {
    root html;
    valid_referers none blocked www.baidu.com;
    if ($invalid_referer){
        #return 403;
        rewrite ^/    /images/forbidden.png break;
    }
}

Nginx反向代理

Nginx反向代理概述

關於正向代理和反向代理,我們在前面的章節已經通過一張圖給大家詳細的介紹過了,簡而言之就是正向代理代理的對象是客戶端,反向代理代理的是服務端,這是兩者之間最大的區別。

Nginx即可以實現正向代理,也可以實現反向代理。

我們先來通過一個小案例演示下Nginx正向代理的簡單應用。

先提需求:

(1)服務端的設置:

http {
  log_format main 'client send request=>clientIp=$remote_addr serverIp=>$host';
	server{
		listen 80;
		server_name	localhost;
		access_log logs/access.log main;
		location {
			root html;
			index index.html index.htm;
		}
	}
}

(2)使用客戶端訪問服務端,打開日志查看結果

1589729000713

(3)代理服務器設置:

server {

        listen  82;
        resolver 8.8.8.8;
        location /{
                proxy_pass http://$host$request_uri;
        }
    }

(4)查看代理服務器的IP(192.168.200.146)和Nginx配置監聽的端口(82)

(5)在客戶端配置代理服務器

(6)設置完成后,再次通過瀏覽器訪問服務端

1589729479920

通過對比,上下兩次的日志記錄,會發現雖然我們是客戶端訪問服務端,但是如何使用了代理,那么服務端能看到的只是代理發送過去的請求,這樣的化,就使用Nginx實現了正向代理的設置。

但是Nginx正向代理,在實際的應用中不是特別多,所以我們簡單了解下,接下來我們繼續學習Nginx的反向代理,這是Nginx比較重要的一個功能。

Nginx反向代理的配置語法

Nginx反向代理模塊的指令是由ngx_http_proxy_module模塊進行解析,該模塊在安裝Nginx的時候已經自己加裝到Nginx中了,接下來我們把反向代理中的常用指令一一介紹下:

proxy_pass
proxy_set_header
proxy_redirect

proxy_pass

該指令用來設置被代理服務器地址,可以是主機名稱、IP地址加端口號形式。

語法 proxy_pass URL;
默認值
位置 location

URL:為要設置的被代理服務器地址,包含傳輸協議(http,https://)、主機名稱或IP地址加端口號、URI等要素。

舉例:

proxy_pass http://www.baidu.com;
location /server{}
proxy_pass http://192.168.200.146;
    http://192.168.200.146/server/index.html
proxy_pass http://192.168.200.146/;
    http://192.168.200.146/index.html

大家在編寫proxy_pass的時候,后面的值要不要加"/"?

接下來通過例子來說明剛才我們提到的問題:

server {
	listen 80;
	server_name localhost;
	location /{
		#proxy_pass http://192.168.200.146;
		proxy_pass http://192.168.200.146/;
	}
}
當客戶端訪問 http://localhost/index.html,效果是一樣的
server{
	listen 80;
	server_name localhost;
	location /server{
		#proxy_pass http://192.168.200.146;
		proxy_pass http://192.168.200.146/;
	}
}
當客戶端訪問 http://localhost/server/index.html
這個時候,第一個proxy_pass就變成了http://localhost/server/index.html
第二個proxy_pass就變成了http://localhost/index.html效果就不一樣了。

proxy_set_header

該指令可以更改Nginx服務器接收到的客戶端請求的請求頭信息,然后將新的請求頭發送給代理的服務器

語法 proxy_set_header field value;
默認值 proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
位置 http、server、location

需要注意的是,如果想要看到結果,必須在被代理的服務器上來獲取添加的頭信息。

被代理服務器: [192.168.200.146]

server {
        listen  8080;
        server_name localhost;
        default_type text/plain;
        return 200 $http_username;
}

代理服務器: [192.168.200.133]

server {
        listen  8080;
        server_name localhost;
        location /server {
                proxy_pass http://192.168.200.146:8080/;
                proxy_set_header username TOM;
        }
    }

訪問測試

proxy_redirect

該指令是用來重置頭信息中的"Location"和"Refresh"的值。

語法 proxy_redirect redirect replacement;
proxy_redirect default;
proxy_redirect off;
默認值 proxy_redirect default;
位置 http、server、location

》為什么要用該指令?

服務端[192.168.200.146]

server {
    listen  8081;
    server_name localhost;
    if (!-f $request_filename){
    	return 302 http://192.168.200.146;
    }
}

代理服務端[192.168.200.133]

server {
	listen  8081;
	server_name localhost;
	location / {
		proxy_pass http://192.168.200.146:8081/;
		proxy_redirect http://192.168.200.146 http://192.168.200.133;
	}
}

》該指令的幾組選項

proxy_redirect redirect replacement;

redirect:目標,Location的值
replacement:要替換的值

proxy_redirect default;

default;
將location塊的uri變量作為replacement,
將proxy_pass變量作為redirect進行替換

proxy_redirect off;

關閉proxy_redirect的功能

Nginx反向代理實戰

1581883378672

服務器1,2,3存在兩種情況

第一種情況: 三台服務器的內容不一樣。
第二種情況: 三台服務器的內容是一樣。
  1. 如果服務器1、服務器2和服務器3的內容不一樣,那我們可以根據用戶請求來分發到不同的服務器。
代理服務器
server {
        listen          8082;
        server_name     localhost;
        location /server1 {
                proxy_pass http://192.168.200.146:9001/;
        }
        location /server2 {
                proxy_pass http://192.168.200.146:9002/;
        }
        location /server3 {
                proxy_pass http://192.168.200.146:9003/;
        }
}

服務端
server1
server {
        listen          9001;
        server_name     localhost;
        default_type text/html;
        return 200 '<h1>192.168.200.146:9001</h1>'
}
server2
server {
        listen          9002;
        server_name     localhost;
        default_type text/html;
        return 200 '<h1>192.168.200.146:9002</h1>'
}
server3
server {
        listen          9003;
        server_name     localhost;
        default_type text/html;
        return 200 '<h1>192.168.200.146:9003</h1>'
}
  1. 如果服務器1、服務器2和服務器3的內容是一樣的,該如何處理?

Nginx的安全控制

關於web服務器的安全是比較大的一個話題,里面所涉及的內容很多,Nginx反向代理是如何來提升web服務器的安全呢?

安全隔離

什么是安全隔離?

通過代理分開了客戶端到應用程序服務器端的連接,實現了安全措施。在反向代理之前設置防火牆,僅留一個入口供代理服務器訪問。

1589908851340

如何使用SSL對流量進行加密

翻譯成大家能熟悉的說法就是將我們常用的http請求轉變成https請求,那么這兩個之間的區別簡單的來說兩個都是HTTP協議,只不過https是身披SSL外殼的http.

HTTPS是一種通過計算機網絡進行安全通信的傳輸協議。它經由HTTP進行通信,利用SSL/TLS建立全通信,加密數據包,確保數據的安全性。

SSL(Secure Sockets Layer)安全套接層

TLS(Transport Layer Security)傳輸層安全

上述這兩個是為網絡通信提供安全及數據完整性的一種安全協議,TLS和SSL在傳輸層和應用層對網絡連接進行加密。

總結來說為什么要使用https:

http協議是明文傳輸數據,存在安全問題,而https是加密傳輸,相當於http+ssl,並且可以防止流量劫持。

Nginx要想使用SSL,需要滿足一個條件即需要添加一個模塊--with-http_ssl_module,而該模塊在編譯的過程中又需要OpenSSL的支持,這個我們之前已經准備好了。

nginx添加SSL的支持

(1)完成 --with-http_ssl_module模塊的增量添加

》將原有/usr/local/nginx/sbin/nginx進行備份
》拷貝nginx之前的配置信息
》在nginx的安裝源碼進行配置指定對應模塊  ./configure --with-http_ssl_module
》通過make模板進行編譯
》將objs下面的nginx移動到/usr/local/nginx/sbin下
》在源碼目錄下執行  make upgrade進行升級,這個可以實現不停機添加新模塊的功能
Nginx的SSL相關指令

因為剛才我們介紹過該模塊的指令都是通過ngx_http_ssl_module模塊來解析的。

》ssl:該指令用來在指定的服務器開啟HTTPS,可以使用 listen 443 ssl,后面這種方式更通用些。

語法 ssl on | off;
默認值 ssl off;
位置 http、server
server{
	listen 443 ssl;
}

》ssl_certificate:為當前這個虛擬主機指定一個帶有PEM格式證書的證書。

語法 ssl_certificate file;
默認值
位置 http、server

》ssl_certificate_key:該指令用來指定PEM secret key文件的路徑

語法 ssl_ceritificate_key file;
默認值
位置 http、server

》ssl_session_cache:該指令用來配置用於SSL會話的緩存

語法 ssl_sesion_cache off|none|[builtin[:size]] [shared:name:size]
默認值 ssl_session_cache none;
位置 http、server

off:禁用會話緩存,客戶端不得重復使用會話

none:禁止使用會話緩存,客戶端可以重復使用,但是並沒有在緩存中存儲會話參數

builtin:內置OpenSSL緩存,僅在一個工作進程中使用。

shared:所有工作進程之間共享緩存,緩存的相關信息用name和size來指定

》ssl_session_timeout:開啟SSL會話功能后,設置客戶端能夠反復使用儲存在緩存中的會話參數時間。

語法 ssl_session_timeout time;
默認值 ssl_session_timeout 5m;
位置 http、server

》ssl_ciphers:指出允許的密碼,密碼指定為OpenSSL支持的格式

語法 ssl_ciphers ciphers;
默認值 ssl_ciphers HIGH:!aNULL:!MD5;
位置 http、server

可以使用openssl ciphers查看openssl支持的格式。

》ssl_prefer_server_ciphers:該指令指定是否服務器密碼優先客戶端密碼

語法 ssl_perfer_server_ciphers on|off;
默認值 ssl_perfer_server_ciphers off;
位置 http、server
生成證書

方式一:使用阿里雲/騰訊雲等第三方服務進行購買。

方式二:使用openssl生成證書

先要確認當前系統是否有安裝openssl

openssl version

安裝下面的命令進行生成

mkdir /root/cert
cd /root/cert
openssl genrsa -des3 -out server.key 1024
openssl req -new -key server.key -out server.csr
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
開啟SSL實例
server {
    listen       443 ssl;
    server_name  localhost;

    ssl_certificate      server.cert;
    ssl_certificate_key  server.key;

    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;

    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    location / {
        root   html;
        index  index.html index.htm;
    }
}

(4)驗證

反向代理系統調優

反向代理值Buffer和Cache

Buffer翻譯過來是"緩沖",Cache翻譯過來是"緩存"。

1581879638569

總結下:

相同點:
兩種方式都是用來提供IO吞吐效率,都是用來提升Nginx代理的性能。
不同點:
緩沖主要用來解決不同設備之間數據傳遞速度不一致導致的性能低的問題,緩沖中的數據一旦此次操作完成后,就可以刪除。
緩存主要是備份,將被代理服務器的數據緩存一份到代理服務器,這樣的話,客戶端再次獲取相同數據的時候,就只需要從代理服務器上獲取,效率較高,緩存中的數據可以重復使用,只有滿足特定條件才會刪除.

(1)Proxy Buffer相關指令

》proxy_buffering :該指令用來開啟或者關閉代理服務器的緩沖區;

語法 proxy_buffering on|off;
默認值 proxy_buffering on;
位置 http、server、location

》proxy_buffers:該指令用來指定單個連接從代理服務器讀取響應的緩存區的個數和大小。

語法 proxy_buffers number size;
默認值 proxy_buffers 8 4k | 8K;(與系統平台有關)
位置 http、server、location

number:緩沖區的個數

size:每個緩沖區的大小,緩沖區的總大小就是number*size

》proxy_buffer_size:該指令用來設置從被代理服務器獲取的第一部分響應數據的大小。保持與proxy_buffers中的size一致即可,當然也可以更小。

語法 proxy_buffer_size size;
默認值 proxy_buffer_size 4k | 8k;(與系統平台有關)
位置 http、server、location

》proxy_busy_buffers_size:該指令用來限制同時處於BUSY狀態的緩沖總大小。

語法 proxy_busy_buffers_size size;
默認值 proxy_busy_buffers_size 8k|16K;
位置 http、server、location

》proxy_temp_path:當緩沖區存滿后,仍未被Nginx服務器完全接受,響應數據就會被臨時存放在磁盤文件上,該指令設置文件路徑

語法 proxy_temp_path path;
默認值 proxy_temp_path proxy_temp;
位置 http、server、location

注意path最多設置三層。

》proxy_temp_file_write_size:該指令用來設置磁盤上緩沖文件的大小。

語法 proxy_temp_file_write_size size;
默認值 proxy_temp_file_write_size 8K|16K;
位置 http、server、location

通用網站的配置

proxy_buffering on;
proxy_buffer_size 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;

根據項目的具體內容進行相應的調節。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM