分布式進階(二十三):Nginx 服務器應用配置
一、前言
Nginx作為一個異步框架的 Web服務器,也可以用作反向代理,負載平衡器 和 HTTP緩存,下面本篇文章就來介紹一下Nginx反向代理、SSL及域名配置。
基于公司中標某公司項目,作為項目產品組一員,前期負責服務器環境搭建部分。技術架構如下:
其中,主要實現點如下:
基于外網APP訪問內網Web服務需求,應用nginx反向代理解決。
基于內網Web服務訪問外網Internet服務需求,應用nginx正向代理解決。
隨著訪問并發量的增加,反向代理服務器會逐漸成為整個系統架構中的瓶頸點,容易出現單點故障,故考慮做方向代理服務器集群。
同時考慮到網絡安全,對報文進行SSL傳輸加密處理。
外網APP通過域名方式訪問反向代理服務器,故需要申請外網域名。
二、環境搭建
2.1 Nginx 安裝
上傳Nginx安裝包到服務器
tar -zxvf nginx1.16.1.tar.gz cd nginx1.16.1 yum localinstall *.rpm
2.2 Nginx 配置
將nginx_config.zip解壓。
unzip nginx_config.zip -d nginx_config/
將解壓后的nginx.conf和conf.d/default.conf替換至服務器/etc/nginx/中的相應文件。
將/dtap文件夾中的aimonitor-front的前端文件夾壓縮,并復制至nginx安裝目錄(/usr/share/nginx/html/),改名為AImonitor
tar -cz aimonitor-front -f aimonitor.tar.gz cp aimonitor.tar.gz /usr/share/nginx/html/ tar -zxf aimonitor.tar.gz mv aimonitor-front AImonitor
修改nginx.conf和conf.d/default.conf中的IP信息。
將22.188.15.205改為服務器地址。
啟動nginx
systemctl start nginx
如果啟動成功,效果如下
javascript systemctl restart nginx(重啟)
當修改了配置文件使用:
nginx -s reload
建議不要停止再重啟,以防報錯。
二、反向代理配置
2.1 什么是反向代理?
反向代理和正向代理的區別就是:正向代理代理客戶端,反向代理代理服務器。
反向代理(Reverse Proxy),其實客戶端對代理是無感知的,因為客戶端不需要任何配置就可以訪問,我們只需要將請求發送到反向代理服務器,由反向代理服務器去選擇目標服務器獲取數據后,再返回給客戶端,此時反向代理服務器和目標服務器對外就是一個服務器,暴露的是代理服務器地址,隱藏了真實服務器IP地址。
2.2 反向代理的好處
保護了真實的web服務器,web服務器對外不可見,外網只能看到反向代理服務器,而反向代理服務器上并沒有真實數據,因此,保證了web服務器的資源安全。
反向代理為基礎產生了動靜資源分離以及負載均衡的方式,減輕web服務器的負擔,加速了對網站訪問速度。
節約了有限的IP地址資源,企業內所有的網站共享一個在Internet中注冊的IP地址,這些服務器分配私有地址,采用虛擬主機的方式對外提供服務;
2.3 http 反向代理配置信息
nginx反向代理http配置步驟如下:
vi /etc/nginx/nginx.conf 新增如下配置信息:
server { listen 80; #監聽端口 server_name www.zyjk.com; #域名可以有多個,用空格隔開 charset utf-8; #編碼方式 #對‘/’啟用反向代理 location / { proxy_pass http://22.188.15.185; #必須要加http開頭 proxy_set_header X-Real-IP $remote_addr; } #對‘/images’啟用反向代理 location /images { proxy_pass http://22.188.15.186; #必須要加http開頭 proxy_set_header X-Real-IP $remote_addr; client_max_body_size 10m; #最大消息體 client_body_buffer_size 128k; #最大緩存消息體 proxy_connect_timeout 30; #nginx將一個請求發送至upstream server之前等待的最大時長 proxy_send_timeout 30; # 在連接斷開之前兩次發送至upstream server寫操作的最大間隔時長 proxy_read_timeout 30; #在連接斷開之前兩次從接收upstream server讀操作的最大間隔時長 } }
nginx -s reload重新加載配置。
三、反向代理集群搭建(待補充)
四、正向代理配置
4.1 什么是正向代理?
前面提到過,正向代理代理客戶端,反向代理代理服務器。
理解正向代理、反向代理這兩種代理的關鍵在于代理服務器所代理的對象是什么,正向代理代理的是客戶端,我們需要在客戶端進行一些代理的設置。而反向代理代理的是服務器,作為客戶端的我們是無法感知到服務器的真實存在的。
4.2 http 正向代理配置信息
正向代理:如果把局域網外的Internet想象成一個巨大的資源庫,則局域網中的客戶端要訪問Internet,則需要通過代理服務器來訪問,這種代理服務就稱為正向代理。
Nginx配置如下:
server { resolver 8.8.8.8; resolver_timeout 5s; listen 0.0.0.0:80; access_log /home/reistlin/logs/proxy.access.log; error_log /home/reistlin/logs/proxy.error.log; location / { proxy_pass $scheme://$host$request_uri; proxy_set_header Host $http_host; proxy_buffers 256 4k; proxy_max_temp_file_size 0; proxy_connect_timeout 30; proxy_cache_valid 200 302 10m; proxy_cache_valid 301 1h; proxy_cache_valid any 1m; } }
Nginx 正向代理配置說明:
配置 DNS 解析 IP 地址,比如 Google Public DNS,以及超時時間(5秒)。
resolver 8.8.8.8; resolver_timeout 5s;
配置正向代理參數,均是由 Nginx 變量組成。其中 proxy_set_header 部分的配置,是為了解決如果 URL 中帶 “.”(點)后 Nginx 503 錯誤。
proxy_pass $scheme://$host$request_uri; proxy_set_header Host $http_host;
配置緩存大小,關閉磁盤緩存讀寫減少I/O,以及代理連接超時時間。
proxy_buffers 256 4k; proxy_max_temp_file_size 0; proxy_connect_timeout 30;
配置代理服務器 Http 狀態緩存時間。
proxy_cache_valid 200 302 10m; proxy_cache_valid 301 1h; proxy_cache_valid any 1m;
注意??:nginx正向代理不支持代理 Https 網站。
因為 Nginx 不支持 CONNECT,所以無法正向代理 Https 網站。如果訪問 Https 網站,比如:https://www.google.com,Nginx access.log 日志如下:
"CONNECT www.google.com:443 HTTP/1.1" 400
配置完nginx之后, nginx -s reload重新加載配置。
如果出現80端口被占用,Lsof -i :80 查看80端口的pid進程號,然后用Kill -9 +進程號,刪除進程,再重啟服務。
查看dns方法
cat /etc/resolv.conf
4.3 正向代理使用
在需要訪問外網的機器上(Linux系統)執行以下操作之一即可:
export http_proxy=http://yourproxyaddress:proxyport
gedit ~/.bashrc export http_proxy=http://yourproxyaddress:proxyport
其中,yourproxyaddress也就是你的Nginx服務器的ip了,proxyport就是上面配置中的80,可以根據自己的需要修改。
4.4 Nginx 支持正向代理 https
nginx本身是不支持https協議請求轉發,為了讓nginx能達到這一效果需要借助第三方模塊ngx_http_proxy_connect_module。首先下載這一模塊到服務器,然后準備nginx環境。
// 下載gcc,之后還可能有一些安裝包要下 yum -y install pcre-devel zlib-devel gcc gcc+c++ make openssl-devel pcre-devel zlib-devel patch tar xf nginx-1.6.0.tar.gz unzip /root/ngx_http_proxy_connect_module-master.zip cd /root/nginx-1.6.0/ patch -p1 < /root/ngx_http_proxy_connect_module-master/proxy_connect.patch ./configure --add-module=/root/ngx_http_proxy_connect_module-master/ngx_http_proxy_connect_module make && make install
編譯安裝成功后,配置nginx正向代理:
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #access_log logs/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; server { listen 88; #監聽端口 resolver 183.60.82.98; #dns解析地址 server_name _; #charset koi8-r; #access_log logs/host.access.log main; location / { proxy_pass https://$host$request_uri; #設定http代理服務器的協議和地址 proxy_set_header HOST $host; proxy_buffers 256 4k; proxy_max_temp_file_size 0k; proxy_connect_timeout 30; proxy_send_timeout 60; proxy_read_timeout 60; proxy_next_upstream error timeout invalid_header http_502; #root html; #index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } server { resolver 8.8.8.8; #dns解析地址 listen 89; #代理監聽端口 proxy_connect; proxy_connect_allow 443 563; location / { proxy_pass https://$host$request_uri; #設定https代理服務器的協議和地址 proxy_set_header HOST $host; proxy_buffers 256 4k; proxy_max_temp_file_size 0k; proxy_connect_timeout 30; proxy_send_timeout 60; proxy_read_timeout 60; proxy_next_upstream error timeout invalid_header http_502; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
當配置文件配置好之后保存即可,重啟nginx,進行測試:
nginx -s reload重新加載配置。
去內網服務器里curl,可以在環境變量里添加代理:
vim /etc/profile
... ... #export https_proxy=正向代理IP:端口 export https_proxy=192.168.3.17:89
另一種方式不用加環境變量,臨時代理
#curl -i --proxy 代理IP:端口 要訪問域名 curl -i --proxy 192.168.3.17:89 www.baidu.com
4.4 正向、反向代理對比
通過四、五章節的講解,正向代理代理客戶端,反向代理代理服務器。可以看到反向代理服務器對客戶端透明,客戶端無需任何配置,只需訪問反向代理服務器IP,即可實現訪問內網服務。Nginx反向代理服務器只需配置相應的代理規則即可。
正向代理代理客戶端,需要在作為Nginx正向代理服務器中配置相應的代理規則,配置方式與反向代理基本一致,同一服務器既作為反向代理服務器、又作為正向代理服務器,是由監聽端口轉發。Nginx作為正向代理服務器無法代理Https,若需支持的話,需要額外安裝第三方模塊ngx_http_proxy_connect_module。
五、SSL 配置
5.1 敲黑板
隨著互聯網的快速發展,給我們的生活帶來便利的同時,也伴隨著網絡釣魚、信息泄露、網絡詐騙等網絡安全事件的頻繁發生,企業網站被釣魚網站仿冒,遭受經濟損失,影響品牌形象。
如果網站不使用SSL證書,數據以HTTP明文傳輸,極容易被第三方監聽、截取和篡改,而導致用戶信息被泄露,給在線用戶帶來直接損失。通過部署SSL證書后能確保信息傳輸的安全性,可防止信息泄露。
SSL(Secure Sockets Layer安全套接字協議),及其繼任者傳輸層安全(Transport Layer Security,TLS)是為網絡通信提供安全及數據完整性的一種安全協議。TLS與SSL在傳輸層與應用層之間對網絡連接進行加密。
SSL證書是數字證書(數字證書包括:SSL證書、客戶端證書、代碼簽名證書等)的一種,因為配置在服務器上也稱為服務器SSL證書。SSL證書就是遵守SSL協議,由受信任的數字證書頒發機構CA(如:沃通CA)在驗證服務器身份后頒發的一種數字證書,它使用ssl協議在瀏覽器和web server之間建立一條安全通道,數據信息在client與server之間的安全傳輸.。
SSL協議的特點:
SSL協議可用于保護正常運行于TCP之上的任何應用協議,如HTTP、FTP、SMTP或Telnet的通信,最常見的是用SSL來保護HTTP的通信。
SSL協議的優點在于它是與應用層協議無關的。高層的應用協議(如HTTP、FTP、Telnet等)能透明地建立于SSL協議之上。
SSL協議在應用層協議之前就已經完成加密算法、通信密鑰的協商以及服務器的認證工作。在此之后應用層協議所傳送的數據都會被加密,從而保證通信的安全性。
SSL的功能 :
客戶對服務器的身份認證。SSL服務器允許客戶的瀏覽器使用標準的公鑰加密技術和一些可靠的認證中心(CA)的證書,來確認服務器的合法性。
服務器對客戶的身份認證。也可通過公鑰技術和證書進行認證,也可通過用戶名,password來認證。
建立服務器與客戶之間安全的數據通道。SSL要求客戶與服務器之間所有發送的數據都被發送端加密、接收端解密,同時還檢查數據的完整性。
使用SSL證書的優勢:
SSL證書用于實現數據加密傳輸,防止數據被泄露和篡改;
用于認證服務器身份,防范被釣魚網站攻擊;
用于消除瀏覽器地址欄發出的“不安全”警告;
提高SEO搜索引擎排名;
提升用戶對網站的信任;
有助于提高網站的在線銷售業績;
配置SSL模塊首先需要CA證書,CA證書可以自己手動頒發也可以在阿里云申請。
默認情況下ssl模塊并未被安裝,如果要使用該模塊則需要在編譯nginx時指定–with-http_ssl_module參數。
5.2 CA 證書生成
本小節主要講述如何通過證書簽名生成CA證書。
首先確認nginx服務器已經安裝openssl和nginx已經編譯ssl的模塊。
生成秘鑰和CA證書步驟:
步驟1:生成key秘鑰
步驟2:生成證書簽名請求文件(csr文件)
步驟3:生成證書簽名文件(CA文件)
首先,創建一個用來存放秘鑰的文件夾。
輸入加密算法:openssl genrsa -idea -out jesonc.key 1024
回車,會讓輸入密碼,這里設置為123456,完成后會生成一個.key的文件
openssl req -new -key jesonc.key -out jesonc.csr
打包:openssl x509 -req -days 3650 -in jesonc.csr -signkey jesonc.key -out jesonc.crt
-days 3650:證書過期時間,10年
5.3 https 反向代理配置信息
https 默認采用 SHA-1 算法,非常脆弱。我們可以使用迪菲-赫爾曼密鑰交換。
我們在 /conf/ssl 目錄下生成 dhparam.pem 文件
openssl dhparam -out dhparam.pem 2048
下面的配置 ssl_protocols 和 ssl_ciphers 是用來限制連接只包含 SSL/TLS 的加強版本和算法。
進入/etc/nginx/conf.d/
server { listen 443; server_name 192.168.1.141 jeson.t.imooc.io; ssl on; ssl_certificate /etc/nginx/ssl_key/jesonc.crt; ssl_certificate_key /etc/nginx/ssl_key/jesonc.key; #ssl_certificate_key /etc/nginx/ssl_key/jesonc_nopass.key; ssl_session_cache shared:SSL:10m; # 配置共享會話緩存大小 ssl_session_timeout 10m; # 配置會話超時時間 # 優先采取服務器算法 ssl_prefer_server_ciphers on; # 使用 DH 文件 ssl_dhparam ssl/dhparam.pem; # 協議版本 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 定義算法 ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; # 啟用 HSTS,允許 https 網站要求瀏覽器總是通過 https 來訪問 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; add_header X-Frame-Options DENY; # 減少點擊劫持 add_header X-Content-Type-Options nosniff; # 防XSS攻擊 add_header X-Xss-Protection 1; index index.html index.htm; location / { root /opt/app/code; } }
如果要實現http強制跳轉到https,可以添加下面配置段:
server { listen 80; server_name www.ydyw.com; # 跳轉到HTTPS return 301 https://$server_name$request_uri; }
注意??:網上也有許多使用 rewrite 來重定向,但是 return 指令簡單高效,建議盡量使用 return。
配置好之后,nginx -s reload重新加載配置。
確認已啟用443的監聽:netstat -luntp|grep 443
上面server部分第2-5項是關鍵。這些配置放在 server 塊就可以對其中的所有 location 生效了,并且同時支持 http 和 https 。或者把 http 和 https 分開配置也很常見。
5.3.1 合并證書配置文件
和Apache配置不同,Nginx需要將服務器證書和ca證書鏈合并到一個文件中,作為 ssl_certificate 配置內容。
例如,按照證書鏈從下向上的順序,我有三個證書:
ssl.crt(自己域名的服務器證書)
sub.class1.server.ca.pem(startssl 的一類證書)
ca.pem(startssl 的根證書)
把它們的內容按順序連接到的一個文件中,每個內容另起一行,中間沒有空行或空格。
5.3.2 避免啟動時輸入密碼
配好之后,啟動nginx 會要你輸入密鑰的密碼。這是因為 ssl_certificate_key 配置對應的文件(也就是 startssl 給你的私鑰文件)內容是加密的,需要輸入你創建這個時設置的密碼才能解密。這樣私鑰雖然很安全,但是每次重啟服務都要輸入一次密碼也太麻煩了。其實,只要證書改為解密了的內容,就可以避免每次輸入密碼。用如下命令即可:
openssl rsa -in ssl.key -out newssl.key 輸入密碼,就生成了解密后的私鑰內容,使用這個就OK了。
但是就像前面說的,一定要在服務器上保護好它,例如:
chmod 400 ssl.key (僅root可讀)
5.3.3 優化 SSL 配置
SSL 很消耗 CPU 資源,尤其是在建立連接的握手階段。一是通過開啟 keepalive 可以重用連接。二是可以重用和共享ssl session,見上面ssl_session相關配置。
會話存儲在工作人員之間共享的 SSL 會話緩存中,并由 ssl_session_cache 參數配置。1 兆字節的緩存包含大約 4000 個會話。默認緩存超時為 5 分鐘。它可以通過使用增加 ssl_session_timeout 指令。
六、域名申請(待補充)
七、拓展閱讀
nginx -s stop快速停止
nginx -s quit完整停止
nginx -s reload重新加載配置
ps -ef | grep nginx查看進程id
kill [option] 進程id option: (1) -9強制殺死; (2)TERM或INT快速停止服務; (3)QUIT平緩停止
nginx -v查看版本
nginx -t檢查配置文件
關閉:nginx -s stop -c /etc/nginx/nginx.conf
啟動:nginx -c /etc/nginx/nginx.conf
八、延伸閱讀
《Distributed Processing》
HTTP Nginx 分布式
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。