Nginx反向代理缓存服务器构建

一:代理服务可简单的分为正向代理和反向代理:

正向代理:用于代理内部网络对Internet的连接请求(×××/NAT),客户端指定代理服务器,并将本来要直接发送给目标Web服务器HTTP请求先发送到代理服务器上然后由代理服务器去访问Web服务器,并将Web服务器的Response回传给客户端: 

反向代理:与正向代理相反,如果局域网向Internet提供资源,并让Internet上的其他用户可以访问局域网内资源也可以设置一个代理服务器它提供的服务就是反向代理反向代理服务器接受来自Internet的连接,然后将请求转发给内部网络上的服务器,并将Response回传给Internet上请求连接的客户端。

1.     反向代理Reverse Proxy)方式是指以代理服务器来接受客户端的连接请求,然后将请求转发给网络上的web服务器(可能是apachenginxtomcatiis等),并将从web服务器上得到的结果返回给请求连接的客户端。

2.     反向代理的作用:

保护网站的安全、通过配置缓存功能加速web请求、实现负载均衡

 

二、什么是nginx

1.Nginx简介:

Nginx是一款轻量级的网页服务器、反向代理器以及电子邮件代理服务器。因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。

它是由俄罗斯程序员IgorSysoev所开发的。起初是供俄国大型的门户网站及搜索引擎Rambler(俄语:Рамблер)使用。此软件BSD-like协议下发行,可以在UNIXGNU/LinuxBSDMac OSXSolaris,以及Microsoft Windows等操作系统中运行。

3.     Nginx的核心特点:

跨平台、配置异常简单、非阻塞、高并发连接、事件驱动、master/worker结构、内存消耗小、内置的健康检查功能、节省带宽、稳定性高。

三、Nginx+apache构筑Web服务器集群的负载均衡

nginx配置反向代理

配置nginx作为反向代理和负载均衡,同时利用其缓存功能,将静态页面在nginx缓存,以达到降低后端服务器连接数的目的并检查后端web服务器的健康状况。

1、安装nginx

环境:

OS:centos7.2

nginx192.168.31.83

apache1:192.168.31.141

apache2:192.168.31.250

安装zlib-develpcre-devel等依赖包

[root@www ~]# yum -y install gcc  gcc-c++make libtool zlib  zlib-devel  pcre  pcre-devel  openssl  openssl-devel

注:

结合proxyupstream模块实现后端web负载均衡

使用proxy模块实现静态文件缓存

结合nginx默认自带的ngx_http_proxy_module模块 ngx_http_upstream_module模块实现后端服务器的健康检查,也可以使用第三方模块nginx_upstream_check_module

使用nginx-sticky-module扩展模块实现Cookie会话黏贴(保持会话)

使用ngx_cache_purge实现更强大的缓存清除功能

上面提到的2个模块都属于第三方扩展模块,需要提前下好源码,然后编译时通过--add-moudle=src_path一起安装。

安装nginx

[root@www ~]# groupadd www   #添加www

[root@www ~]# useradd -g www www -s/sbin/nologin  #创建nginx运行账户www并加入到www组,不允许www用户直接登录系统

#tar zxf nginx-1.10.2.tar.gz

#tar zxf ngx_cache_purge-2.3.tar.gz

#tar zxf master.tar.gz

# cd nginx-1.10.2/

[root@www nginx-1.10.2]# ./configure--prefix=/usr/local/nginx1.10 --user=www --group=www --with-http_stub_status_module--with-http_realip_module --with-http_ssl_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 --with-pcre --add-module=../ngx_cache_purge-2.3--with-http_flv_module --add-module=../nginx-goodies-nginx-sticky-module-ng-08a395c66e42

[root@www nginx-1.10.2]# make  && make install

注:nginx的所有模块必须在编译的时候添加,不能再运行的时候动态加载。

优化nginx程序的执行路径

[root@www nginx-1.10.2]# ln -s /usr/local/nginx1.10/sbin/nginx/usr/local/sbin/

[root@www nginx-1.10.2]# nginx -t

[root@www nginx-1.10.2]# mkdir -p/var/tmp/nginx/client

[root@www nginx-1.10.2]# chown -Rwww:www /var/tmp/nginx/

[root@www nginx-1.10.2]# nginx -t

nginx: the configuration file/usr/local/nginx1.10/conf/nginx.conf syntax is ok

nginx: configuration file/usr/local/nginx1.10/conf/nginx.conf test is successful

2、编写nginx服务脚本:

[root@www ~]# vi /etc/init.d/nginx内容如下:

#!/bin/bash

# chkconfig: 2345 99 20

# description: Nginx Service ControlScript

PROG="/usr/local/nginx1.10/sbin/nginx"

PIDF="/usr/local/nginx1.10/logs/nginx.pid"

case "$1" in

start)

netstat -anplt |grep ":80"&> /dev/null &&pgrep "nginx" &> /dev/null

if [ $? -eq0 ]

then

echo "Nginx service alreadyrunning."

else

    $PROG -t &> /dev/null

if [ $? -eq0 ] ; then

      $PROG

echo "Nginx service startsuccess."

else

    $PROG -t

fi

fi

  ;;

stop)

netstat -anplt |grep ":80"&> /dev/null &&pgrep "nginx" &> /dev/null

if [ $? -eq0 ]

then

kill -s QUIT $(cat $PIDF)

echo "Nginx service stopsuccess."

else

echo "Nginx service alreadystop"

fi

  ;;

restart)

   $0 stop

   $0 start

   ;;

status)

netstat -anplt |grep ":80"&> /dev/null &&pgrep "nginx" &> /dev/null

if [ $? -eq0 ]

then

echo "Nginx service isrunning."

else

echo "Nginx is stop."

fi

 ;;

reload)

netstat -anplt |grep ":80"&> /dev/null &&pgrep "nginx" &> /dev/null

if [ $? -eq0 ]

then

   $PROG -t &> /dev/null

if [ $? -eq0 ] ; then

kill -s HUP $(cat $PIDF)

echo "reload Nginx configsuccess."

else

     $PROG -t

fi

else

echo "Nginx service is notrun."

fi

   ;;

 *)

echo "Usage: $0{start|stop|restart|reload}"

exit 1

esac

[root@www ~]# chmod +x /etc/init.d/nginx

[root@www ~]# chkconfig --add nginx

[root@www ~]# chkconfignginx on

[root@www ~]# service  nginx start

Nginx service start success.

[root@www ~]# service  nginx status

Nginx service is running.

[root@www ~]# netstat -anpt | grep nginx

tcp        0     0 0.0.0.0:80             0.0.0.0:*               LISTEN      3977/nginx: master 

[root@www ~]# firewall-cmd --permanent--add-port=80/tcp

success

[root@www ~]# firewall-cmd --reload

Success

注:如果你想在已安装好的nginx上添加第三方模块,依然需要重新编译,但为了不覆盖你原有的配置,请不要make install,而是直接拷贝可执行文件:

# nginx–V

[[email protected]]#./configure--add-module=……   #你的第三方模块

[[email protected]] #make后不要make install,改为手动拷贝,先备份

[[email protected]] #cp /usr/local/nginx1.10/sbin/nginx/usr/local/nginx1.10/sbin/nginx.bak

[[email protected]] #cp objs/nginx /usr/local/nginx1.10/sbin/nginx

配置nginx反向代理:反向代理+负载均衡+健康探测

查看nginx加载的模块

[root@www ~]## nginx -V

nginx version: nginx/1.10.2

built by gcc 4.8.5 20150623 (Red Hat4.8.5-4) (GCC)

built with OpenSSL 1.0.1e-fips 11 Feb2013

TLS SNI support enabled

configure arguments:--prefix=/usr/local/nginx1.10 --user=www --group=www --with-http_stub_status_module--with-http_realip_module --with-http_ssl_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 --with-pcre--add-module=../ngx_cache_purge-2.3 --with-http_flv_module--add-module=../nginx-goodies-nginx-sticky-module-ng-08a395c66e42

nginx的所有模块必须在编译的时候添加,不能再运行的时候动态加载

3、nginx-sticky-module模块:

这个模块的作用是通过cookie黏贴的方式将来自同一个客户端(浏览器)的请求发送到同一个后端服务器上处理,这样一定程度上可以解决多个backend serverssession同步的问题 —— 因为不再需要同步,而RR轮询模式必须要运维人员自己考虑session同步的实现。

另外内置的ip_hash也可以实现根据客户端IP来分发请求,但它很容易造成负载不均衡的情况,而如果nginx前面有CDN网络或者来自同一局域网的访问,它接收的客户端IP是一样的,容易造成负载不均衡现象。nginx-sticky-modulecookie过期时间,默认浏览器关闭就过期。

这个模块并不合适不支持 Cookie 或手动禁用了cookie的浏览器,此时默认sticky就会切换成RR。它不能与ip_hash同时使用。

4、load-balance其它调度方案:

nginx的负载均衡模块支持的其它调度算法:轮询(默认)、ip_hashleast_conn

url_hashfair

 

5、负载均衡与健康检查:

nginx自带是没有针对负载均衡后端节点的健康检查的,但是可以通过默认自带的ngx_http_proxy_module模块和ngx_http_upstream_module模块中的相关指令来完成当后端节点出现故障时,自动切换到下一个节点来提供访问。

6、nginx的proxy缓存使用:

缓存也就是将jscssp_w_picpath等静态文件从后端服务器缓存到nginx指定的缓存目录下,既可以减轻后端服务器负担,也可以加快访问速度,但这样缓存及时清理成为了一个问题,所以需要ngx_cache_purge这个模块来在过期时间未到之前,手动清理缓存。

proxy模块中常用的指令时proxy_passproxy_cache.

nginxweb缓存功能的主要是由proxy_cachefastcgi_cache指令集和相关指令集完成,proxy_cache指令负责反向代理缓存后端服务器的静态内容,fastcgi_cache主要用来处理FastCGI动态进程缓存

清除缓存:

上述配置的proxy_cache_purge指令用于方便的清除缓存,但必须按照第三方的ngx_cache_purge模块才能使用

使用ngx_cache_purge模块清除缓存(直接删除缓存目录下的文件也算一种办法):

GET方式请求URL

即使用配置文件中的location ~ /purge(/.*)

浏览器访问http://192.168.31.83/purge/your/may/path来清除缓存

备注:
      1purgengx_cache_pure模块指令
      2your/may/path是要清除的缓存文件URL路径

扩展知识1:
nginx修改版本等信息
1vi/usr/local/src/nginx-1.0.12/src/core/nginx.h   #编译前编辑
#define nginx_version
#define NGINX_VERSION
#define NGINX_VER
#define NGINX_VAR
修改上面的信息,即可更改nginx显示版本。
2vi/usr/local/src/nginx-1.0.12/src/http/ngx_http_special_response.c   #编译前编辑
static u_charngx_http_error_full_tail[] =
static u_charngx_http_error_tail[] =
修改上面的信息为你自己的。
3vi/usr/local/src/nginx-1.0.12/src/http/ngx_http_header_filter_module.c   #编译前编辑
static char ngx_http_server_string[]=
修改上面的信息为你自己的。
4、编译完成之后,修改/usr/local/nginx/conf目录下面
fastcgi.conffastcgi.conf.defaultfastcgi_paramsfastcgi_params.default
这四个文件里面的版本名称
/usr/local/nginx/sbin/nginx -V  #查看nginx版本号