nginx 小功能

跨域問題

問題:瀏覽器拒絕執行其他域名下的 ajax 請求

由來:如果瀏覽器可以在某域名下訪問其他域名的內容 來填充自己的頁面,那麼互聯網秩序將混亂。爲了防止這種混亂,W3C 組織制定了瀏覽器安全規範,即 html 頁面發起的 ajax 請求僅 限於同域名後段範圍,跨域 域名的 ajax 請求不得執行,此謂之 跨域問題。

解決方法:

Jsonp

w3c 指定的規則不允許ajax跨域請求,但是允許 script 標籤發起跨域請求。

所以,可以通過 擴展 script標籤 src 源的方法 來跨域,這就是 Jsnop 解決方法。

不足:

  • jsonp 只能解決Get類的請求
  • 使用此方法,對應的後臺程序必須對結果進行改造。將返回值做一個函數式包裝。這對業務有較大侵入性,增加開發人員負擔。

cors 方案

如果B公司同意將自己的內容分享給A公司,跨域限制可以放開,此即 CORS 解決方案

nginx 配置跨域操作

  • 對於比較簡單的http請求(GET,POST,HEAD類型),無需瀏覽器來問,nginx 服務器直接在響應頭部,加入同意跨域的信號即可。
add_header Access-Control-Allow-Origin http://xxx.xxx.com;

防盜鏈

目標:讓資源只能在自己的頁面顯示,不能被其他頁面引用

解決辦法:

瀏覽器發起的任何請求,在請求頭中,都會標註請求發起的URL,如下:

Refer: http://xxx.xxx.xxx.com

因此,在nginx 服務器上,只要校驗此發起地 URL,就可以對應的拒絕響應它

location /mall {
    valid_referers *.test.com;
    if ($invalid_referer) {
        
        return 404;
    }
    root /etc/nginx/html/gzip;
}

壓縮

我們都知道,服務器的帶寬資源很昂貴,對於一些靜態資源,如果能壓縮一下再傳輸,通常可以減少50%的體積。

瀏覽器在發送請求時,會附帶自己支持的壓縮方式,在請求頭中:

Accept-Encoding:gzip,deflate

在nginx 服務器中,配置:

location ~ /(.*)\.(html|js|css|jsg|jpeg|png|gig)$ {
    gzip on; #啓用gzip 壓縮,默認是off,不啓用
    # 對js,css,jpg,png,gif格式對文件啓用gzip 壓縮功能
    gzip_type application/javascript text/css image/jpeg image/png image/gif;
    gzip_min_length 1024; # 所壓縮文件對最小值,小於這個之不會壓縮
    gzip_buffer 4 1k; # 設置壓縮響應塊的個數和大小,默認是內存一個頁的大小
    gzip_comp_level 1; # 壓縮水平,默認1.取值範圍1-9,取值越大壓縮比率越大,單耗cpu時間

    root /html/gzip;
}

https

採用加密方式:非對稱加密 和 對稱加密

對稱加密

服務器和客戶端的加密密鑰是相同的。加密效率高於非對稱加密

存在問題:密鑰傳輸的過程,泄露風險較大

非對稱加密

加密安全。服務器和客戶端是兩個不同的密鑰。

問題:非對稱加密算法開銷大,大批量應用於業務,會導致性能成本太高

https 加密方案

1、業務數據的加密使用對稱加密,降低性能消耗

2、對稱加密需要的密鑰,通過非對稱加密的方式 傳輸

具體步驟:

1、客戶端和服務器建立連接

2、服務器下發證書到客戶端,證書中保護非對稱加密的公鑰

3、客戶端生成對稱加密所需要的加密密鑰

4、客戶端使用證書中的公鑰加密 對稱加密密鑰,生成密文

5、客戶端將密鑰發送給服務器

6、服務器使用私鑰解密祕聞,得到對稱加密所需密鑰

7、客戶端使用密鑰加密要傳輸的內容,發送服務器

8、服務器使用密鑰解密密文,得到傳輸的內容

nginx 配置 https

查看nginx 安裝了https 模塊 (openresty 默認開啓 https 模塊的):nginx -V

nginx 配置 https 只需要兩個東西:

  • 瀏覽器證書(內含公鑰,供瀏覽器加密使用)
  • 私鑰

server.crt 和 server.key 可以自己去購買商業的。也可以使用自己生成的(瀏覽器會任務是不安全證書)。

自簽證書

前提是已經安裝了 openssl 程序,自簽證書過程:

生成私鑰:openssl genrsa -des3 -out server.key 4096 需要輸入密碼

生成csr:   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 -day 365 -in server.csr -signkey server.key -out server.crt

nginx 配置:

server {
    listen 443 ssl;
    server_name xxx.com;
    
    ssl_certificate /etc/nginx/server.crt; #供瀏覽器下載證書
    ssl_certificate_key  /etc/nginx/server.key; #自己解密用的私鑰

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

nginx 的高可用

傳統的高可用思路:

tomcat的高可用,在tomcat 的集羣前面加一層 負載服務 nginx。

這樣可以解決tomcat的高可用問題。但是引起了 負載服務 nginx 的高可用問題。如果前面的 nginx 服務掛掉,服務就崩潰了。

如果nginx 也沿用此思路,總會有一個最前端的集羣是單機的,存在 宕機的風險。

lvs 思想解決高可用問題

使用服務器集羣虛擬出一個 虛擬網管,因爲是虛擬的,不存在的,所以不存在 宕機的問題。

此網關由兩臺機器 共同協商生成。當一臺機器宕機了,另一臺集羣一樣能維持這個網關。這保證了兩臺機器只要不同時宕機,

就能保證服務正常。

keepalived 配置lvs過程

前提:

1、關閉 selinux, 打開/etc/sysconfig/selinux, 設置 SELINUX=disabled

2、安裝必須的依賴包

yum -y install libnl libnl-dev libnfnetlink-devel

3、keepalived 安裝

下載源碼包--不能使用 yum 方式安裝(有bug)

wget https://www.keepalived.org/software/keepalived-1.3.4.tar.gz

配置(指定安裝目錄和配置文件)

./configure --prefix=/usr/local/keepalived --sysconf=/etc

make && make install

keepalived 主機配置

打開/etc/keepalived/keepalived.conf, 配置如下內容:

啓動keepalived, 查看機器ip,可以發現多了一個 244.200 的ip。使用原ip地址和新生成的ip地址都可以訪問服務。

keepalived 從機配置

配置過程與主機過程一致,只需要修改 標識id 和 優先級即可。

注意:優先級要小於主機配置的優先級,並且組名要保持一致。

啓動從機,發現ip並無變化。

keepalived 校驗LVS效果

  • 殺死主機的keepalived,244.200的ip從主機消失,出現在從機ip中
  • 再次啓動主機的keepalived,244.200 的ip被主機重新奪回

注意:此效果是單主單備方式。備機資源有一定的浪費。可以重複前面的動作,虛擬出第二個ip,將主從機優先級顛倒,從而利用起備機服務。

keepalived 監控服務軟件

使用keepalived 我們實現了LVS功能,即集羣間共同虛擬一個 vip(virtual ip),並實現了在集羣中的自動漂移。

如果物理機器狀況良好,並不能保障 其上允許的軟件服務 ok,因爲需要使用 keepalived 來監控服務。

1、使用 keepalived 來監控 nginx 

編寫shell 腳本:

#! /bin/bash
# 統計nginx 進程是否存在
A=`ps -C nginx --no-header|wc -l`
# 爲0 表示nginx 停止來
if [$A -eq 0];then
    # 嘗試重啓nginx
    /usr/local/nginx/sbin/nginx
    # nginx 重啓失敗,則keepalived自殺,進行vip轉移
    if [`ps -C nginx --no-header|wc -l` -eq 0]; then
        # 殺死keepalived,vip轉移到另一臺機器
        killall keepalived
    fi
fi

2、在配置文件中加入配置信息

重啓keepalived, 測試效果,發現 nginx 已變成不死鳥

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章