1、正向代理與反向代理
圖解:
在正向代理中,Proxy和Client同屬於一個LAN(圖中方框內),隱藏了客戶端信息;
在反向代理中,Proxy和Server同屬於一個LAN(圖中方框內),隱藏了服務端信息;
理解:
正向代理,就好比我們設置代理服務器一樣,我們要向服務器A請求資源,實際上我們是把請求拋給代理服務器,由代理服務器去請求服務器A的資源,也就是說,對客戶端而言,給他們的資源訪問提供了一個統一的出口,這樣服務器A就不知道是哪個客戶端的請求了
反向代理,相對服務端而言,為請求的訪問提供了一個統一的入口,也就是說客戶端只要向這個代理服務器發送請求,而代理服務器對這些請求轉發而目標服務器,這樣客戶端就不知道到底訪問的是哪個服務器了
正向代理和反向代理一個區別就是:正向代理明確的告訴代理服務器要訪問哪個地址,而反向代理則是只需要訪問到需要的資源就可以了,其它的不需要關注
2、項目場景
圖解:
正常一個項目在使用過程中,通常都是正向與反向一起使用的
3、Nginx安裝
CentOS:sudo yum install nginx
Ubuntu:sudo apt install nginx
也可以使用安裝包安裝:https://www.cnblogs.com/shanfeng1000/p/11063851.html
4、Nginx常用命令
nginx -s reload :修改配置后重新加載生效
nginx -s reopen :重新打開日志文件
nginx -t -c /path/to/nginx.conf 測試nginx配置文件是否正確
nginx -s stop :快速停止nginx
nginx -s quit :完整有序的停止nginx
具體的命令可以通過:nginx -h 查看
5、Nginx配置詳解
參考博客:https://www.cnblogs.com/bluestorm/p/4574688.html
Nginx配置文件主要分成四部分:main(全局設置)、server(主機設置)、upstream(上游服務器設置,主要為反向代理、負載均衡相關配置)和 location(URL匹配特定位置后的設置),每部分包含若干個指令。
main部分設置的指令將影響其它所有部分的設置;
server部分的指令主要用於指定虛擬主機域名、IP和端口;
upstream的指令用於設置一系列的后端服務器,設置反向代理及后端服務器的負載均衡;
location部分用於匹配網頁位置(比如,根目錄“/”,“/images”,等等)。他們之間的關系式:server繼承main,location繼承server;upstream既不會繼承指令也不會被繼承。它有自己的特殊指令,不需要在其他地方的應用。
首先,輸入nginx -h 可以nginx命令,另外,可以看到nginx的配置文件的路徑:
打開這個conf文件(vim /etc/nginx/nginx.conf),
Nginx啟動會讀取這個配置文件,當然,我們如果在啟動時使用-c參數指定,那就是讀取指定的配置文件了,最外圍就是main配置,也就是全局配置,比如上面的worker_processes auto就是worker進程數的配置,http就是http服務器的配置,比如是否使用keepalive啊,是否使用gzip進行壓縮等都是這個節點配置,而且這個也是我們常用的配置,我們配置server節點等等都是配置在這個里面,但是我們一般不會在nginx.conf中配置server節點,因為http節點可以使用include指令,server節點都被配置在其它文件中,如圖:
也就是說,/etc/nginx/conf.d目錄下的所有以.conf結尾的文件,/etc/nginx/sites-enabled下的所有文件都被視為http節點的配置文件,所以我們可以再這兩個文件中配置server節點,可以打開這個目錄下面的內容,打開其中的默認文件查看server節點和location節點的配置,其中很多配置應該都是一看就明白的
Server配置詳解:
上面說到/etc/nginx/conf.d目錄下的所有.conf文件都會被認為是http節點的配置,那么我們可以在/etc/nginx/conf.d中創建一個example.conf,然后打開輸入:
server {
listen 88; #監聽主機的88端口,如果端口小於1024可能涉及權限問題
listen [::]:88; #監聽主機的88端口
server_name example; #當前服務器的名稱
root /var/www/example; #當前服務器的根路徑
index index.html index.htm index.nginx-debian.html; #起始頁
location / { #路由配置規則,匹配上就使用里面的配置
root /var/www/example; #根路徑
index index.html index.htm index.nginx-debian.html; #起始頁
}
location = /test { #路由配置規則,匹配上就使用里面的配置
root /var/www/example/test; #根路徑
index index.html index.htm index.nginx-debian.html; #起始頁
}
}
上面的配置是說(當前主機IP:192.168.182.134),監聽主機的88端口,當訪問請求時http://192.168.182.134:88/時,使用/var/www/example做根路徑,當請求是http://192.168.182.134:88/test時使用/var/www/example/test做更路徑,所以我們分別創建/var/www/example和/var/www/example/test兩個目錄,在里面創建一個index.html文件,內容分別是:
/var/www/example/index.html
/var/www/example/test/index.html
然后可以啟動nginx,然后測試一下了
先測試配置是否有問題:sudo nginx -t
如果提示:
nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)
則是權限不夠,干脆將nginx目錄的所有人改一下:sudo chown -R feng:feng /etc/nginx
測試沒問題后就可以啟動了:sudo nginx
然后就可以在瀏覽器輸入地址訪問了:
http://192.168.182.134:88/index.html
http://192.168.182.134:88/test/index.html
負載均衡配置:
在/etc/nginx/conf.d目錄下新建一個balance.conf,輸入一下內容:
upstream balance_test {
server 172.16.3.212; #我本地的IP地址
server 172.16.201.27; #27預生產環境
ip_hash; #使用負載均衡的IP哈希規則
}
server {
listen 89; #監聽主機的89端口,如果端口小於1024可能涉及權限問題
listen [::]:89; #監聽主機的89端口
server_name balance; #當前服務器的名稱
root /var/www/balance; #當前服務器的根路徑
index index.html index.htm index.nginx-debian.html; #起始頁
location /Tfs.Loan.Web { #虛擬路徑是這個的時候,為貸后
proxy_pass http://balance_test; #這里的balance_test就是指上面的upstream中的一個,到底取哪個就看情況了,下面是代理服務器的配置
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache_bypass $http_upgrade;
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
#try_files $uri $uri/ =404;
}
location ~ .*\.(js|css|svg|ico|png)$ { #靜態文件
proxy_pass http://balance_test; #這里的balance_test就是指上面的upstream中的一個,到底取哪個就看情況了
}
}
然后按照上面啟動nginx的方式啟動就可以了,如果之前以啟動,那么只需要使用以下命令重新加載配置就可以了:sudo nginx -s reload
打開瀏覽器訪問:http://192.168.182.134:89/Tfs.Loan.Web
Location配置詳解:
語法規則: location [=|~|~*|^~] /uri/ { … }
= 開頭表示精確匹配
^~ 開頭表示uri以某個常規字符串開頭,理解為匹配 url路徑即可。nginx不對url做編碼,因此請求為/static/20%/aa,可以被規則^~ /static/ /aa匹配到(注意是空格)。
~ 開頭表示區分大小寫的正則匹配
~* 開頭表示不區分大小寫的正則匹配
!~和!~*分別為區分大小寫不匹配及不區分大小寫不匹配 的正則
/ 通用匹配,任何請求都會匹配到。
多個location配置的情況下匹配順序為(參考資料而來,還未實際驗證,試試就知道了,不必拘泥,僅供參考):
首先匹配 =,其次匹配^~, 其次是按文件中順序的正則匹配,最后是交給 / 通用匹配。當有匹配成功時候,停止匹配,按當前匹配規則處理請求。
附:
一個很常見的錯誤:
當執行nginx -s stop后,在執行nginx -s reload或者nginx -s reopen ,會提示nginx.pid文件找不到:
這個nginx是因為nginx的主進程被關閉了,只需要重啟主進程就可以了,執行:sudo nginx