今天給大家分享一下,修真院官網JAVA任務三的一個知識點:nginx服務器有什么作用?什么叫反向代理?為什么要使用反向代理?
1 背景介紹
1.1 Nginx是什么?
Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器。其特點是占有內存少,並發能力強,事實上nginx的並發能力確實在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。
2 知識剖析
2.1 nginx服務器有什么作用?
1、反向代理
2、負載均衡
3、動靜分離
2.2 什么叫反向代理?
反向代理:反向代理(ReverseProxy)是指以代理服務器來接受internet上的連接請求,然后將請求轉發給內部網絡上的服務器,並將從服務器上得到的結果返回給internet上請求連接的客戶端,簡單來說就是真實的服務器不能直接被外部網絡訪問,想要訪問必須通過代理。
2.3 為什么要使用反向代理
1、防止主服務器被惡意攻擊
2、為負載均衡和動靜分離提供實現支持
2.4 什么是負載均衡?負載均衡的作用是什么?
負載均衡就是將任務分攤到多個操作單元上進行執行。對於Nginx而言,就是將收到的訪問請求分發給不同的Web服務器,以提高訪問性能以及可靠性。負載均衡可以有效防止一個服務器宕機而導致服務停止。
當一台服務器的單位時間內的訪問量越大時,服務器壓力就越大,大到超過自身承受能力時,服務器就會崩潰。為了避免服務器崩潰,讓用戶有更好的體驗,我們通過負載均衡的方式來分擔服務器壓力。我們可以建立很多很多服務器,組成一個服務器集群,當用戶訪問網站時,先訪問一個中間服務器,在讓這個中間服務器在服務器集群中選擇一個壓力較小的服務器,然后將該訪問請求引入該服務器。如此一來,用戶的每次訪問,都會保證服務器集群中的每個服務器壓力趨於平衡,分擔了服務器壓力,避免了服務器崩潰的情況。
配置負載均衡:
http://nginx.org/en/docs/http/load_balancing.html
2.5 什么是動靜分離?動靜分離的作用?
動靜分離:運用Nginx的反向代理功能分發請求:所有動態資源的請求交給應用服務器,而靜態資源的請求(例如圖片、視頻、CSS、JavaScript文件等)則直接由Nginx返回到瀏覽器
動靜分離的作用:主要是nginx處理靜態頁面的效率遠高於tomcat的處理能力,使用c語言開發的nginx對靜態資源每秒的吞吐量是使用Java語言開發的tomcat的6倍,也遠高於其它應用服務器
3 常見問題
3.1 如何配置反向代理
通過配置實現
nginx的主配置文件名叫
nginx.config
它在nginx的安裝目錄下的config目錄下面
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } #http塊主要有三個作用域, http server location http { #可以嵌套多個server ,配置代理,緩存,日志,等絕大多數功能,和第三方模塊配置 include mime.types; #文件擴展名和文件類型映射表 default_type application/octet-stream; # 默認文件類型 #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; # 開啟高效文件傳輸模式,這個指令,指定了nginx是否調用sendfile函數傳輸文件,對於普通的應用設為on ,如果用來進行下載等IO重負載應用可設為off sendfile on; #tcp_nopush on; #防止網絡阻塞 #keepalive_timeout 0; keepalive_timeout 65; # 長連接超時時常,單位秒 #gzip on; # 負載均衡 # upstream XXX.com{ # upstream負載均衡塊, weight表示權重, 值越大,被分配到的幾率就越大 # server 192.168.80.121:80 weight=3; # server 192.168.80.121:80 weight=3; # server 192.168.80.121:80 weight=3; #} #server配置虛擬主機的相關參數 server { listen 80; # 監聽端口 server_name localhost; # 監聽地址,可以采用域名加多個空格隔開,如果匹配不到我們在瀏覽器輸入的域名.默認走 localhost, 然后location到nginx的歡迎頁 #charset koi8-r; # 本虛擬機的訪問日志 #access_log logs/host.access.log main; # location 配置請求的路由,和各種頁面的處理情況 location / { root html; index index.html index.htm; # 默認頁面 } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} }
我們要實現反向代理就是要
- 新增我們自己的server
server { listen 80; server_name 瀏覽器可能訪問的域名1; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; location / { proxy_pass http://127.0.0.1:9001; # 轉發路徑 proxy_connect_timeout 600; proxy_read_timeout 600; } } server { listen 80; server_name 瀏覽器可能訪問的域名2; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; location / { proxy_pass http://127.0.0.1:10011; # 轉發路徑 proxy_connect_timeout 600; proxy_read_timeout 600; } }
nginx 通過監聽80端口 進而監聽我們修改后的域名,成功匹配后呢,通過location轉發到我們自定義的路徑
4 解決方案
4.1 在Nginx的conf文件中進行配置,具體見編碼實戰
6 擴展思考
6.1 什么是正向代理
正向代理:是一個位於客戶端和原始服務器(origin server)之間的服務器,為了從原始服務器取得內容,客戶端向代理發送一個請求並指定目標(原始服務器),然后代理向原始服務器轉交請求並將獲得的內容返回給客戶端。客戶端才能使用正向代理。正向代理的典型用途是為在防火牆內的局域網客戶端提供訪問Internet的途徑。正向代理還可以使用緩沖特性(由mod_cache提供)減少網絡使用率。
如果不是很清楚正向代理和反向代理的區別,請看下面:
1. 什么是正向代理?:
先說一下啥是正向代理,其實我們用的vpn本質上就是正向代理,因為一堵牆圍着我們國家,所以我們通過瀏覽器訪問國外的谷歌時請求被強了,根本出不去,那么我們怎么請求呢?vpn出現了,他就是一種正向代理,我們把我們的請求發送給vpn所在的服務器,比如它在香港,讓他幫我們轉發給谷歌,谷歌接收到請求后把數據回顯給vpn,vpn發送給我們,這其實就是一個正向代理的過程
正向代理特點: 代理服務器起到一個轉發請求的作用,但是從一開始它就很明確的知道自己要去訪問哪台服務器
2. 什么是反向代理?
同樣它的工作也是負責轉發;來自客戶端的請求,但是當客戶端的請求發過來之后,一開始它是不清楚往哪里轉發的,他需要根據配置去解析,然后再定位,轉發
3. 為什么要使用反向代理?
現在流行的微服務架構,擁有相同功能的服務,通常需要做成集群,那么問題來了,我們的瀏覽器默認是80端口,多個功能相同的應用分別占用多個不同的端口,那誰來占用80呢?nginx通過反向代理優秀的解決了這個問題 {% asset_img 1.jpg my first image %}
8.3除了Nginx,還有哪些代理服務器?
1、Varnish
Varnish是一款反向HTTP代理服務器,提供加速設計給大流量的網站應用。
2、HAProxy
HAProxy是一個免費且開源的軟件。它提供3層(TCP)和7層(http)協議支持負載均衡以及反向代理服務器功能。