nginx反向代理,nginx負載均衡,配置nginx的ssl

nginx反向代理

  • 機器 b 跟 c 在同一個機房
  • b 有外網,而 c 沒有外網
  • b 跟 c 在同一個局域網內
  • 另一臺機器 a 若是想訪問沒有外網的 c 的數據
  • 只能經過有外網的 b 代理訪問
  • 也就是 b 訪問 c
  • 獲得須要的數據後再返回給 a
  • 可是 a 並不知道 b 訪問了 c
  • a 只是訪問了 b
  • 而後由 b 自動選擇應該訪問的路線
  • 正向代理跟反向代理的區別
  • a 能夠控制 b 的訪問路線,指定 b 訪問某個服務器
  • 這就是正向代理
  • a 不能夠控制 b 的訪問路線,只能向 b 提出請求
  • b 本身選擇訪問路線,完成 a 的請求
  • 這就是反向代理

  • 使用反向代理的場景有
  • 1.訪問不帶公網的內網機器
  • 2.解決兩臺機器之間通訊有障礙的問題
  • 首先作一個實驗
  • 如圖,tom02編輯虛擬機設置,增長一塊網卡
  • 如圖,新增的網卡選擇主機模式
  • 而後打開虛擬機
  • 新增了網卡,須要配置一下ip地址
  • 如圖,ifconfig 查看網卡信息
  • ens37就是新增的網卡,能夠看到,已經分配了ip
  • ls /etc/sysconfig/network-scripts/
  • 查看網卡配置文件
  • 如圖,配置文件裏面並無 ens37 的網卡配置文件
  • 如今 ens37 的ip 是自動分配的動態ip
  • 要使用靜態ip就須要在這裏編輯一個 ens37的配置文件
  • ctrl+a 光標到命令行最左邊
  • ctrl+e 光標到命令行最右邊
  • cd /etc/sysconfig/network-scripts/ 進入網卡配置文件目錄
  • cp ifcfg-ens33 ifcfg-ens37
  • 把ens33配置文件複製一份並命名爲ens37
  • 這樣就新建了 ens37的配置文件了
  • 而後 vi ifcfg-ens37 編輯內容
  • 如圖,把 name device 修改成 ens37
  • ip 地址修改成 192.168.100.100
  • 而後把 dns 和 gateway 兩行刪除
  • 若是有多個網卡配置文件
  • 只須要其中一個配置了 dns 和 gateway
  • 其它網卡配置文件就不須要這兩行配置了
  • ens33已經有了,因此ens37這兩行就刪除
  • 保存退出
  • systemctl restart network 重啓網絡
  • 如圖,能夠看到ens37的ip已經修改成 192.168.100.100
  • 從windows ping 192.168.100.100 發現ping不通
  • 查看虛擬網絡編輯器,發現vmware分配的網段是 192.168.174.0
  • 如圖,從新修改ip爲 192.168.174.100
  • 重啓網絡,如今就能夠 ping通了
  • 這個ip 必須設置爲 vmware分配的網段內的ip地址

  • 如圖,在虛擬機 tom01 上面
  • 使用命令 scp /etc/yum.repos.d/nginx.repo 192.168.64.130:/etc/yum.repos.d/
  • 這樣就把tom01虛擬機上面的 nginx.repo 文件
  • 複製到 tom02虛擬機的 /etc/yum.repos.d/ 目錄下了
  • 192.168.64.130是tom02 ens33網卡的ip地址
  • 而後在 tom02 上面安裝 nginx
  • 使用 yum install -y nginx 在tom02虛擬機安裝nginx
  • cd /etc/nginx/conf.d/ 安裝完成就進入配置文件目錄
  • 目前只有一個默認虛擬主機配置文件
  • vi default.conf 編輯文件
  • 如圖,添加 deny all; 這一行代碼
  • 這樣就把默認虛擬主機禁掉了
  • 這樣默認虛擬主機就不能被訪問到了
  • 咱們的目標是經過 tom02機器訪問tom01的論壇網站
  • 這裏在tom02 conf.d目錄下面編輯 tom.bbs.conf 虛擬主機配置文件
server{

    listen 80;
    server_name tom.bbs.com;

        location / {
            proxy_pass http://192.168.64.128;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

}
  • 空白的配置文件內寫入以上代碼
  • 代碼意思是監聽 80 端口
  • 虛擬主機名稱是 tom.bbs.com
  • location 裏面的代碼是代理的意思
  • 也就是訪問這個虛擬主機
  • 這個虛擬主機會把訪問請求轉發到真正的目標服務器上去
  • 這個虛擬主機就是一個反向代理的服務器
  • 第一行 http://192.168.64.128 就是轉發的地址
  • 192.168.64.128就是真正要訪問的服務器的ip地址
  • http:// 表示使用 http協議
  • 下面三行是 header 信息
  • 若是不設置下面三行,目標服務器的訪問日誌
  • 就沒辦法記錄下真正的訪問信息
  • 下面三行表明 主機名稱,真實ip,轉發ip
  • 轉發ip就是代理虛擬主機的 ip
  • 真實 ip 就是真正發出請求的主機的 ip
  • host 就是使用的域名,在配置文件裏面定義的server_name
  • 這樣目標主機的訪問日誌裏面就會記錄
  • 代理主機訪問的域名,ip,還有真正發送請求的主機的 ip 等信息
  • 設置好虛擬主機配置文件,如今要啓動nginx服務
  • 使用 systemctl start nginx 發現啓動不了
  • 直接使用啓動文件 /usr/sbin/nginx 啓動
  • ps aux | grep nginx 查看服務發現啓動成功
  • 而後使用 systemctl restart nginx 重啓服務,又發生錯誤
  • pkill nginx 殺死全部nignx 進程
  • 再使用 systemctl start nginx 啓動服務,正常啓動
  • 再使用 systemctl restart nginx 重啓服務,沒有錯誤
  • 如今nginx 服務正常了
  • 使用 nginx -t && nginx -s reload 檢測重載配置文件
  • 由於要使用瀏覽器訪問網站,因此要在windows的host文件裏面添加信息
  • 把 192.168.174.100 跟 tom.bbs.com 域名綁定
  • 這樣訪問這個域名就會解析到 192.168.174.100 的ip地址
  • 由於 tom02 的 nginx 虛擬主機監聽的是 80 端口
  • 因此還須要讓防火牆放行 80 端口,外部訪問才能夠經過 80 端口
  • 如圖,開放80端口顯示 firewalld 服務沒有啓動
  • 啓動防火牆服務
  • 而後在開放 80 端口,返回修改爲功信息
  • 如圖,修改以後,防火牆須要重載一下
  • 使用 firewall-cmd --reload 重載
  • 下面 iptable -nvL | grep 80 能夠查看開放的端口
  • 能夠看到有 80 端口,說明這個端口已經開放了
  • 如圖,訪問 tom.bbs.com 網站,成功訪問
  • 由於 host 文件裏面並無 把 tom.bbs.com 跟 192.168.64.128 綁定
  • 這個網站其實是在 192.168.64.128 的服務器上面的
  • 可是如今成功訪問到了
  • 說明剛纔的代理訪問設置成功了
  • 使用場景就是,有幾臺機器沒有外網,只有其中一臺機器有外網
  • 這幾臺機器互相之間有局域網連通
  • 那麼想要訪問沒有外網的機器,就須要經過其中有外網的那一臺機器
  • 來訪問其它沒有外網的機器
  • 這時候就能夠按照上面的操做,在有外網的機器上面配置反向代理虛擬主機
  • 這樣外面的機器就能夠經過這個反向代理主機來訪問其它沒有外網的機器了

nginx負載均衡

  • 負載均衡也是一種反向代理
  • 若是須要反向代理多臺機器的時候
  • 就會用到 nginx的負載均衡功能
  • 負載均衡就是把請求均衡的分發到後端的多臺機器上去
  • 舉例說明
  • 有 a,b,c,d 四臺服務器
  • 這四臺服務器上的數據是同樣的
  • 外面有一個客戶端想訪問這四臺服務器上面的內容
  • 可是這四臺服務器是沒有外網的
  • 這就須要一臺有外網的反向代理服務器 f
  • 外面的客戶端訪問代理服務器 f
  • f 會把接受的請求均衡的發送到這四臺服務器上去
  • 若是有不少的請求同時訪問 f
  • f 就能夠把這些大量的請求均衡的發給這四臺服務器
  • 這樣就能夠抗住大量訪問對於服務器的壓力了

  • 要實現這樣的效果,須要在反向代理服務器裏面的nginx裏面配置
  • 假設 tom01 服務器就是反向代理服務器
  • 首先 cd /etc/nginx/conf.d/ 進入nginx配置文件目錄
  • vi apelearn.com.conf 編輯一個空的配置文件
upstream apelearn {
	ip_hash;
	server 115.159.51.96:80 weight=100;
	server 47.104.7.242:80 weight=10;
}

server {
	listen 80;
	server_name www.apelearn.com;
	location / {
		proxy_pass http://apelearn;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	}
}
  • 如圖,而後保存退出
  • 使用 nginx -t 檢測配置文件語法錯誤
  • 使用 nginx -s reload 重載發生錯誤,跟 pID 有關
  • 這是由於nginx裏面有多個配置文件的時候
  • 機器重啓以後不知道應該加載哪一個配置文件
  • 因此須要指定加載的配置文件,才能夠啓動nginx
  • 使用 nginx -c /etc/nginx/nginx.conf
  • 這樣就指定了加載 nginx.conf 配置文件
  • 成功啓動 nginx 服務
  • 再使用 nginx -s reload 重載配置文件
  • 如圖,要從瀏覽器訪問代理服務器,須要在host綁定 ip 域名
  • 這裏 192.168.64.128 是代理服務器的 ip
  • 後面的域名是要訪問的網站的域名
  • 這樣訪問這個域名就會解析到代理服務器的 ip
  • 而後代理服務器就會把訪問請求轉發到真正對應這個域名的網站服務器去
  • 若是反向代理成功
  • 咱們就能夠從瀏覽器看到這個域名對應的網站內容
  • 如圖,訪問這個域名,成功轉到對應的網站了,說明負載均衡設置成功了
  • 如圖,負載均衡配置文件裏面的代碼
  • 主要分爲兩個部分
  • 一個是 upstream 另外一個是 server
  • server 就是虛擬主機
  • upstream 就是反向代理的服務器組
  • 訪問 www.apelearn.com 虛擬主機
  • 根據server內的代碼,訪問請求會被代理到 http://apelearn
  • apelearn 是一個名稱,表明一個 upstream
  • 這個 upstream 在 server 上面定義了內容
  • ip_hash 的做用是,若是一個 ip 訪問了 a 服務器
  • 這個 ip 繼續訪問代理服務器的時候
  • 代理服務器只會把這個 ip的請求發送給 a 服務器,而不是別的服務器
  • 由於假設 這個ip 在 a 服務器上面登陸了用戶名密碼
  • 若是代理服務器把 這個ip 後續的請求發送到別的服務器
  • 可是 這個ip 在別的服務器上面並無登陸用戶名密碼
  • 這顯然就會發生錯誤
  • 爲了不這樣的錯誤發生,代碼加入 ip_hash
  • 就可讓 某個ip 若是訪問到 某個服務器
  • 這個ip 後續的請求就只會發送到 這個服務器上去
  • 下面的 server 115.159.51.96:80
  • 就是被反向代理的服務器的 ip和端口號
  • 如圖,這裏寫了兩個服務器的 ip和端口
  • 若是有更多服務器要作負載均衡
  • 能夠在下面繼續添加別的 server 的 ip和端口
  • 訪問代理服務器的請求會被均衡的發送給這兩個server的其中一個
  • weight=100 表示權重,也就是優先級
  • weight 最大值爲 100 最小值爲 0
  • 好比這裏,第一個server設置了 weight=100
  • 說明權重最大,那麼代理服務器的全部請求就會優先發給第一個server
  • 若是第一個server處理不過來了,纔會發給第二個 server
  • 利用 weight 就能夠設置不一樣服務器之間的優先級

配置nginx的SSL

  • nginx訪問網站用的是 http 協議
  • 可是 http協議不夠安全
  • 有可能會被抓包從而獲取用戶信息
  • 因此須要一個更安全的協議,就是 https 協議
  • https 協議對於數據包會有更安全的加密措施
  • 防止別人從數據包拿到用戶信息
  • 要實現 nginx 使用 https 訪問
  • 就須要配置 SSL
  • http 默認使用的是 80 端口
  • https 默認使用的是 443端口
  • 目前使用的 http 版本是 http 1.1 版本
  • 新版本的http是 http 2 版本
  • http 2 默認使用的就是 https 協議
  • 要配置 https 協議
  • 首先作個試驗,把論壇網站配置 https 協議鏈接
  • cd /etc/nginx/conf.d
  • vi tom.bbs.conf 編輯配置文件
  • 如圖,要修改的地方主要是圖中的幾處
  • listen 原本是監聽 80 端口的
  • 由於 https 協議默認端口是 443 因此這裏改爲 443 端口
  • 後面加上 ssl 表示使用 ssl 證書
  • https 對比 http 的主要區別就是能夠對傳輸的數據進行加密
  • 之因此可以進行加密是由於使用了 ssl 證書
  • ssl證書是由權威的機構頒發的,因此具備公信力
  • 權威機構跟大部分瀏覽器的廠商進行了合做
  • 這些瀏覽器的廠商都信任頒發證書的權威機構
  • 因此權威機構頒發的證書就是有效的,可信任的
  • ssl 證書的本質就是一對 公鑰與私鑰
  • 瀏覽器訪問服務器,會使用這對公鑰與私鑰
  • 還有加密算法對通訊進行加密
  • 因此要使服務器跟瀏覽器之間進行 https 協議的鏈接
  • 須要先在權威機構申請 ssl 證書,得到公鑰私鑰
  • 纔可以配置服務器使用 ssl 證書,這樣就可使用 https 通訊了
  • 上圖中,tomyue.ltd 是在 dnspod 上面購買的一個域名
  • 由於申請ssl證書是須要使用真實域名的
  • 因此須要先在 dnspod 上購買一個真實的域名
  • 才能夠用這個域名來申請 ssl 證書
  • 由於是用 tomyue.ltd 域名申請的證書
  • 因此虛擬服務器配置 ssl 證書就必須使用
  • 申請證書時用到的 域名
  • 因此這裏服務器域名使用 tomyue.ltd
ssl_certificate /etc/nginx/ssl/tom.ltd.crt;
ssl_certificate_key /etc/nginx/ssl/tom.ltd.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  • 第一行代碼是指定使用的 ssl證書公鑰
  • 第二行代碼是指定使用的 ssl證書私鑰
  • 第三行代碼是指定使用的 ssl協議的版本號
  • 如圖,這是一個申請免費 ssl 證書的網站
  • freessl.org 能夠百度找到這個網站
  • ssl 證書有免費有收費的,這裏能夠申請免費1年的證書
  • 在下面方框輸入購買到的真實域名,點擊建立證書
  • 這裏須要驗證域名是不是真實域名
  • 由於只有真實域名,機構纔會頒發證書,因此須要驗證一下
  • 下面 證書類型就選 rsa
  • 驗證類型就選 dns
  • csr生成就選 瀏覽器生成,或者離線生成也能夠
  • 離線生成就須要下載 keymanager 這個軟件
  • 才能夠保存離線生成的密鑰對
  • 瀏覽器生成就能夠才瀏覽器直接顯示密鑰對
  • 如圖,下面有這些驗證信息,須要到註冊真實域名的網站上去添加記錄
  • 而後再回來驗證,驗證成功纔會頒發證書
  • 好比說個人域名是在 dnspod 買的
  • 就到 dnspod 上面去添加記錄
  • 如圖,登陸 dnspod 管理本身的域名
  • 點擊域名
  • 如圖,添加一條記錄
  • 主機記錄就是 _dnsauth
  • 類型就是 txt
  • 記錄值就是 剛纔 freessl 那裏寫的記錄值
  • 就是上圖中的記錄值,複製粘貼到域名記錄值這裏
  • 而後保存記錄
  • 再回到 freessl 網站
  • 點擊 點擊驗證 按鈕
  • 等待驗證完成
  • 如圖,驗證完成就會出現這三段信息
  • 這個就是 ssl 證書
  • ca 證書是 根證書,通常不使用
  • 第二段證書是 公鑰
  • 第三段證書是 私鑰
  • 這三段密鑰都複製粘貼保存到 linux 服務器裏面去
  • 首先 cd /etc/nginx/ 進入 nginx 目錄
  • 而後 mkdir ssl 建立 ssl 目錄
  • cd ssl 進入 ssl 目錄
  • vi ca 編輯一個叫作 ca 的空文件
  • 而後把 ca 密鑰複製粘貼到這裏,而後保存退出
  • 如圖,按照上面的流程
  • 分別把 公鑰複製粘貼到 tom.ltd.crt文件內,保存退出
  • 把 私鑰複製粘貼到 tom.ltd.key 文件內,保存退出
  • 這樣就服務器內就擁有了 公鑰 和 私鑰 文件了
  • 保存好這三個密鑰文件後,freessl 網站就能夠關閉了
  • 如圖,配置文件裏面,指定的公鑰和私鑰的文件地址就是剛纔建立的文件的地址
  • 而後 nginx -t && nginx -s reload
  • 由於修改了監聽端口,因此須要重啓一下 nginx 服務
  • systemctl restart nginx
  • 使用 netstat -lntp 查看端口
  • 能夠看到 443 端口已經監聽了
  • 可是還有一個問題,就是防火牆尚未放行 443 端口
  • 這樣的話外面仍是不能訪問 443 端口
  • 因此還須要讓防火牆放行 443 端口才行
  • firewall-cmd --add-port=443/tcp --permanent
  • 使用以上命名放行 443 端口
  • firewall-cmd --reload 重載防火牆配置
  • 這樣剛纔的設置才生效
  • 由於尚未在域名配置真實服務器的ip地址
  • 域名指向服務器網站是須要備案的
  • 如今只是進行 ssl 配置的測試
  • 因此不使用 域名 指向服務器的網站
  • 直接到windows 的 host 文件進行修改
  • 把 tomyue.ltd 域名 和 192.168.64.128 ip 進行綁定
  • 而後打開瀏覽器訪問 tomyue.ltd
  • 如圖,成功訪問網站
  • 鏈接的協議也是 https
  • 這樣表示 ssl 設置是成功的
  • 除了使用瀏覽器測試
  • 如圖,也可使用 curl 來測試 https 是否能夠訪問網站
相關文章
相關標籤/搜索