12.17 Nginx負載均衡
12.18 ssl原理
12.19 生成ssl密鑰對
12.20 Nginx配置ssl
擴展
針對請求的uri來代理 http://ask.apelearn.com/question/1049
根據訪問的目錄來區分後端的web http://ask.apelearn.com/question/920
nginx長連接 http://www.apelearn.com/bbs/thread-6545-1-1.html
nginx算法分析 http://blog.sina.com.cn/s/blog_72995dcc01016msi.html
12.17 Nginx負載均衡
代理1臺Web服務器稱爲代理
代理2臺Web服務器稱爲負載均衡
nginx代理不支持https解析
1 域名解析qq.com的ip
利用dig工具查看(yum install -y bind-utils)
2 負載均衡配置如下,
# vim /usr/local/nginx/conf/vhost/load.conf
upstream qq_com { ip_hash; server 61.135.157.156:80; server 125.39.240.113:80; } server { listen 80; server_name www.qq.com; location / { proxy_pass http://qq_com; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
配置解釋:
藉助模塊upstream,
proxy_pass不支持定義多個ip,proxy_pass後面跟的就是upstream的名字。
upstream 與proxy_pass後面接的都是名字,而不是主要域名。
主要域名,ip參數是此三項。
server_name www.qq.com; server 61.135.157.156:80; server 125.39.240.113:80;
ip_hash;
ip_hash 目的 同一個用戶始終保留在同一臺機器上。
它表示根據ip地址把請求分到不同的服務器上。
比如用戶A的ip是1.1.1.1,用戶B的IP是2.2.2.2,則A訪問的時候會把請求轉發到第一個Web服務器上,
B訪問的時候會到第二個Web服務器上。
ip_hash 下面可以定義多個ip,格式是ip:port
3 curl 測試(未重新加載前,配置未生效。)
[root@AliKvn vhost]# curl -x127.0.0.1:80 www.qq.com
this is a default site.
未配置的時候,從本機訪問www.qq.com的時候是訪問本機的默認網站。
4 檢查語法,並重新加載。
[root@AliKvn vhost]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@AliKvn vhost]# /usr/local/nginx/sbin/nginx -s reload
5 curl測試,通過訪問,顯示網頁代碼,狀態碼200.
12.18 ssl原理
HTTP與HTTPS的區別:
HTTPS是一種加密的HTTP協議,如果HTTP通信的數據包在傳輸過程中被截獲,我們可以破譯這些數據包的信息,
這裏面可能會有一些用戶名,密碼,手機登敏感信息。如果使用HTTPS通信,即使數據包被截獲,也無法破譯裏面的內容。
SSL的原理工作流程圖
文字解釋SSL工作流程
1 瀏覽器發送一個https的請求給服務器;
2 服務器要有一套數字證書,可以自己製作(後面的操作就是阿銘自己製作的證書),也可以向組織申請,區別就是自己頒發的證書需要客戶端驗證通過,纔可以繼續訪問,而使用受信任的公司申請的證書則不會彈出>提示頁面,這套證書其實就是一對公鑰和私鑰;
3 服務器會把公鑰傳輸給客戶端;
4 客戶端(瀏覽器)收到公鑰後,會驗證其是否合法有效,無效會有警告提醒,有效則會生成一串隨機數,並用收到的公鑰加密;
5 客戶端把加密後的隨機字符串傳輸給服務器;
6 服務器收到加密隨機字符串後,先用私鑰解密(公鑰加密,私鑰解密),獲取到這一串隨機數後,再用這串隨機字符串加密傳輸的數據(該加密爲對稱加密,所謂對稱加密,就是將數據和私鑰也就是這個隨機字符串>通過某種算法混合在一起,這樣除非知道私鑰,否則無法獲取數據內容);
7 服務器把加密後的數據傳輸給客戶端;
8 客戶端收到數據後,再用自己的私鑰也就是那個隨機字符串解密;
https的工作原理就是反覆給數據執行公鑰與私鑰的加密解密的過程。
12.19 生成ssl密鑰對
1 進入/conf目錄
[root@AliKvn vhost]# cd /usr/local/nginx/conf/
2 使用openssl工具生成私鑰文件,定義密碼 .key爲私鑰文件
[root@AliKvn conf]# openssl genrsa -des3 -out tmp.key 2048
3 轉換key,取消密碼。因爲密碼每次加密解密都輸入密碼過於頻繁,此處刪除密碼。
[root@AliKvn conf]# openssl rsa -in tmp.key -out aminglinux.key
Enter pass phrase for tmp.key:
writing RSA key
4 刪除tmp.key
[root@AliKvn conf]#rm -f tmp.key
5 生成證書請求文件csr,需要拿這個文件和私鑰一起生產公鑰文件。
[root@AliKvn conf]# openssl req -new -key aminglinux.key -out aminglinux.csr
生成crt文件
[root@AliKvn conf]# openssl x509 -req -days 365 -in aminglinux.csr -signkey aminglinux.key -out aminglinux.crt
[root@AliKvn conf]# ls aminglinux.*
aminglinux.crt aminglinux.csr aminglinux.key
這裏的aminglinux.crt爲公鑰
6 有了.csr .crt文件後,可以配置ssl了
12.20 Nginx配置ssl
1 配置ssl.conf
#vim /usr/local/nginx/conf/vhost/ssl.conf
server { listen 443; server_name aming.com; index index.html index.php; root /data/wwwroot/aming.com; ssl on; ssl_certificate aminglinux.crt; ssl_certificate_key aminglinux.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; }
配置解釋:
ssl on;
開啓ssl
ssl_certificate aminglinux.crt
指定公鑰
ssl_certificate_key aminglinux.key;
指定私鑰
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
協議,一般三種都需要配置上。
2 檢查語法
[root@AliKvn vhost]# /usr/local/nginx/sbin/nginx -t
nginx: [emerg] unknown directive "ssl" in /usr/local/nginx/conf/vhost/ssl.conf:7
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed
第七行報錯提示,unknown ssl,因爲當初編譯沒有把ssl給編譯進去,所以需要重新編譯,加上--with-http_ssl_module
2.1 編譯操作:
[root@AliKvn nginx-1.8.0]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module
[root@AliKvn nginx-1.8.0]# make && make install
2.2 -V檢查編譯參數
[root@AliKvn nginx-1.8.0]# /usr/local/nginx/sbin/nginx -V
2.3 再次檢查語法
[root@AliKvn nginx-1.8.0]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
3 重啓nginx
[root@AliKvn nginx-1.8.0]# /etc/init.d/nginx restart
Restarting nginx (via systemctl): [ OK ]
4 檢查listen端口
80和443端口都已經被listen
5 建立目錄和測試文件
[root@AliKvn aming.com]# mkdir /data/wwwroot/aming.com/
[root@AliKvn aming.com]# echo "ssl test" > /data/wwwroot/aming.com/index.html
[root@AliKvn aming.com]# ls
index.html
[root@AliKvn aming.com]# cat index.html
ssl test
6 在hosts寫入aming.com
[root@AliKvn aming.com]#vim /etc/hosts
127.0.0.1 aming.com
7 curl測試
證書被標記爲不可信用,因爲證書是自己創建的,不合法的。
8 在windows瀏覽器訪問(如果發現訪問不到,可以檢查防火牆,iptables規則,或者建立開通443端口規則)
在windows編輯hosts文件,添加aming.com進去
8.1 在瀏覽器輸入https://aming.com 進行訪問
8.2 因爲這是自己的測試,所以站點的信任性是透明的,繼續前往訪問,點擊 1 高級 2 繼續前往
8.3 訪問發現當初echo的頁面信息,正常訪問效果。
當然,這只是測試使用,利用https訪問時,證書是被標註未信任的。如果想利用https正常訪問,需要購買證書。