nginx反向代理實現先後端分離&跨域問題

一、代理和跨域

1.1 正向代理

1)用戶但願代理服務器幫助其和要訪問服務器之間實現通訊,須要:javascript

a.用戶IP報文的目的IP=代理服務器IP;php

b.用戶報文端口號=代理服務器監聽端口號;html

c.HTTP消息裏的URL要提供服務器的連接;前端

2)代理服務器能夠根據HTTP消息裏的URL提供服務器的連接與服務器進行鏈接通訊;java

3)服務器返回網頁;nginx

4)代理服務器打包網頁返回給用戶;後端

1.2 反向代理

單個服務器的處理客戶端(用戶)請求能力是有限的,當用戶的請求達到必定數量時,會形成服務器忙,此時可使用多個服務器共同分擔這些請求,這些服務器提供相同的服務,對於客戶端而言,這些沒有任何區別。api

反向代理的實現:跨域

1)一個分發用戶請求的負載均衡設備,將用戶請求分發到空閒的服務器上;瀏覽器

2)服務器返回本身的服務到負載均衡設備;

3)負載均衡將服務器的服務返回用戶;

注意:客戶端作服務器域名解析時,返回的IP是負載均衡的IP,而不是服務器的IP,當新增/移除服務器時,只須要修改負載均衡的服務器列表,而不會影響現有的服務。

1.3 兩種代理

代理就是客戶端請求交給服務器響應;反向代理就是代理服務器的響應返回給客戶端;即正向代理是代理客戶端,反向代理是代理服務器;

1.4 跨域

跨域,指的是瀏覽器不能執行其餘網站的腳本。它是由瀏覽器的同源策略形成的,是瀏覽器對javascript施加的安全限制。

所謂同源是指,域名,協議,端口都相同。瀏覽器執行javascript腳本時,會檢查這個腳本屬於哪一個頁面,若是不是同源頁面,就不會被執行。

 

二、nginx  

2.1 nginx介紹

       Nginx在先後端分離框架設計中,既能夠做爲前端的HTTP訪問器,也能夠經過簡單配置實現負載均衡,還能夠經過反向代理配置解決先後端分離的JavaScript跨域問題。

       解決方案:Nginx服務器中,監聽同一個域名和端口,不一樣路徑轉發到客戶端和服務器,把不一樣端口和域名的限制經過反向代理,來解決跨域問題。

2.2 nginx安裝和配置

2.2.1 編輯nginx.conf文件

       進入/etc/nginx目錄,編輯nginx.conf文件;將http 域內的整個server{}內容清除,找到include /etc/nginx/conf.d/*.conf;這行,若是沒有,添加到http {} 的關閉括號前一行,刪除或註釋掉其餘的 include *.conf行。

2.2.2 建立workload_server.conf

       在nginx.conf中已經添加:include /etc/nginx/conf.d/*.conf;,因此先去/etc/nginx/conf.d目錄,清空全部的內容,而後在該目錄下建立workload_server.conf文件;

 

2.3 部署反向代理

upstream cas_server_http {

        #ip_hash;

        server ip1 weight=1;

        #jvm_route $cookie_JSESSIONID|sessionid reverse;

}

upstream server_app1{

        #ip_hash;

        server ip2 weight=1;

}

upstream server_app2{

        least_conn;

        server ip3 weight=1;

}

server {

        listen 8190 default_server;

        listen [::]:8190 default_server;

 

        server_name _;

 

        location / {

                root /var/www/html;

                # root /usr/share/nginx/html;

                index index.html index.htm index.nginx-debian.html;

                try_files $uri $uri/ =404;

        }

        # apiApp

        location /api1/ {

                proxy_pass http://server_app1/api1/;

                proxy_set_header Host $http_host;

        }

        # apiService

        location /api2/ {

                proxy_pass http://server_app2/api2/;

                proxy_set_header Host $http_host;

        }

        # apiCas

        location /cas/ {

                proxy_pass http://cas_server_http/cas/;

                proxy_set_header Host $host;

                proxy_cookie_path /cas/ /;

                proxy_pass_header Set-Cookie;

                            }

}

 

2.4 nginx操做

2.4.1 啓動nginx

nginx

2.4.2 中止nginx

nginx -s stop

2.4.3 查看nginx進程

ps -ef | grep nginx

2.4.4 修改nginx.conf後重啓nginx

nginx -s reload

 

三、問題

3.1 端口被佔用

 

解決方案:

 

 

3.2 403 forbidden 

分析:

當訪問該地址的時候,nginx 會按照 index.html,index.htm ,index.php 的前後順序在根目錄中查找文件。若是這三個文件都不存在,那麼nginx就會返回。

相關文章
相關標籤/搜索