首页 > 代码库 > nginx反向代理

nginx反向代理

说明:共需要3台虚拟机,202.207.178.6安装nginx,作为前端反向代理服务器,202.207.178.7和202.207.178.8作为后端服务器安装apache,提供web服务。


一、编译安装nginx

1、首先添加用户nginx,实现以之运行nginx服务进程

# groupadd -r -g 108 nginx

# useradd -r -g 108 -u 108 nginx

2、将下载好的软件包解压并安装(我这里是nginx-1.4.7.tar.gz)

# tar xf nginx-1.4.7.tar.gz

# cd nginx-1.4.7

接着开始编译和安装:

# ./configure \

--prefix=/usr \

--sbin-path=/usr/sbin/nginx \

--conf-path=/etc/nginx/nginx.conf \

--error-log-path=/var/log/nginx/error.log \

--http-log-path=/var/log/nginx/access.log \

--pid-path=/var/run/nginx/nginx.pid  \

--lock-path=/var/lock/nginx.lock \

--user=nginx \

--group=nginx \

--with-http_ssl_module \

--with-http_flv_module \

--with-http_stub_status_module \

--with-http_gzip_static_module \

--http-client-body-temp-path=/var/tmp/nginx/client/ \

--http-proxy-temp-path=/var/tmp/nginx/proxy/ \

--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \

--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \

--http-scgi-temp-path=/var/tmp/nginx/scgi \

--with-pcre \

--with-file-aio

# make && make install

报错时可能要求安装如下包,按需安装即可!

# yum -y install pcre-devel

# yum -y install gcc

# yum -y install openssl-devel

3、为nginx提供SysV init脚本:


新建文件/etc/rc.d/init.d/nginx,内容如下:

#!/bin/sh

#

# nginx - this script starts and stops the nginx daemon

#

# chkconfig:   - 85 15 

# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \

#               proxy and IMAP/POP3 proxy server

# processname: nginx

# config:      /etc/nginx/nginx.conf

# config:      /etc/sysconfig/nginx

# pidfile:     /var/run/nginx.pid

 

# Source function library.

. /etc/rc.d/init.d/functions

 

# Source networking configuration.

. /etc/sysconfig/network

 

# Check that networking is up.

[ "$NETWORKING" = "no" ] && exit 0

 

nginx="/usr/sbin/nginx"

prog=$(basename $nginx)

 

NGINX_CONF_FILE="/etc/nginx/nginx.conf"

 

[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

 

lockfile=/var/lock/subsys/nginx

 

make_dirs() {

  # make required directories

  user=`nginx -V 2>&1 | grep "configure arguments:" | sed ‘s/[^*]*--user=\([^ ]*\).*/\1/g‘ -`

  options=`$nginx -V 2>&1 | grep ‘configure arguments:‘`

  for opt in $options; do

  if [ `echo $opt | grep ‘.*-temp-path‘` ]; then

  value=http://www.mamicode.com/`echo $opt | cut -d"=" -f 2`

  if [ ! -d "$value" ]; then

  # echo "creating" $value

  mkdir -p $value && chown -R $user $value

  fi

  fi

  done

}

 

start() {

[ -x $nginx ] || exit 5

[ -f $NGINX_CONF_FILE ] || exit 6

make_dirs

echo -n $"Starting $prog: "

daemon $nginx -c $NGINX_CONF_FILE

retval=$?

echo

[ $retval -eq 0 ] && touch $lockfile

return $retval

}

 

stop() {

echo -n $"Stopping $prog: "

killproc $prog -QUIT

retval=$?

echo

[ $retval -eq 0 ] && rm -f $lockfile

return $retval

}

 

restart() {

configtest || return $?

stop

sleep 1

start

}

 

reload() {

configtest || return $?

echo -n $"Reloading $prog: "

killproc $nginx -HUP

RETVAL=$?

echo

}

 

force_reload() {

restart

}

 

configtest() {

 $nginx -t -c $NGINX_CONF_FILE

}

 

rh_status() {

status $prog

}

 

rh_status_q() {

rh_status >/dev/null 2>&1

}

 

case "$1" in

start)

rh_status_q && exit 0

$1

;;

stop)

rh_status_q || exit 0

$1

;;

restart|configtest)

$1

;;

reload)

rh_status_q || exit 7

$1

;;

force-reload)

force_reload

;;

status)

rh_status

;;

condrestart|try-restart)

rh_status_q || exit 0

;;

*)

echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"

exit 2

esac


4、而后为此脚本赋予执行权限:

# chmod +x /etc/rc.d/init.d/nginx


5、添加至服务管理列表,并让其开机自动启动:

# chkconfig --add nginx

# chkconfig nginx on


6、而后就可以启动服务并测试了:

# service nginx start

二、配置反向代理

1、在前端服务器上提供访问页:

# mkdir /usr/html/forum

# vim /usr/html/forum/index.html

添加以下内容,表明是在nginx上:

<h1>Forum ON Nginx</h1>

http://202.207.178.6/forum/ 可以访问到此页面!

2、在后端服务器上提供web服务配置(202.207.178.7)

# yum -y install httpd

# cd /var/www/html/

# mkdir bbs

# cd bbs/

# vim index.html

添加如下内容:

<h1>Forum ON Backserver<h1>

# service httpd start

代理方式一:

Nginx通过proxy模块实现反向代理功能。在作为web反向代理服务器时,nginx负责接

        收客户请求,并能够根据URI、客户端参数或其它的处理逻辑将用户请求调度至上游服

        务器上。nginx在实现反向代理功能时的最重要指令为proxy_pass,它能够将location

        定义的某URI代理至指定的上游服务器(组)上。如下面的示例中,location的/forum将

        被替换为上游服务器上的/bbs

1)编辑前端服务器配置文件,添加反向代理相关内容,然后重启nginx服务,即可开

          始测试

# vim /etc/nginx/nginx.conf

在server段中添加如下内容

location /forum {

proxy_pass http://202.207.178.7/bbs;

}

# nginx -t

# service nginx restart

2)访问测试

此时访问 http://202.207.178.6/forum/

浏览器中会显示:Forum ON Backserver

代理方式二:

如果location的URI是通过模式匹配定义的,其URI将直接被传递至上游服务器,而不

        能为其指定转换的另一个URI

        例如下面示例中的/forum将被代理为http://202.207.178.7/forum。

1)编辑前端服务器配置文件,添加反向代理相关内容,然后重启nginx服务,在前端

         服务器上更改bbs为forum,即可开始测试

        # vim /etc/nginx/nginx.conf

在server段中添加如下内容

   location ~* /forum {

proxy_pass http://202.207.178.7;

}

# nginx -t

# service nginx restart

2)后端(202.207.178.7):

# mv bbs/ forum

3、使后端服务器能够记录客户端地址,而不是前端nginx地址

前端:

# vim /etc/nginx/nginx.conf

在此前定义的location中增加以下内容,以使客户端IP传送到后端服务器:

proxy_set_header X-Real-IP $remote_addr;

# service nginx restart

后端(202.207.178.7):

# vim /etc/httpd/conf/httpd.conf

将日志格式改为以下内容:

LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

# service httpd restart

# tail /etc/httpd/logs/access_log

此时进行访问测试即可看到记录了客户端地址

4、将所有访问代理至后端:

注释掉原来的根

#location / {

#   root   html;

#    index  index.html index.htm;

#}

将自己定义的location改为根

location / {

proxy_pass http://202.207.178.7;

proxy_set_header X-Real-IP $remote_addr;

}

测试:http://202.207.178.6 即可发现访问到后端主机

5、使用Upstream实现对后端服务器的负载均衡(node1:202.207.178.7和             node2:202.207.178.8),并实现健康状况检查

说明:Nginx支持3种轮调算法:

round-robin:加权轮调(默认)

ip-hash:源地址哈希

least_conn:当前最少连接数

node1:

# vim /var/www/html/index.html

<h1>node1</node>

重启httpd服务

node2:

# vim /var/www/html/index.html

<h1>node2</node>

重启httpd服务

前端nginx:

# vim /etc/nginx/nginx.conf

此项必须在server段之外定义:

#max_fails=2 检查时最多允许错误次数

#fail_timeout=2 检查是否错误持续几秒

upstream webservers {

server 202.207.178.7 weight=1 max_fails=2 fail_timeout=2;

server 202.207.178.8 weight=1 max_fails=2 fail_timeout=2;

server 127.0.0.1:8080 backup;

}


location / {

proxy_pass http://webservers/;

proxy_set_header X-Real-IP $remote_addr;

}

定义错误页:

server {

listen 8080;

server_name localhost;

root /web/errorpages;

index index.html;

}

# mkdir -pv /web/errorpages

# vim /web/errorpages/index.html

sorry.........

此时便可重启nginx服务,访问:http://202.207.178.6,进行访问测试了!

6、在nginx本地使用缓存(使用proxy_cache_path不能定义在server中)

proxy_cache_path:

path:定义磁盘位置

levels=levels :定义缓存目录的子目录级别(包括目录级别及每级字符个

                    数,最多允许定义3级子目录)

keys_zone :用来存储键的区域

max_size: 定义磁盘空间大小(需要cache_manager模块根据LRU算法做页面

                 调度)

另外常用的3种缓存:

open_log_cache:日志缓存

open_file_cache:打开文件缓存

fastcgi_cache:fastcgi缓存

定义缓存:(前端)

# vim /etc/nginx/nginx.conf

proxy_cache_path /nginx/cache/first levels=1:2 keys_zone=first:20m max_size=1g;

   location / {

                proxy_pass http://webservers/;

                proxy_set_header X-Real-IP $remote_addr;

                proxy_cache first; #必须在server中启用此项,以说明使用缓存功能

proxy_cache_valid 200 10m; #表明对200这样的正确页缓存10分钟         }

# mkdir -pv /nginx/cache/first

# nginx -t

# service nginx restart

现在即可开始测试了!


至此,nginx常用的反向代理功能配置完毕!

                                   欢迎批评指正!

nginx反向代理