1. 程式人生 > >4-1-面試必備-nginx實現反向代理配置與實戰

4-1-面試必備-nginx實現反向代理配置與實戰

-a 如果能 緩存機制 否則 art 但是 發的 同步 地址

nginx服務有緩存機制,但是要看nginx做為什麽服務器來用,才啟用緩存,否則自己的壓力就非常大了(後端服務器壓力小),因為nginx最拿手的是維持連接,緩存可以使用其他服務。
nat服務工作在三層和四層,可以簡單理解為工作在四層。
註意:如果能工作在應用層就叫做代理,那麽這個服務器就能監聽一些端口但不是全部,---意思是服務器具有業務處理能力,一邊是客戶端(要理解客戶端發的內容),一邊是服務端(用自己的方式把內容傳過去),所以可以有自己的緩存了

上邊講的是正向代理和反向代理的原理,nginx是可以做反向代理的
lvs是四層的負載均衡器,nginx是七層的負載均衡器,原理跟lvs相似

那麽代理服務器和後端服務器:

後端服務器的網關不需要指向代理服務器,意思就是兩者之間可以跨路由,所以兩者之間可以是公網或私網地址,客戶端也有可能可以訪問後端服務器

CDN:內容分發網絡,本身也是代理服務器,帶有緩存功能,都是公網地址
nginx一般不作為http服務器,而是作為反代服務器
nginx作為反代服務器,httpd作為後端服務器
代理服務器完全可以有多個主機,靠server來定義,並且可以基於location把請求分發到不同的後端服務器上

下面開始演示nginx的反向代理功能:後端主機名稱叫做UPSS1192.168.10.11
ntpdate 172.16.0.1---同步下時間
修改網卡為vmnet1
ifconfig eno1677736 192.168.10.11/24 up

route -n查看路由條目,發現是沒有配置網關的
ping 192.168.10.254---在沒有網關的情況下,依然可以ping通,因為在同一個網絡中

後端服務器安裝http服務和mod_ssl模塊
yum install -y httpd mod_ssl
vim /var/www/html/index.html
<h1>Upstream Server1</h1>

systemctl start httpd.service
ss -tnl

tcpdump -i eno16777736 tcp port 80---可以看到是誰來訪問的後端虛擬主機,全是代理服務器發來的請求
代理服務器也會記錄訪問日誌的,但是為了提高代理性能,有可能關掉日誌,後端服務器可########以修改日誌的格式,查看真實的客戶端地址,1:13:32是為了證明下面課件的2選項

#代理服務器安裝nginx服務
代理服務器:172.16.0.6,192.168.10.254
ntpdata 172.16.0.1
yum clean all
yum repolist
yum install nginx
cd /etc/nginx
vim conf.d/ilinux.conf---編輯nginx的配置文件:
server {
listen 80;
server_name www.ilinux.io;
location / {---沒有root就沒法提供web服務,但是我們是反代服務器,不需要web功能
proxy_pass http://192.168.10.11:80;---可以是域名,可以是ip地址,後邊要不要跟斜線,如果沒有斜線,是把能匹配到的補到後邊,如果有斜線,是替換斜線
proxy_set_header X-Real-IP $remote_addr;---把客戶端真實地址添加到報文首部發給後端主機
add_header X-Via $server_addr;---把真實後端服務器地址發給客戶端
}
location ~* .(jpg|jpeg|png)$ {---這是另一臺後端服務器了UPSS2,使用了正則表達式匹配的話,url後邊不能加斜線
proxy_pass http://192.168.10.12:80;
}
}

nginx -t
systemctl start nginx.service
ss -tnl---查看有沒有80端口

代理服務器部署好nginx後,外部主機訪問172.16.0.6會訪問到nginx提供的默認主頁,因為我們做的是提供域名的虛擬主機(自己配置的),所以要訪問域名www.ilinux.io,並且在外部主機上做域名解析
vim /etc/hosts
172.16.0.6 www.ilinux.io---添加這樣一行
再來訪問www.ilinux.io就可以看到Upstream Server1了---說明反向代理成功了

註意:作為代理服務器來講,是可以有多個主機的,每一個主機靠一個server來定義,後端服務器也可能有多個主機,所以需要明確標識後端服務器的每個主機(基於IP、端口或域名)

UPSS2:需要安裝httpd
網絡類型設置為vmnet1
ifconfig eno16777736 192.168.10.12/24 up
vim /var/www/html/index.html
<h1>Upstream Server2</h1>
find /usr/share -iname "*.jpg" -exec cp {} var/www/html/ \;
systemctl start httpd---客戶端就可以訪問圖片資源了

yum info wireshark(需要在圖形環境中打開)---這一步不需要
vim /etc/httpd/conf/httpd.conf
修改為LogFormat "%{X-Real-IP}i %l %u %t \"%r" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
httpd -t---檢查語法錯誤
systemctl restart httpd.service
然後客戶端強制刷新一次,
tail /var/log/httpd/access_log---就可以看到記錄的日誌裏真實的IP地址

視頻中的課件:
ngx_http_proxy_module模塊:
1、proxy_pass URL:
Context:location,if in location,limit_except
註意:proxy_pass後面的路徑不帶url時,其會將location的url傳遞給後端主機;
server {
...
server_name HOSTNAME;
location /url/ {
proxy http://hos[:port];
}
...
}
http://HOSTNAME/url-->http://host/url

    proxy_pass後面的路徑是一個url時,其會將location的url替換為proxy_pass的url;
        server {
            ...
            server_name HOSTNAME;
            location /url/ {
                proxy http://host/new_url/;
            }
            ...
        }
        http://HOSTNAME/url-->http://host/new_url/
    如果location定義其url時使用了正則表達式的模式,或在if語句或limit_execept中使用proxy_pass指令,則proxy_pass之後必須不能使用url;用戶請求時傳遞的url將直接附加代理到的服務的之後;
        server {
            ...
            server_name HOSTNAME;
            location ~|~* /url/ {
                proxy http://host;
            }
            ...
        }
        http://HOSTNAME/url/-->http://host/url/;
2、proxy_set_header field value;
    設定發往後端主機的請求報文的請求首部的值;Context:http,server,location
    proxy_set_header X-Real-IP $remote_addr;---添加真實的請求IP地址到發往後端主機的請求報文中
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;---代理可以是多級的,追加而不是重設,上邊的增強版本
3、proxy_cache_path
    定義可用於proxy功能的緩存;Context:http
4、proxy_cache zone | off
    指明要調用的緩存,或關閉緩存機制;Context:http,server,location
5、proxy_cahe_key string;
    緩存中用於"鍵"的內容;
    默認值:proxy_cache_key $scheme$proxy_host$request_url;
6、proxy_cache_valid [code ...] time;
    定義對特定響應碼的響應內容的緩存時長;
    定義在http{...}中;
    proxy_cache_path /var/cache/nginx/proxy_cache levels=1:1:1 keys_zone=pxycache:20m max_size=1g;
    定義在需要調用緩存功能的配置段,例如server{...};
    proxy_cache pxycache;
    proxy_cache_key $request_url;
    proxy_cache_valid 200 302 301 1h;
    proxy_cache_valid any 1m;
7、proxy_cache_use_state
8、proxy_cache_methods GET|HEAD|POST...;
9、proxy_hide_header field;
10、proxy_connect_timeout time;
默認為60s;

ngx_http_headers_modules模塊:
向由代理服務器響應給客戶端的響應報文添加自定義首部,或修改指定首部的值;
1、add_header name value [always];
添加自定義首部;
add_header X-Via $server_addr;
add_header X-Accel $server_name;
2、expires [modified] time;
expires epoch | max|off;
用於定義Expire或Cache-Control首部的值;

4-1-面試必備-nginx實現反向代理配置與實戰