導航:首頁 > 源碼編譯 > 反向代理源碼qt

反向代理源碼qt

發布時間:2022-10-02 17:00:34

『壹』 請教問題nginx反向代理proxy

一、反向代理:Web伺服器的「經紀人」
1.1 反向代理初印象
反向代理(Reverse Proxy)方式是指以代理伺服器來接受internet上的連接請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給internet上請求連接的客戶端,此時代理伺服器對外就表現為一個伺服器。
Nginx搭建反向代理伺服器過程詳解
從上圖可以看出:反向代理伺服器位於網站機房,代理網站Web伺服器接收Http請求,對請求進行轉發。
1.2 反向代理的作用
①保護網站安全:任何來自Internet的請求都必須先經過代理伺服器;
Nginx搭建反向代理伺服器過程詳解
②通過配置緩存功能加速Web請求:可以緩存真實Web伺服器上的某些靜態資源,減輕真實Web伺服器的負載壓力;
Nginx搭建反向代理伺服器過程詳解
③實現負載均衡:充當負載均衡伺服器均衡地分發請求,平衡集群中各個伺服器的負載壓力;
Nginx搭建反向代理伺服器過程詳解
二、初識Nginx:簡單卻不平凡
2.1 Nginx是神馬?
Nginx搭建反向代理伺服器過程詳解
Nginx是一款輕量級的網頁伺服器、反向代理器以及電子郵件代理伺服器。其將源代碼以類BSD許可證的形式發布,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。
Source:Nginx(發音同engine x),它是由俄羅斯程序員Igor Sysoev所開發的。起初是供俄國大型的門戶網站及搜索引擎Rambler(俄語:Рамблер)使用。此軟體BSD-like協議下發行,可以在UNIX、GNU/linux、BSD、Mac OS X、Solaris,以及Microsoft Windows等操作系統中運行。
說到Web伺服器,Apache伺服器和IIS伺服器是兩大巨頭;但是運行速度更快、更靈活的對手:Nginx 正在迎頭趕上。
2.2 Nginx的應用現狀
Nginx 已經在俄羅斯最大的門戶網站── Rambler Media(www.rambler.ru)上運行了3年時間,同時俄羅斯超過20%的虛擬主機平台採用Nginx作為反向代理伺服器。
Nginx搭建反向代理伺服器過程詳解Nginx搭建反向代理伺服器過程詳解Nginx搭建反向代理伺服器過程詳解Nginx搭建反向代理伺服器過程詳解Nginx搭建反向代理伺服器過程詳解
在國內,已經有 淘寶、新浪博客、新浪播客、網易新聞、六間房、56.com、Discuz!、水木社區、豆瓣、YUPOO、海內、迅雷在線 等多家網站使用 Nginx 作為Web伺服器或反向代理伺服器。
2.3 Nginx的核心特點
(1)跨平台:Nginx 可以在大多數 Unix like OS編譯運行,而且也有Windows的移植版本;
(2)配置異常簡單:非常容易上手。配置風格跟程序開發一樣,神一般的配置;
(3)非阻塞、高並發連接:數據復制時,磁碟I/O的第一階段是非阻塞的。官方測試能夠支撐5萬並發連接,在實際生產環境中跑到2~3萬並發連接數。(這得益於Nginx使用了最新的epoll模型);
PS:對於一個Web伺服器來說,首先看一個請求的基本過程:建立連接—接收數據—發送數據,在系統底層看來 :上述過程(建立連接—接收數據—發送數據)在系統底層就是讀寫事件。
①如果採用阻塞調用的方式,當讀寫事件沒有準備好時,必然不能夠進行讀寫事件,那麼久只好等待,等事件准備好了,才能進行讀寫事件,那麼請求就會被耽擱 。
②既然沒有準備好阻塞調用不行,那麼採用非阻塞調用方式。非阻塞就是:事件馬上返回,告訴你事件還沒准備好呢,你慌什麼,過會再來吧。好吧,你過一會,再來檢查一下事件,直到事件准備好了為止,在這期間,你就可以先去做其它事情,然後再來看看事件好了沒。雖然不阻塞了,但你得不時地過來檢查一下事件的狀態,你可以做更多的事情了,但帶來的開銷也是不小的。
(4)事件驅動:通信機制採用epoll模型,支持更大的並發連接。
①非阻塞通過不斷檢查事件的狀態來判斷是否進行讀寫操作,這樣帶來的開銷很大,因此就有了非同步非阻塞的事件處理機制。這種機制讓你可以同時監控多個事件,調用他們是阻塞的,但可以設置超時時間,在超時時間之內,如果有事件准備好了,就返回。這種機制解決了上面阻塞調用與非阻塞調用的兩個問題。
②以epoll模型為例:當事件沒有準備好時,就放入epoll(隊列)裡面。如果有事件准備好了,那麼就去處 理;如果事件返回的是EAGAIN,那麼繼續將其放入epoll裡面。從而,只要有事件准備好了,我們就去處理它,只有當所有事件都沒有準備好時,才在 epoll裡面等著。這樣,我們就可以並發處理大量的並發了,當然,這里的並發請求,是指未處理完的請求,線程只有一個,所以同時能處理的請求當然只有一 個了,只是在請求間進行不斷地切換而已,切換也是因為非同步事件未准備好,而主動讓出的。這里的切換是沒有任何代價,你可以理解為循環處理多個准備好的事 件,事實上就是這樣的。
③與多線程方式相比,這種事件處理方式是有很大的優勢的,不需要創建線程,每個請求佔用的內存也很少,沒有上下文切換, 事件處理非常的輕量級,並發數再多也不會導致無謂的資源浪費(上下文切換)。對於IIS伺服器,每個請求會獨佔一個工作線程,當並發數上到幾千時,就同時 有幾千的線程在處理請求了。這對操作系統來說,是個不小的挑戰:因為線程帶來的內存佔用非常大,線程的上下文切換帶來的cpu開銷很大,自然性能就上不 去,從而導致在高並發場景下性能下降嚴重。
總結:通過非同步非阻塞的事件處理機制,Nginx實現由進程循環處理多個准備好的事件,從而實現高並發和輕量級。
(5)Master/Worker結構:一個master進程,生成一個或多個worker進程。
Nginx搭建反向代理伺服器過程詳解
PS:Master-Worker設計模式核心思想是將原來串列的邏輯並行化, 並將邏輯拆分成很多獨立模塊並行執行。其中主要包含兩個主要組件Master和Worker,Master主要將邏輯進行拆分,拆分為互相獨立的部分,同 時維護了Worker隊列,將每個獨立部分下發到多個Worker並行執行,Worker主要進行實際邏輯計算,並將結果返回給Master。
問:nginx採用這種進程模型有什麼好處?
答:採用獨立的進程,可以讓互相之間不會影響,一個進程退出後,其它進程還在工作,服務不會中斷,Master 進程則很快重新啟動新的Worker進程。當然,Worker進程的異常退出,肯定是程序有bug了,異常退出,會導致當前Worker上的所有請求失 敗,不過不會影響到所有請求,所以降低了風險。
(6)內存消耗小:處理大並發的請求內存消耗非常小。在3萬並發連接下,開啟的10個Nginx 進程才消耗150M內存(15M*10=150M)。
(7)內置的健康檢查功能:如果 Nginx 代理的後端的某台 Web 伺服器宕機了,不會影響前端訪問。
(8)節省帶寬:支持 GZIP 壓縮,可以添加瀏覽器本地緩存的 Header 頭。
(9)穩定性高:用於反向代理,宕機的概率微乎其微。
三、構建實戰:Nginx+IIS構築Web伺服器集群的負載均衡
這里我們主要在Windows環境下,通過將同一個Web網站部署到不同伺服器的IIS上,再通過一個統一的Nginx反響代理伺服器對外提供統一訪問接入,實現一個最簡化的反向代理和負載均衡服務。但是,受限於實驗條件, 我們這里主要在一台計算機上進行反向代理、IIS集群的模擬,具體的實驗環境如下圖所示:我們將nginx服務和web網站都部署在一台計算機 上,nginx監聽http80埠,而web網站分別以不同的埠號(這里是8050及8060)部署在同一個IIS伺服器上,用戶訪問 localhost時,nginx作為反向代理將請求均衡地轉發給兩個IIS中不同埠的Web應用程序進行處理。雖然實驗環境很簡單而且有限,但是對於 一個簡單的負載均衡效果而言,本文是可以達到並且展示的。
Nginx搭建反向代理伺服器過程詳解
3.1 准備一個ASP.NET網站部署到IIS伺服器集群中
(1)在VS中新建一個ASP.NET Web應用程序,但是為了在一台計算機上展示效果,我們將這個Web程序復制一份,並修改兩個Web程序的Default.aspx,讓其的首頁顯示不同 的一點信息。這里Web1展示的是「The First Web:」,而Web2展示的則是「The Second Web」。
Nginx搭建反向代理伺服器過程詳解
(2)調試運行,看看兩個網站的效果如何?
①Web1的展示效果:
Nginx搭建反向代理伺服器過程詳解
②Web2的展示效果:
Nginx搭建反向代理伺服器過程詳解
③部署到IIS中,分配不同的埠號:這里我選擇了Web1:8050,Web2:8060
Nginx搭建反向代理伺服器過程詳解
(3)總結:在真實環境中,構建Web應用伺服器集群的實現是將同一個Web應用程序部署到Web伺服器集群中的多個Web伺服器上。
3.2 下載Nginx並部署到伺服器中作為自啟動的Windows服務
(1)到Nginx官網下載Nginx的Windows版本:http://nginx.org/en/download.html(這里我們使用nginx/Windows-1.4.7版本進行實驗,本文底部有下載地址)
(2)解壓到磁碟任意目錄,例如這里我解壓到了:D:\Servers\nginx-1.4.7
(3)啟動、停止和重新載入服務:通過cmd以守護進程方式啟動nginx.exe:start nginx.exe,停止服務:nginx -s stop,重新載入配置:nginx -s reload;
Nginx搭建反向代理伺服器過程詳解
(4)每次以cmd方式啟動Nginx服務不符合實際要求,於是我們想到將其注冊為Windows服務,並設置為自動啟動模式。這里,我們使用一個 不錯的小程序:「Windows Service Wrapper」,將nginx.exe注冊為Windows服務,具體的步湊如下:
①下載最新版的 Windows Service Wrapper 程序,比如我下載的名稱是 「winsw-1.8-bin.exe」(本文底部有下載地址),然後把它命名成你想要的名字(比如: 「nginx-service.exe」,當然,你也可以不改名)
②將重命名後的 nginx-service.exe 復制到 nginx 的安裝目錄(比如,我這里是 「D:\Servers\nginx-1.4.7″)
③在同一個目錄下創建一個Windows Service Wrapper 的XML配置文件,名稱必須與第一步重命名時使用的名稱一致(比如我這里是 「nginx-service.xml」, 如果,你沒有重命名,則應該是 「winsw-1.8-bin.xml」),這個XML的內容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<service>
<id>nginx</id>
<name>Nginx Service</name>
<description>High Performance Nginx Service</description>
<executable>D:\Servers\nginx-1.4.7\nginx.exe</executable>
<logpath>D:\Servers\nginx-1.4.7\</logpath>
<logmode>roll</logmode>
<depend></depend>
<startargument>-p D:\Servers\nginx-1.4.7</startargument>
<stopargument>-p D:\Servers\nginx-1.4.7 -s stop</stopargument>
</service>
④在命令行下執行以下命令,以便將其注冊成Windows服務:nginx-service.exe install
Nginx搭建反向代理伺服器過程詳解
⑤接下來就可以在Windows服務列表看到Nginx服務了,這里我們可以將其設置為自動啟動了:
Nginx搭建反向代理伺服器過程詳解
(5)總結:在Windows環境中,要對外提供的Windows服務一般都要將其啟動類型設置為自動。
3.3 修改Nginx核心配置文件nginx.conf
(1)進程數與每個進程的最大連接數:
?nginx進程數,建議設置為等於CPU總核心數
?單個進程最大連接數,那麼該伺服器的最大連接數=連接數*進程數
Nginx搭建反向代理伺服器過程詳解
(2)Nginx的基本配置:
?監聽埠一般都為http埠:80;
?域名可以有多個,用空格隔開:例如 server_name www.ha97.com ha97.com;
Nginx搭建反向代理伺服器過程詳解
(3)負載均衡列表基本配置:
?location / {}:對aspx後綴的進行負載均衡請求,假如我們要對所有的aspx後綴的文件進行負載均衡時,可以這樣寫:location ~ .*\.aspx$ {}
?proxy_pass:請求轉向自定義的伺服器列表,這里我們將請求都轉向標識為http://cuitccol.com的負載均衡伺服器列表;
Nginx搭建反向代理伺服器過程詳解
?在負載均衡伺服器列表的配置中,weight是權重,可以根據機器配置定義權重(如果某台伺服器的硬體配置十分好,可以處理更多的請求,那麼可以 為其設置一個比較高的weight;而有一台的伺服器的硬體配置比較差,那麼可以將前一台的weight配置為weight=2,後一台差的配置為 weight=1)。weigth參數表示權值,權值越高被分配到的幾率越大;
Nginx搭建反向代理伺服器過程詳解
(4)總結:最基本的Nginx配置差不多就是上面這些內容,當然僅僅是最基礎的配置。(詳細的配置內容請下載底部的nginx-1.4.7詳細查看)
3.4 添加Nginx對於靜態文件的緩存配置
為了提高響應速度,減輕真實伺服器的負載,對於靜態資源我們可以在反向代理伺服器中進行緩存,這也是反向代理伺服器的一個重要的作用。
(1)緩存靜態資源之圖片文件
root /nginx-1.4.7/staticresources/image:對於配置中提到的jpg/png等文件均定為到/nginx-1.4.7/staticresources/image文件夾中進行尋找匹配並將文件返回;
expires 7d:過期時效為7天,靜態文件不怎麼更新,過期時效可以設大一點,如果頻繁更新,則可以設置得小一點;
TIPS:下面的樣式、腳本緩存配置同這里一樣,只是定位的文件夾不一樣而已,不再贅述。
Nginx搭建反向代理伺服器過程詳解
(2)緩存靜態資源之樣式文件
Nginx搭建反向代理伺服器過程詳解
(3)緩存靜態資源之腳本文件
Nginx搭建反向代理伺服器過程詳解
(4)在nginx服務文件夾中創建靜態資源文件夾,並要緩存的靜態文件拷貝進去:這里我主要將Web程序中用到的image、css以及js文件拷貝了進去;
Nginx搭建反向代理伺服器過程詳解
(5)總結:通過配置靜態文件的緩存設置,對於這些靜態文件的請求可以直接從反向代理伺服器中直接返回,而無需再將這些靜態資源請求轉發到具體的Web伺服器進行處理了,可以提高響應速度,減輕真實Web伺服器的負載壓力。
3.5 簡單測試Nginx反向代理實現負載均衡效果
(1)第一次訪問http://localhost/Default.aspx時從127.0.0.1:8050處理響應返回結果
(2)第二次訪問http://localhost/Default.aspx時從127.0.0.1:8060處理響應返回結果
(3)多次訪問http://localhost/Default.aspx時的截屏:
Nginx搭建反向代理伺服器過程詳解
學習小結
在本文中,藉助了Nginx這個神器簡單地在Windows環境下搭建了一個反向代理服務,並模擬了一個IIS伺服器集群的負載均衡效果。從這個 DEMO中,我們可以簡單地感受到反向代理為我們所做的事情,並體會負載均衡是怎麼一回事。但是,在目前大多數的應用中,都會將Nginx部署在 Linux伺服器中,並且會做一些針對負載均衡的優化配置,這里我們所做的僅僅就是一個小小的使用而已(just修改一下配置文件)。不過,萬丈高樓平地 起,前期的小小體會,也會幫助我們向後期的深入學習奠定一點點的基礎。
突然在QQ空間里看到了朋友送的禮物,猛然發現今天居然是我的陽歷生日,好吧,我祝我自己生日快樂,希望自己在未來的日子中能夠做更多的實踐,分享更多的內容。當然,如果你覺得本文還可以,那也麻煩點個贊,不要吝嗇你的滑鼠左鍵喲。

『貳』 電信ADSL光纖下自建centos伺服器 阿里雲伺服器反向代理 外面再加個CDN 該如何操作呢

配置方法:
1、WEB伺服器
域名:www.123.com
IP:10.10.10.10
2、Nginx反向代理伺服器
IP:192.168.0.1
操作系統:Centos
3、客戶端
IP:192.168.0.2
操作系統:win7
C:\Windows\System32\drivers\etc\hosts #用記事本打開,在文件最後添加下面一行
192.168.0.1 www.123.com
配置步驟--Nginx反向代理伺服器
1、關閉SELinux
vi /etc/selinux/config#SELINUX=enforcing #注釋掉#SELINUXTYPE=targeted #注釋掉SELINUX=disabled #增加:wq #保存,關閉。shutdown -r now #重啟系統
2、防火牆開啟80埠
vi /etc/sysconfig/iptables-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT #添加內容/etc/init.d/iptables restart #重啟防火牆使配置生效
3、安裝編譯工具
yum install wget make gcc gcc-c++ zlib-devel openssl openssl-devel pcre-devel gd kernel keyutils patch perl
4、系統約定
軟體源代碼包存放位置: /usr/local/src源碼包編譯安裝位置: /usr/local/軟體名字
5、下載軟體
cd /usr/local/src #進入目錄(一)、下載nginx(目前穩定版) wget http://nginx.org/download/nginx-1.8.0.tar.gz(二)、下載pcre (支持nginx偽靜態) wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.35.tar.gz #這一命令我沒有獲取到文件,是在本地下載好後上傳到伺服器(二)、下載ngx_cache_purge(清除指定URL緩存) wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
6、安裝pcre
cd /usr/local/srcmkdir /usr/local/pcre #創建安裝目錄tar zxvf pcre-8.35.tar.gzcd pcre-8.35./configure --prefix=/usr/local/pcre #配置makemake install
7、安裝Nginx
groupadd www #添加www組useradd -g www www -s /bin/false #創建nginx運行賬戶www並加入到www組,不允許www用戶直接登錄系統cd /usr/local/srctar zxvf ngx_cache_purge-2.3.tar.gztar zxvf nginx-1.8.0.tar.gzcd nginx-1.8.0./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_mole --with-openssl=/usr/ --with-pcre=/usr/local/src/pcre-8.35 --add-mole=../ngx_cache_purge-2.3 #注意:--with-pcre=/usr/local/src/pcre-8.35指向的是源碼包解壓的路徑,而不是安裝的路徑,否則會報錯make #編譯make install #安裝/usr/local/nginx/sbin/nginx #啟動nginxchown www.www -R /usr/local/nginx/html #設置目錄所有者chmod 700 -R /usr/local/nginx/html #設置目錄許可權
8、添加Nginx啟動文件
vi /etc/rc.d/init.d/nginx #編輯啟動文件#!/bin/bash# nginx Startup script for the Nginx HTTP Server# it is v.0.0.2 version.# chkconfig: - 85 15# description: Nginx is a high-performance web and proxy server.# It has a lot of features, but it's not for everyone.# processname: nginx# pidfile: /var/run/nginx.pid# config: /usr/local/nginx/conf/nginx.confnginxd=/usr/local/nginx/sbin/nginxnginx_config=/usr/local/nginx/conf/nginx.confnginx_pid=/usr/local/nginx/logs/nginx.pidRETVAL=0prog="nginx"# Source function library.. /etc/rc.d/init.d/functions# Source networking configuration.. /etc/sysconfig/network# Check that networking is up.[ ${NETWORKING} = "no" ] && exit 0[ -x $nginxd ] || exit 0# Start nginx daemons functions.start() {if [ -e $nginx_pid ];then echo "nginx already running...." exit 1fi echo -n $"Starting $prog: " daemon $nginxd -c ${nginx_config} RETVAL=$? echo [ $RETVAL = 0 ] && touch /var/lock/subsys/nginx return $RETVAL}# Stop nginx daemons functions.stop() {echo -n $"Stopping $prog: "killproc $nginxdRETVAL=$?echo[ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /usr/local/nginx/logs/nginx.pid}# reload nginx service functions.reload() { echo -n $"Reloading $prog: " #kill -HUP `cat ${nginx_pid}` killproc $nginxd -HUP RETVAL=$? echo}# See how we were called.case "$1" instart) start ;;stop) stop ;;reload) reload ;;restart) stop start ;;status) status $prog RETVAL=$? ;;*) echo $"Usage: $prog {start|stop|restart|reload|status|help}" exit 1esacexit $RETVAL:wq #保存退出chmod 775 /etc/rc.d/init.d/nginx #賦予文件執行許可權chkconfig nginx on #設置開機啟動/etc/rc.d/init.d/nginx restartservice nginx restart
9、配置Nginx
cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.confbak #備份nginx配置文件
vi /usr/local/nginx/conf/nginx.conf
(一)、設置nginx運行賬號
找到user nobody;修改為 user www www; #在第一行
(二)、禁止nginx空主機頭,找到server,在上面一行添加如下內容:
server { listen 80 default; server_name _; location / { root html; return 404; } location ~ /.ht { deny all; }}/etc/rc.d/init.d/nginx restart #重啟nginx 這樣設置之後,空主機頭訪問會直接跳轉到nginx404錯誤頁面。
(三)、添加nginx虛擬主機包含文件
cd /usr/local/nginx/conf/ #進入nginx安裝目錄mkdir vhost #建立虛擬目錄vi /usr/local/nginx/conf/nginx.conf #編輯 找到上一步添加的代碼,在最後添加:include vhost/*.conf;例如:server { listen 80 default; server_name _; location / { root html; return 404; } location ~ /.ht { deny all; }}include vhost/*.conf;
(四)、添加proxy_cache參數配置包含文件
cd /usr/local/nginx/conf/ touch proxy.conf vi /usr/local/nginx/conf/nginx.conf #編輯 找到http { 在下面添加一行include proxy.conf;
(五)、添加被代理伺服器列表包含文件
cd /usr/local/nginx/conf/ touch mysvrhost.conf vi /usr/local/nginx/conf/nginx.conf #編輯 找到上一步添加的代碼,在下面添加一行include mysvrhost.conf;
(六)、設置nginx全局參數
vi /usr/local/nginx/conf/nginx.conf worker_processes 2; #工作進程數,為CPU的核心數或者兩倍events{ use epoll; #增加 worker_connections 65535; #修改為65535,最大連接數。}以下代碼在http { 部分增加與修改server_names_hash_bucket_size 128; #增加client_header_buffer_size 32k; #增加large_client_header_buffers 4 32k; #增加client_max_body_size 300m; #增加tcp_nopush on; #修改為onkeepalive_timeout 60; #修改為60tcp_nodelay on; #增加server_tokens off; #增加,不顯示nginx版本信息gzip on; #修改為ongzip_min_length 1k; #增加gzip_buffers 4 16k; #增加gzip_http_version 1.1; #增加gzip_comp_level 2; #增加gzip_types text/plain application/x-javascript text/css application/xml; #增加gzip_vary on; #增加
(七)、設置proxy_cache參數配置
cd /home mkdir -p /home/proxy_temp_dir #proxy_temp_dir與proxy_cache_dir這兩個文件夾必須在同一個分區mkdir -p /home/proxy_cache_dir #proxy_cache_dir與proxy_temp_dir這兩個文件夾必須在同一個分區chown www.www -R proxy_cache_dir proxy_temp_dir #設置目錄所有者chmod -R 777 proxy_cache_dir proxy_temp_dir #設置目錄許可權cd /usr/local/nginx/conf/ vi proxy.conf #編輯,添加以下代碼proxy_temp_path /home/proxy_temp_dir; #指定臨時文件目錄proxy_cache_path /home/proxy_cache_dir levels=1:2 keys_zone=cache_one:50m inactive=1dmax_size=1g; #設置Web緩存區名稱為cache_one,內存緩存為50MB,自動清除1天內沒有被訪問的文件,硬碟緩存為1GB。client_body_buffer_size 512k; #增加緩沖區代理緩沖客戶端請求的最大位元組數proxy_connect_timeout 60; #增加連接後端伺服器超時時間proxy_read_timeout 60; #增加後端伺服器響應請求超時時間proxy_send_timeout 60; #增加後端伺服器發送數據超時時間proxy_buffer_size 32k; #增加代理請求緩存區大小proxy_buffers 4 64k; #增加proxy_busy_buffers_size 128k; #增加系統繁忙時可申請的proxy_buffers大小proxy_temp_file_write_size 128k; #增加proxy緩存臨時文件的大小proxy_next_upstream error timeout invalid_header http_500 http_503 http_404; #增加故障轉移,如果後端的伺服器返回502、504、執行超時等錯誤,自動將請求轉發到upstream負載均衡池中的另一台伺服器,實現故障轉移。proxy_cache cache_one; #增加使用web緩存區cache_one
(八)、設置被代理伺服器文件列表
cd /usr/local/nginx/conf/ vi mysvrhost.conf #編輯,添加以下代碼 upstream win8net{ server 10.10.10.10:80 weight=1 max_fails=2 fail_timeout=30s;}
(九)、新建虛擬主機配置文件
cd /usr/local/nginx/conf/vhost #進入虛擬主機目錄
touch www.123.com.conf #建立虛擬主機配置文件
vi www.123.com.conf #編輯
server {
listen 80;
server_name www.123.com win8.net;
location /
{
proxy_pass http://win8net;
proxy_cache_key $host$uri$is_args$args; #增加設置web緩存的key值,nginx根據key值md5哈希存儲緩存
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_cache_valid 200 304 12h;
expires 2d;
}
location ~ .*\.(php|jsp|cgi|asp|aspx|flv|swf|xml)?$ #列出的擴展名文件不緩存。
{
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://win8net;
}
access_log off;
location ~ /purge(/.*) #用於清除緩存
{
allow 192.168.190.1;
allow 192.168.21.0/24; #設置只允許指定的IP或IP段才可以清除URL緩存。
deny all;
proxy_cache_purge cache_one $host$1$is_args$args;
}
}
10、清除緩存模塊使用說明
1、瀏覽圖片文件:http://www.123.com/images/nopic.gif
2、清除這個文件緩存:http://www.123.com/purge/images/nopic.gif #提示:Successful purge,緩存文件清除成功,如果這個文件沒有被緩存過,則提示:404 Not Found
11、配置結束

『叄』 使用thinkphp 怎麼實現反向代理

改自PHP Reverse Proxy PRP,修改了原版中的一些錯誤,支持了文件上傳以及上傳文件類型識別,支持指定IP,自適應SAE環境。
使用方法
?123456789 <?php $proxy=new PhpReverseProxy(); $proxy->port="8080"; $proxy->host="ww"; //$proxy->ip="1.1.1.1"; $proxy->forward_path=""; $proxy->connect(); $proxy->output(); ?>
源代碼
<?php //Source Code: http //www xiumu.org/technology/php-reverse-proxy-class.shtml class PhpReverseProxy{ public $publicBaseURL; public $outsideHeaders; public $XRequestedWith; public $sendPost; public $port,$host,$ip,$content,$forward_path,$content_type,$user_agent, $XFF,$request_method,$IMS,$cacheTime,$cookie,$authorization; private $http_code,$lastModified,$version,$resultHeader; const chunkSize = 10000; function __construct(){ $this->version="PHP Reverse Proxy (PRP) 1.0"; $this->port="8080"; $this->host="127.0.0.1"; $this->ip=""; $this->content=""; $this->forward_path=""; $this->path=""; $this->content_type=""; $this->user_agent=""; $this->http_code=""; $this->XFF=""; $this->request_method="GET"; $this->IMS=false; $this->cacheTime=72000; $this->lastModified=gmdate("D, d M Y H:i:s",time()-72000)." GMT"; $this->cookie=""; $this->XRequestedWith = ""; $this->authorization = ""; } function translateURL($serverName) { $this->path=$this->forward_path.$_SERVER['REQUEST_URI']; if(IS_SAE) return $this->translateServer($serverName).$this->path; if($_SERVER['QUERY_STRING']=="") return $this->translateServer($serverName).$this->path; else return $this->translateServer($serverName).$this->path."?".$_SERVER['QUERY_STRING']; } function translateServer($serverName) { $s = empty($_SERVER["HTTPS"]) ? '' : ($_SERVER["HTTPS"] == "on") ? "s" : ""; $protocol = $this->left(strtolower($_SERVER["SERVER_PROTOCOL"]), "/").$s; if($this->port=="") return $protocol."://".$serverName; else return $protocol."://".$serverName.":".$this->port; } function left($s1, $s2) { return substr($s1, 0, strpos($s1, $s2)); } function preConnect(){ $this->user_agent=$_SERVER['HTTP_USER_AGENT']; $this->request_method=$_SERVER['REQUEST_METHOD']; $tempCookie=""; foreach ($_COOKIE as $i => $value) { $tempCookie=$tempCookie." $i=$_COOKIE[$i];"; } $this->cookie=$tempCookie; if(empty($_SERVER['HTTP_X_FORWARDED_FOR'])){ $this->XFF=$_SERVER['REMOTE_ADDR']; } else { $this->XFF=$_SERVER['HTTP_X_FORWARDED_FOR'].", ".$_SERVER['REMOTE_ADDR']; } } function connect(){ if(empty($_SERVER['HTTP_IF_MODIFIED_SINCE'])){ $this->preConnect(); $ch=curl_init(); if($this->request_method=="POST"){ curl_setopt($ch, CURLOPT_POST,1); $postData = array(); $filePost = false; $uploadPath = 'uploads/'; if (IS_SAE) $uploadPath = SAE_TMP_PATH; if(count($_FILES)>0){ if(!is_writable($uploadPath)){ die('You cannot upload to the specified directory, please CHMOD it to 777.'); } foreach($_FILES as $key => $fileArray){ ($fileArray["tmp_name"], $uploadPath . $fileArray["name"]); $proxyLocation = "@" . $uploadPath . $fileArray["name"] . ";type=" . $fileArray["type"]; $postData = array($key => $proxyLocation); $filePost = true; } } foreach($_POST as $key => $value){ if(!is_array($value)){ $postData[$key] = $value; } else{ $postData[$key] = serialize($value); } } if(!$filePost){ //$postData = http_build_query($postData); $postString = ""; $firstLoop = true; foreach($postData as $key => $value){ $parameterItem = urlencode($key)."=".urlencode($value); if($firstLoop){ $postString .= $parameterItem; } else{ $postString .= "&".$parameterItem; } $firstLoop = false; } $postData = $postString; } //echo print_r($postData); //curl_setopt($ch, CURLOPT_VERBOSE, 0); //curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)"); $this->sendPost = $postData; //var_mp(file_exists(str_replace('@','',$postData['imgfile'])));exit; curl_setopt($ch, CURLOPT_POSTFIELDS,$postData); //curl_setopt($ch, CURLOPT_POSTFIELDS,file_get_contents($proxyLocation)); //curl_setopt($ch, CURLOPT_POSTFIELDS,file_get_contents("php://input")); } //gets rid of mulitple ? in URL $translateURL = $this->translateURL(($this->ip)?$this->ip:$this->host); if(substr_count($translateURL, "?")>1){ $firstPos = strpos($translateURL, "?", 0); $secondPos = strpos($translateURL, "?", $firstPos + 1); $translateURL = substr($translateURL, 0, $secondPos); } curl_setopt($ch,CURLOPT_URL,$translateURL); $proxyHeaders = array( "X-Forwarded-For: ".$this->XFF, "User-Agent: ".$this->user_agent, "Host: ".$this->host ); if(strlen($this->XRequestedWith)>1){ $proxyHeaders[] = "X-Requested-With: ".$this->XRequestedWith; //echo print_r($proxyHeaders); } curl_setopt($ch,CURLOPT_HTTPHEADER, $proxyHeaders); if($this->cookie!=""){ curl_setopt($ch,CURLOPT_COOKIE,$this->cookie); } curl_setopt($ch,CURLOPT_FOLLOWLOCATION,false); curl_setopt($ch,CURLOPT_AUTOREFERER,true); curl_setopt($ch,CURLOPT_HEADER,true); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); $output=curl_exec($ch); $info = curl_getinfo( $ch ); curl_close($ch); $this->postConnect($info,$output); }else { $this->lastModified=$_SERVER['HTTP_IF_MODIFIED_SINCE']; $this->IMS=true; } } function postConnect($info,$output){ $this->content_type=$info["content_type"]; $this->http_code=$info['http_code']; //var_mp($info);exit; if(!empty($info['last_modified'])){ $this->lastModified=$info['last_modified']; } $this->resultHeader=substr($output,0,$info['header_size']); $content = substr($output,$info['header_size']); if($this->http_code=='200'){ $this->content=$content; }elseif( ($this->http_code=='302' || $this->http_code=='301') && isset($info['redirect_url'])){ $redirect_url = str_replace($this->host,$_SERVER['HTTP_HOST'],$info['redirect_url']); if (IS_SAE) $redirect_url = str_replace('http://fetchurl.sae.sina.com.cn/','',$info['redirect_url']); header("Location: $redirect_url"); exit; }elseif($this->http_code=='404'){ header("HTTP/1.1 404 Not Found"); exit("HTTP/1.1 404 Not Found"); }elseif($this->http_code=='500'){ header('HTTP/1.1 500 Internal Server Error'); exit("HTTP/1.1 500 Internal Server Error"); }else{ exit("HTTP/1.1 ".$this->http_code." Internal Server Error"); } } function output(){ $currentTimeString=gmdate("D, d M Y H:i:s",time()); $expiredTime=gmdate("D, d M Y H:i:s",(time()+$this->cacheTime)); $doOriginalHeaders = true; if($doOriginalHeaders){ if($this->IMS){ header("HTTP/1.1 304 Not Modified"); header("Date: Wed, $currentTimeString GMT"); header("Last-Modified: $this->lastModified"); header("Server: $this->version"); }else{ header("HTTP/1.1 200 OK"); header("Date: Wed, $currentTimeString GMT"); header("Content-Type: ".$this->content_type); header("Last-Modified: $this->lastModified"); header("Cache-Control: max-age=$this->cacheTime"); header("Expires: $expiredTime GMT"); header("Server: $this->version"); preg_match("/Set-Cookie:[^\n]*/i",$this->resultHeader,$result); foreach($result as $i=>$value){ header($result[$i]); } preg_match("/Content-Encoding:[^\n]*/i",$this->resultHeader,$result); foreach($result as $i=>$value){ //header($result[$i]); } preg_match("/Transfer-Encoding:[^\n]*/i",$this->resultHeader,$result); foreach($result as $i=>$value){ //header($result[$i]); } echo($this->content); /* if(stristr($this->content, "error")){ echo print_r($this->sendPost); } */ } } else{ $headerString = $this->resultHeader; //string $headerArray = explode("\n", $headerString); foreach($headerArray as $privHeader){ header($privHeader); } if(stristr($headerString, "Transfer-encoding: chunked")){ flush(); ob_flush(); $i = 0; $maxLen = strlen($this->content); while($i < $maxLen){ $endChar = $i + self::chunkSize; if($endChar >= $maxLen){ $endChar = $maxLen - 1; } $chunk = substr($this->content, $i, $endChar); $this->mp_chunk($chunk); flush(); ob_flush(); $i = $i + $endChar; } } else{ echo($this->content); } //echo "header: ".print_r($headerArray); //header($this->resultHeader); } } function mp_chunk($chunk) { echo sprintf("%x\r\n", strlen($chunk)); echo $chunk; echo "\r\n"; } function getOutsideHeaders(){ $headers = array(); foreach ($_SERVER as $name => $value){ if (substr($name, 0, 5) == 'HTTP_') { $name = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5))))); $headers[$name] = $value; }elseif ($name == "CONTENT_TYPE") { $headers["Content-Type"] = $value; }elseif ($name == "CONTENT_LENGTH") { $headers["Content-Length"] = $value; }elseif(stristr($name, "X-Requested-With")) { $headers["X-Requested-With"] = $value; $this->XRequestedWith = $value; } } //echo print_r($headers); $this->outsideHeaders = $headers; return $headers; } } ?>

『肆』 nginx 反向代理到百度怎麼配置

方法/步驟
關閉防火牆與SELinux
輸入命令:
service iptables stop
setenforce 0
安裝編譯環境
輸入命令:yum install gcc*
安裝nginx
切換到nginx源碼包存放位置
輸入命令:
tar -zxvf nginx-1.6.2.tar.gz
./configure
make
make install
4
配置反向代理
輸入命令:
vim /usr/local/nginx/conf/nginx.conf
找到server{***}欄位,注釋掉,然後自定義該欄位。
示例:
server{
listen 80;
server_name 反向代理的域名或ip;
location / {
proxy_pass http://****; //代理指向的伺服器
}
}

『伍』 如何使用golang實現可透傳原請求的header的反向代理

優雅的Golang Web開發框架:Martini
Martini 是一個非常新的 Go 語言的 Web 框架,使用 Go 的 net/http 借口開發,類似 Sinatra 或者 Flask 之類的框架,你可使用自己的 DB 層、會話管理和模板。
特性:
使用非常簡單
無侵入設計
可與其他 Go 的包配合工作
超棒的路徑匹配和路由
模塊化設計,可輕松添加工具
大量很好的處理器和中間件
很棒的開箱即用特性
完全兼容 http.HandlerFunc 介面.
示例代碼:
01 package main
02
03 import "github.com/codegangsta/martini"
04
05 func main() {
06 m := martini.Classic()
07 m.Get("/", func() string {
08 return "Hello world!"
09 })
10 m.Run()
11 }
請求處理器:
查看源碼列印?
1 m.Get("/", func() {
2 println("hello world")
3 })
4
5 m.Get("/", func(res http.ResponseWriter, req *http.Request) { // res and req are injected by Martini
6 res.WriteHeader(200) // HTTP 200
7 })

『陸』 CentOS中如何實現nginx反向代理tomcat

location ~ \.(jsp|jspx|do)?$ {
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_pass http://你的伺服器地址:8080;
}

『柒』 如何使用apache的反向代理改寫url絕對路徑

頁面源代碼中的相對路徑都正常. 但頁面源代碼中有部分鏈接是寫成了絕對路徑,那麼滑鼠放到鏈接上時顯示的路徑仍然是0.92/.,那麼訪問這個鏈接時就直接去訪問0.92了,而不是

『捌』 nginx nodejs反向代理怎麼配置

1.安裝nodejs,之前就安裝了。
2.安裝nginx ,我採用的直接源碼安裝
3.進入 /usr/local/nginx/conf 目錄,在該目錄下創建include 文件下,我的配置文件就寫在這個文件夾裡面
4.進入 /usr/local/nginx/conf/include 目錄,創建 nginx.node.conf 文件,在裡面輸入如下代碼:

upstream nodejs {
server 127.0.0.1:3000;
#server 127.0.0.1:3001;
keepalive 64;
}

server {
listen 80;
server_name www.penguu.com penguu.com;
access_log /var/log/nginx/test.log;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxy true;
proxy_set_header Connection "";
proxy_pass http://nodejs;

}

}

5.進入/usr/local/nginx/conf ,打開nginx.conf, 在http 裡面添加 include /usr/local/nginx/conf/include/*
6.重啟nginx , 輸入 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
在瀏覽器輸入penguu.com ok.

『玖』 apache配置反向代理的問題,求大神指點!

在IIS7之前,在windows上要實現該功能卻不是一件容易的事情,但是在IIS7上,通過Application Request Routing模塊,我們可以輕松實現反向代理
在配置web伺服器的時候,我們經常遇到這樣的問題,由於某些原因,該伺服器只能擁有一個公網IP,但是可能需要提供其他機器或者本機上其他 webserver的伺服器給訪問者,同時又不希望使用其他埠,如果在linux下,常見的解決方案是使用nginx作為前端server,通過反向代 理間接訪問其他webserver.在IIS7之前,在windows上要實現該功能卻不是一件容易的事情,但是在IIS7上,通過 Application Request Routing模塊,我們可以輕松實現反向代理.

本次測試配置的情況,簡單起見,只在 iis中測試,配置3個網站,第一個」LevenWeb」,使用80埠提供服務,第二個」levenblog」,下面運行著 levenblog2.0.9,使用8080埠,第三個」phpweb」,下面有一個」test.php」的phpinfo頁面(iis7 php配置本文不再詳述),本機ip:192.168.1.8,為了測試,我們先進行域名綁定,也就是在leven.com.cn下新增3個子域名,域名 綁定如下圖所示:

我們的目標如下:

http://phpweb.leven.com.cn/ 訪問phpweb站點,也就是http://localhost:8081/

http://levenblog.leven.com.cn/ 訪問levenblog站點,也就是http://localhost:8080/

http://realblog.leven.com.cn/ 訪問公網上的levenblog站點,也就是http://leven.com.cn/

http://localhost/leven 訪問levenblog站點,也就是http://leven.com.cn/

首先前往http://www.iis.net/extensions/ApplicationRequestRouting下載Application Request Routing,然後安裝,本次實踐使用的是V2版.

安裝完畢之後,新建3個站點:

然後找到ARR配置菜單:

開啟Proxy項:

然後在levenweb站點下配置反向代理路由,配置可以使用UI界面或者直接修改web.config的模式,本次配置給出ui和config文件兩種方式,個人更喜歡config配置文件模式.

進入該項,先配置第一項, http://phpweb.leven.com.cn/ 訪問phpweb站點,也就是http://localhost:8081/,選擇」Add Rules...」:

然後選擇」Blank Rule」

然後填寫如下:

圖片看不清楚?請點擊這里查看原圖(大圖)。

該參數設置表面ARR將攔截所有請求

繼續在」Conditions」中選擇」Add」:

該設置表面只有HTTP_HOST為phpweb.leven.com.cn的URL才能通過該規則,如果您綁定了多個域名,可以根據多次增加或者通過正則表達式的|來間隔

最後在下面的Action中配置代理路徑:

圖片看不清楚?請點擊這里查看原圖(大圖)。

在這兒,{R:1}代表了MatchUrl中的第一個匹配括弧

同樣配置的web.config文件如下:
復制代碼 代碼如下:

測試訪問http://phpweb.leven.com.cn/test.php,結果如下:

下面同樣可以配置levenblog.leven.com.cn和realblog.leven.com.cn

Ui界面配置不再說明,配置完成的web.config如下:
復制代碼 代碼如下:

訪問結果分別為:



我們再添加最後一項,將http://localhost/leven 代理到 http://leven.com.cn/
復制代碼 代碼如下:

但是此時訪問會出現問題,如下圖:

顯然,出現了css丟失等情況,通過查看源碼:

可以看到css的路徑有誤,不僅如此,所有的img,a標簽路徑全部出現了錯誤,代理之後的地址是/leven/xxx的,但是源地址仍然是/xxx,因此我們還需要增加一個Outbound Rule

配置好的config文件如下:
復制代碼 代碼如下:

然後刷新:

可見路徑正確.

在使用了反向代理之後,編程上也有些地方需要注意了,在取客戶端IP的時候,由於多了一層代理,直接是無法獲取的,因此,我們需要開啟

然後通過獲取Header中的X-Forworded-For欄位來取得客戶端IP

從測試來看,ARR是個非常有用的代理模塊,能完全滿足我們反向代理的需求,不僅如此,ARR還提供了UrlRewrite,ServerFarms,Cache等很多功能,很是值得我們挖掘.

來源: 博客園 作者:Leven

閱讀全文

與反向代理源碼qt相關的資料

熱點內容
解壓小熊手機殼 瀏覽:342
成都市區建成面積演算法 瀏覽:658
智能家居單片機 瀏覽:95
買男裝用什麼app好 瀏覽:853
文件夾合並了怎麼拆開 瀏覽:257
波段副圖源碼無未來函數 瀏覽:86
livecn伺服器地址 瀏覽:257
程序員這個工作真的很吃香嗎 瀏覽:844
程序員和數學分析師待遇 瀏覽:678
壓縮氣彈簧怎麼拆 瀏覽:321
華為公有雲伺服器添加虛擬ip 瀏覽:209
程序員和運營哪個累 瀏覽:24
抖音安卓信息提示音怎麼設置 瀏覽:454
光速虛擬機的共享文件夾 瀏覽:248
程序員培訓機構發的朋友圈真實性 瀏覽:742
天乾地支簡單演算法 瀏覽:299
下載個壓縮文件 瀏覽:300
普通人電腦關機vs程序員關機 瀏覽:628
米酷建站源碼 瀏覽:115
氫氣app怎麼搜搭配 瀏覽:619