反向代理原理反向代理服務器配置解決訪問加速

基本原理:javascript

用戶A始終認爲它訪問的是原始服務器B而不是代理服務器Z,但實用際上反向代理服務器接受用戶A的應答,從原始資源服務器B中取得用戶A的需求資源,而後發送給用戶A。因爲防火牆的做用,只容許代理服務器Z訪問原始資源服務器B。儘管在這個虛擬的環境下,防火牆和反向代理的共同做用保護了原始資源服務器B,但用戶A並不知情。php

ps:簡單的說,用戶A所請求的和響應全由代理服務器Z和真實的服務器B作了代理工做css



解決使用單線程下nginx反向代理服務器配置(網絡資料提供參考,原文:http://www.jb51.net/article/38046.htm):html

linux下經過Nginx反向代理和proxy_cache緩存搭建CDN服務器加快Web訪問速度的配置方法
java

問題場景:
移動用戶訪問web服務器www.osyunwei.com很慢
解決辦法:
一、在移動機房放置一臺nginx反向代理服務器
二、經過域名DNS智能解析,全部移動用戶訪問www.osyunwei.com時解析到nginx反向代理服務器
三、nginx反向代理服務器與web服務器之間採用專線鏈接
說明:
一、web服務器
線路:電信
IP:192.168.21.129
域名:www.osyunwei.com
二、nginx反向代理服務器
線路:移動
系統:CentOS 6.2
IP:192.168.21.164
vi /etc/hosts #編輯,在文件最後添加下面一行
192.168.21.129 www.osyunwei.com
三、客戶端
線路:移動
系統:Windows 7
IP:192.168.21.130
C:\Windows\System32\drivers\etc\hosts #用記事本打開,在文件最後添加下面一行
192.168.21.164 www.osyunwei.com
node


###################如下操做在nginx反向代理服務器上配置###################linux


一、關閉SELinux
vi /etc/selinux/config
#SELINUX=enforcing #註釋掉
#SELINUXTYPE=targeted #註釋掉
SELINUX=disabled #增長
:wq 保存,關閉。
shutdown -r now重啓系統
二、開啓防火牆80端口
vi /etc/sysconfig/iptables
添加下面的內容
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
/etc/init.d/iptables restart #重啓防火牆使配置生效
三、安裝編譯工具
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/軟件名字
五、下載軟件
cd /usr/local/src #進入目錄
(一)、下載nginx(目前穩定版)
wget http://nginx.org/download/nginx-1.0.12.tar.gz
(二)、下載pcre (支持nginx僞靜態)
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.21.tar.gz
(二)、下載ngx_cache_purge(清除指定URL緩存)
wget http://labs.frickle.com/files/ngx_cache_purge-1.5.tar.gz
六、安裝pcre
cd /usr/local/src
mkdir /usr/local/pcre #建立安裝目錄
tar zxvf pcre-8.21.tar.gz
cd pcre-8.21
./configure --prefix=/usr/local/pcre #配置
make
make install
七、安裝 nginx
groupadd www #添加www組
useradd -g www www -s /bin/false #建立nginx運行帳戶www並加入到www組,不容許www用戶直接登陸系統
cd /usr/local/src
tar zxvf ngx_cache_purge-1.5.tar.gz
tar zxvf nginx-1.0.12.tar.gz
cd nginx-1.0.12
./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-openssl=/usr/ --with-pcre=/usr/local/src/pcre-8.21 --add-module=../ngx_cache_purge-1.5
注意:--with-pcre=/usr/local/src/pcre-8.21指向的是源碼包解壓的路徑,而不是安裝的路徑,不然會報錯
make #編譯
make install #安裝
/usr/local/nginx/sbin/nginx #啓動nginx
chown www.www -R /usr/local/nginx/html #設置目錄全部者
chmod 700 -R /usr/local/nginx/html #設置目錄權限
vi /etc/rc.d/init.d/nginx # 設置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.conf
nginxd=/usr/local/nginx/sbin/nginx
nginx_config=/usr/local/nginx/conf/nginx.conf
nginx_pid=/usr/local/nginx/logs/nginx.pid
RETVAL=0
prog="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 1
fi
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 $nginxd
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /usr/local/nginx/logs/nginx.pid
}
reload() {
echo -n $"Reloading $prog: "
#kill -HUP `cat ${nginx_pid}`
killproc $nginxd -HUP
RETVAL=$?
echo
}
# See how we were called.
case "$1" in
start)
start

stop)
stop

reload)
reload

restart)
stop
start
;;nginx

status)
status $prog
RETVAL=$?

*)
echo $"Usage: $prog {start|stop|restart|reload|status|help}"
exit 1
esac
exit $RETVAL
=======================================================
:wq!保存退出
chmod 775 /etc/rc.d/init.d/nginx #賦予文件執行權限
chkconfig nginx on #設置開機啓動
/etc/rc.d/init.d/nginx restart
service nginx restart
八、配置nginx
cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.confbak #備份nginx配置文件
(一)、設置nginx運行帳號
vi /usr/local/nginx/conf/nginx.conf #編輯
找到user nobody;修改成
user www www; #在第一行
(二)、禁止nginx空主機頭
vi /usr/local/nginx/conf/nginx.conf #編輯
找到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; #修改成on
keepalive_timeout 60; #修改成60
tcp_nodelay on; #增長
server_tokens off; #增長,不顯示nginx版本信息
gzip on; #修改成on
gzip_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 #設置目錄權限
系統運維 www.osyunwei.com 舒適提醒:qihang01原創內容©版權全部,轉載請註明出處及原文鏈
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=1d max_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; #增長故障轉移,若是後端的服務器返回50二、50四、執行超時等錯誤,自動將請求轉發到upstream負載均衡池中的另外一臺服務器,實現故障轉移。proxy_cache cache_one; #增長使用web緩存區cache_one
(八)、設置被代理服務器文件列表
cd /usr/local/nginx/conf/ #進入目錄
vi mysvrhost.conf #編輯,添加如下代碼
upstream osyunweihost {
server 192.168.21.129:80 weight=1 max_fails=2 fail_timeout=30s;
}
(九)、新建虛擬主機配置文件
cd /usr/local/nginx/conf/vhost #進入虛擬主機目錄
touch www.osyunwei.com.conf #創建虛擬主機配置文件
vi www.osyunwei.com.conf #編輯c++

server {
listen 80;
server_name www.osyunwei.com osyunwei.com;web

location /
{
proxy_pass http://osyunweihost;
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://osyunweihost;
}
access_log off;
}

location ~ /purge(/.*) #用於清除緩存
{
allow 127.0.0.1;
allow 192.168.21.0/24; #設置只容許指定的IP或IP段才能夠清除URL緩存。
deny all;
proxy_cache_purge cache_one $host$1$is_args$args;
}
###################以上操做在nginx反向代理服務器上配置###################
九、ngx_cache_pure清除緩存模塊使用說明
說明:根據配置只容許192.168.21.0/24 IP段的主機才能夠清除URL緩存,如今我使用的客戶機IP是:192.168.21.130,有權限清除URL緩存。

一、瀏覽圖片文件:http://www.osyunwei.com/images/nopic.gif

二、清除這個文件緩存:http://www.osyunwei.com/purge/images/nopic.gif

提示:Successful purge,緩存文件清除成功,若是這個文件沒有被緩存過,則提示:404 Not Found

備註:
一、purge是ngx_cache_pure 模塊指令
二、images/nopic.gif 是要清除的緩存文件URL路徑

至此,使用Nginx反向代理和proxy_cache緩存功能配置CDN服務器教程結束。

附件:

一、nginx配置文件/usr/local/nginx/conf/nginx.conf

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
user www www;
worker_processes 2;
# error_log logs/error.log;
# error_log logs/error.log notice;
# error_log logs/error.log info;
#pid logs/nginx.pid;
 
events {
use epoll;
worker_connections 65535;
}
 
http {
include proxy.conf;
include mysvrhost.conf;
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;
 
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 300m;
sendfile on;
tcp_nopush on;
 
#keepalive_timeout 0;
keepalive_timeout 60;
tcp_nodelay on;
server_tokens off;
 
gzip on;
gzip_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;
 
server {
listen 80 default ;
server_name _;
location / {
root html;
return 404;
}
location ~ /.ht {
deny all;
}
}
include vhost/*.conf;
}

二、被代理服務器列表文件/usr/local/nginx/conf/mysvrhost.conf

?
1
2
3
upstream osyunweihost {
server 192.168.21.129:80 weight=1 max_fails=2 fail_timeout=30s;
}

三、proxy_cache參數配置文件/usr/local/nginx/conf/proxy.conf

?
1
2
3
4
5
6
7
8
9
10
11
12
proxy_temp_path /home/proxy_temp_dir;
proxy_cache_path /home/proxy_cache_dir levels=1:2 keys_zone=cache_one:500m inactive=1d max_size=30g;
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_temp_file_write_size 128k;
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
proxy_cache cache_one;

四、虛擬主機配置文件/usr/local/nginx/conf/vhost/www.osyunwei.com.conf

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
server {
listen 80;
server_name www.osyunwei.com osyunwei.com;
location /
{
proxy_pass http: //osyunweihost;
proxy_cache_key $host$uri$is_args$args ;
proxy_set_header Host $host ;
proxy_set_header X-Forwarded-For $remote_addr ;
proxy_cache_valid 200 304 12h;
expires 2d;
}
 
location ~ /purge(/.*)
{
allow 127.0.0.1;
allow 192.168.21.0/24;
deny all;
proxy_cache_purge cache_one $host$1$is_args$args ;
}
 
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: //osyunweihost;
}
access_log off;
}

擴展閱讀:
#################################################################
nginx修改版本等信息
vi /usr/local/src/nginx-1.0.12/src/core/nginx.h #編譯前編輯
#define nginx_version
#define NGINX_VERSION
#define NGINX_VER
#define NGINX_VAR
修改上面的信息,便可更改nginx顯示版本。
vi /usr/local/src/http/ngx_http_special_response.c #編譯前編輯
static u_char ngx_http_error_full_tail[] =
static u_char ngx_http_error_tail[] =
修改上面的信息爲你本身的。
#################################################################


 


其餘解決方案:
拋棄Nginx使用nodejs作反向代理服務器

 時下很多場景,都是申請一個 VPS 主機來託管運行 Web 項目的,小弟我也不例外,購買了一個小型的 Win 03 VPS 使用着。在使用的過程當中,面臨一個問題,就是同一類型的服務端環境還好——但若是是一個 PHP、一個 ASP、 一個 JSP 的三種類型的服務端項目並存着,該怎麼分配惟一的 80 端口呢?由於商業 WWW 網站的話,每每只能佔用 80  端口,——固然,若是隻是作服務的話,如接口之類的,使用其餘端口就不會與 80 端口衝突了。許多開發者都會面臨到 80 端口這個問題,而且實際狀況會受到成本的限制。由於單獨爲一個項目就買一個 VPS,也不太經濟、不太合算,管理起來也不方便。因而,咱們就應該好好考慮一下,怎麼在提供一個 80 端口的狀況下,分發到多種服務端那裏去,讓不一樣的主機執行各自的 Web 項目。
親,那這項需求咱們說能夠實現嗎?是的,這並非什麼「神奇的技術」,也不是什麼複雜的技術。不知你是否有了解,網絡服務中的「反向代理(Reverse Proxy)」,其中的一個功能就是能夠完成端口的分發的。咱們不妨以域名爲路由分發:凡是 AA.com 域名請求的,分發到 PHP 82 端口執行;凡是 BB.com 域名請求的,分發到 ASP 83 端口執行;…… 如此類推。固然這裏的端口只說說明用而已,您能夠任意配置,反正就是從 80 端口接收回來的請求,先做一次處理,進而分發。反向代理,通俗地講,就是左手轉右手而已。
每當提起反向代理器,人們一般一想到的就是 Nginx,可是今天咱們暫時忽略大名鼎鼎的 Nginx,採用一樣也是使用單線程、事件循環的服務端小弟——Nodejs 來達成。首先 Node 採用 JS 做服務端編程,而不是 Nginx 寫配置或 Lua,比較符合個人味口,其次本身對 Node 也比較熟悉,配置各方面什麼的更爲順手。
完成該項功能的是 node-http-proxy 包。下載、安裝請鍵入:
?
1
npm install http-proxy
安裝完畢後,新建一個 proxy.js 文件,輸入:

var http = require( 'http' ), httpProxy = require( 'http-proxy' );
 
// 新建一個代理 Proxy Server 對象
var proxy = httpProxy.createProxyServer({});
 
// 捕獲異常
proxy.on( 'error' , function (err, req, res) {
  res.writeHead(500, {
  'Content-Type' : 'text/plain'
  });
  res.end( 'Something went wrong. And we are reporting a custom error message.' );
});
 
// 另外新建一個 HTTP 80 端口的服務器,也就是常規 Node 建立 HTTP 服務器的方法。
// 在每次請求中,調用 proxy.web(req, res config) 方法進行請求分發Create your custom server and just call `proxy.web()` to proxy
// a web request to the target passed in the options
// also you can use `proxy.ws()` to proxy a websockets request
//
var server = require( 'http' ).createServer( function (req, res) {
  // You can define here your custom logic to handle the request
  // and then proxy the request.
  var host = req.url;
  host = url.parse(host); host = host.host;
  
  console.log( "host:" + req.headers.host);
  console.log( "client ip:" + (req.headers[ 'x-forwarded-for' ] || req.connection.remoteAddress));
  
  proxy.web(req, res, { target: 'http://localhost:8080' });
});
 
console.log( "listening on port 80" )
server.listen(80);

若說使用代理服務器的代價,可能就是會比不用消耗多的資源,消耗多的 CPU 運算罷了。

使用問題:不能指定文件夾 proxy.web(req, res, { target: 'http://jb51.net:81/foo/' });

相關文章
相關標籤/搜索