Nginx-加密會話
阿新 • • 發佈:2018-11-30
perm -s .html 狀態 ring ret pts can 首部 Nginx實現ssl會話加密:
ssl on | off; 為指定虛擬機啟用HTTPS protocol, 建議用listen指令代替 ssl_certificate file; 當前虛擬主機使用PEM格式的證書文件 ssl_certificate_key file; 當前虛擬主機上與其證書匹配的私鑰文件 ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]; 支持ssl協議版本,默 認為後三個 ssl_session_timeout time; 客戶端連接可以復用ssl session cache中緩存的ssl參數的有效時長,默認5m ssl_session_cache off | none | [builtin[:size]] [shared:name:size]; none: 通知客戶端支持ssl session cache,但實際不支持 builtin[:size]:使用OpenSSL內建緩存,為每worker進程私有 [shared:name:size]:在各worker之間使用一個共享的緩存 server { listen 443 ssl default_server; listen [::]:443 ssl http2 default_server; server_name app.a.com; root /www/app/html; ssl_certificate "/etc/nginx/conf.d/nginx.crt"; ssl_certificate_key "/etc/nginx/conf.d/nginx.key"; # ssl_session_cache shared:SSL:1m; ssl_session_timeout 10m; ssl_session_cache shared:sslcache:20m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; # location / { } } } 支持同一主機多虛擬主機實現ssl會話 快速申請測試證書: 在/etc/pki/tls/certs/目錄下執行: make [*].crt即可 需要更改一下Makefile文件 /usr/bin/openssl genrsa $(KEYLEN) > $@ #/usr/bin/openssl genrsa [-aes128】 $(KEYLEN) > $@ 去掉[]中的內容,否則會加密!
Nginx地址重寫功能:
7 地址重寫-rewrite[server|location] rewrite [表達式] [替換路徑] [標誌位] location / { root /www/b.org; rewrite ^/images/(.*)$ /imgs/$1; } 這樣用戶再查找http://www.b.org/images/a.jpg就會跳轉至 http://www.b.org/imgs/a.jpg--這個網站一樣會被location規則檢查 標誌位: last:一旦被rewrite規則匹配並重寫後,立刻停止檢查後續的 rewrite規則,而後通過重寫後的規則重新發起請求[響應碼200] break:一旦被rewrite規則匹配並重寫後,立刻停止檢查後續的 rewrite規則,而後繼續由nginx進行後續的操作 redirect:臨時重定向 重寫完成後以臨時重定向方式直接返回重寫後生成的新URI給客戶端 由客戶端重新發起請求 使用相對路徑,或者http://或https:// 開頭 狀態碼返回302臨時重定向[訪問路徑會改變|會發起兩次請求] permanent:重寫完成後以永久重定向方式直接返回重寫後生成的新URI給客戶端 由客戶端重新發起請求 狀態碼:301 具體應用1:整網站重定向 server { server_name www.c.com; listen 80; index index.html; root /web/c.com; error_page 404 =302 /404.html; location /test2/ { try_files $uri /test2/test.html; } location / { rewrite / http://www.a.com/break; } } 測試訪問: [root@apache113:21:20network-scripts]#curl -L http://www.c.com <h1>test a.com page for nginx virt</h1> 已經跳轉至www.a.com網站! 具體應用2:http--->https在不同虛擬機之上 location / { rewrite / https://app.a.com/; } 測試訪問: [root@apache113:28:41network-scripts]#curl -Lk http://www.c.com <h1>test nginx ssl session page</h1> 具體應用3:http--->https在同一虛擬主機 如果此時在按照之前的設置進行配置就會出現死循環 因為無論是http還是https都是一個"/" 報錯格式: [root@apache113:30:50network-scripts]#curl -Lk http://app.a.com curl: (47) Maximum (50) redirects followed 此時我們就需要用到另外一個關鍵語法: if(判斷條件) { } 使用"="和"!="來比較變量與字符串的關系。 使用"~"(對於區分大小寫匹配)和"~*"(不區分大小寫匹配)的操作符來匹配變量的正則表達式。 正則表達式可以包含可用於以後重用的$ 1…$ 9變量的捕獲。 "!~"和"!"!~*"也可用。 如果正則表達式包含"}"或""字符,則整個表達式應該用單引號或雙引號括起來。 用"-f"和"!-f"檢查文件的存在性! 用"-d"和"!-f"檢查目錄的存在性! 用"-e"和"!-e"檢查文件、目錄或符號鏈接的存在! 用"-x"和"!-x"檢查可執行文件 Nginx內置變量:$scheme[獲取http|https] 正確設置方式: location / { if ( $scheme = http ) { rewrite / https://app.a.com; } } 解析:如果請求協議時http就轉發! 測試結果: [root@apache113:30:54network-scripts]#curl -Lk http://app.a.com <h1>test nginx ssl session page</h1> return code: 用於結束rewrite規則,並且為客戶端返回狀態碼 可以使用的狀態碼有 204 400 402-406 500-504等 具體使用:返回提示語句 location /admin { return 403 "You can‘t GET this region"; } 訪問測試: [root@apache113:44:30network-scripts]#curl -I http://www.c.com/admin HTTP/1.1 403 Forbidden 具體使用2:直接跳轉其它頁面 location /admin { return http://app.a.com; } 測試結果: [root@apache113:46:59network-scripts]#curl -Lk http://www.c.com/admin <h1>test nginx ssl session page</h1> rewrite_log on|off 是否把重寫過程記錄再錯誤日誌中,默認級別為notice級別 默認是off,再繁忙的服務器中不建議打開 設置: server { server_name www.c.com; listen 80; index index.html; root /web/c.com; error_log /web/c.com/c.com.erro.log; rewrite_log on; error_page 404 =302 /404.html; location /test2/ { try_files $uri /test2/test.html; } location /admin { return http://app.a.com; } location /down { rewrite /down http://www.c.com/test2; } } 僅對rewrite語句有效|對return語句不起作用! set $variable value; 用戶自定義變量 註意:變量定義和調用都要以$開
Nginx防盜鏈:
很多情況下,如果我們沒有對我們網站的資源做足夠多 的保護,就很可能被別的網站進行盜鏈活動,這樣會很占 據我們自己的網絡帶寬! 例如: 我們自己的網站:www.c.com 競爭產品網站:www.a.com a網站index.html主頁代碼: [root@www19:20:50a.com]#cat index.html <h1>test a.com page for nginx virt</h1> <img src="http://www.c.com/linux.jpg"> 這樣訪問的時候,會在a網站的頁面上出現我們的圖片! 這時候就需要我們運維人員進行設置,防止對方盜鏈: 方法:valid_referers[server|location] 1 定義合規的引用 valid_referers none | blocked | server_names | string ...; 解析: none:referer為空,瀏覽器直接訪問referer值為空, 應該允許訪問 blocked:請求首部中有referer字段,但是referer字段被 清空,通常情況下應該允許訪問 server_names:主機名 regular expression:被指定的正則表達式模式匹配到的字符串,要使用~開頭 arbitrary_string:任意字符串,但可使用*作通配符 2 拒絕不合規的引用 if($invalid_referer) { rewrite; } 具體應用: c網站運維人員設置: location ~* .*\.(jpg|gif)$ { valid_referers none blocked www.c.com *.c.com; if ($invalid_referer) { rewrite ^/ http://www.c.com/test2/index.html; } } 這樣再次訪問a網站的時候就不會被盜鏈了!
Nginx-加密會話