首页 > 代码库 > 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反向代理