NGX作为一款优秀的反向代理软件,凭借其在高并发下的出色表现,首先被越来越多的用户使用。丹尼尔的博客地址张艳是国内最早研究Nginx的人。但是随着需求的发展,nginx的功能不再只是一个反向代理,现在更倾向于做一个web容器。
Nginx从0.7.48版本开始支持类似Squid的缓存。Nginx的Web缓存服务主要由proxy_cache相关指令集和FastCGI_cache相关指令集组成。前者用于使用反向代理时缓存后端内容源服务器,后者主要用于缓存fastcgi的动态程序。两者功能基本相同。从Nginx0.8.32版本开始,proxy_cache和fastcgi_cache进行了改进,配合第三方ngx_cache_purge模块(用于清除指定URL的缓存),性能不亚于squid的。更重要的是,你可以同时拥有高性能的web缓存服务器和反向代理服务器,两全其美的快感自然不言而喻!
先看环境:
hadoop1.updb.comnginx服务器
hadoop2.updb.com192.168.0.102Tomcat服务器
hadoop3.updb.com192.168.0.103Tomcat服务器
hadoop4.updb.com192.168.0.104Tomcat服务器
hadoop5.updb.com192.168.0.105Tomcat服务器
*** 作系统:
摘录
Nginx版本:
Nginx-1.7.6.tar.gz,编译安装用源代码。
X_cache_purge版本:
ngx_cache_purge-2.1.tar.gz
Tomcat版本:
apache-tomcat-7.0.56.tar.gz
JDK版本:
jdk-7u60-linux-x64.rpm
最终架构:
在弄清楚架构之后,我们开始一步一步地实现它:
1.安装jdk+tomcat
2.在hadoop3、hadoop4和hadoop5上安装jdk
rpm -ivh jdk-7u60-linux-x64.rpm配置环境变量
[root@hadoop2 ~]# cat .bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin export JAVA_HOME=/usr/java/jdk1.7.0_60 export JRE_HOME=/usr/java/jdk1.7.0_60/jre export CLASSPATH=./:/usr/java/jdk1.7.0_60/lib:/usr/java/jdk1.7.0_60/jre/lib export PATH使环境变量生效,并验证java环境已成功安装。
[root@hadoop2 ~]# . .bash_profile [root@hadoop2 ~]# java -version java version "1.7.0_60" Java(TM) SE Runtime Environment (build 1.7.0_60-b19) Java HotSpot(TM) 64-Bit Server VM (build 24.60-b09, mixed mode)2.在hadoop3、hadoop4和hadoop5上安装tomcat,在webapps下创建测试目录shop和测试文件hadoop.html和test.jsp。测试文件的内容是每个tomcat节点的主机名和IP地址,方便以后测试负载均衡
将tomcat的bin目录配置为环境变量,使更改生效,并启动tomcat。
## 设置环境变量 [root@hadoop2 ~]# cat .bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin:/opt/apache-tomcat-7.0.56/bin export JAVA_HOME=/usr/java/jdk1.7.0_60 export JRE_HOME=/usr/java/jdk1.7.0_60/jre export CLASSPATH=./:/usr/java/jdk1.7.0_60/lib:/usr/java/jdk1.7.0_60/jre/lib export PATH ## 使设置生效 [root@hadoop2 ~]# . .bash_profile ## 启动tomcat [root@hadoop2 ~]# startup.sh Using CATALINA_BASE: /opt/apache-tomcat-7.0.56 Using CATALINA_HOME: /opt/apache-tomcat-7.0.56 Using CATALINA_TMPDIR: /opt/apache-tomcat-7.0.56/temp Using JRE_HOME: /usr/java/jdk1.7.0_60/jre Using CLASSPATH: /opt/apache-tomcat-7.0.56/bin/bootstrap.jar:/opt/apache-tomcat-7.0.56/bin/tomcat-juli.jar Tomcat started.测试tomcat是否正常工作,在浏览器中访问,测试页面可以正常显示,说明工作正常。
3、4、5节点安装上述方法,注意将测试文件中的内容改为自己的主机名和IP地址。
2.安装nginx+ngx_cache_purge
首先下载nginx-1.7.6.tar.gz,ngx_cache_purge-2.1.tar.gz到hadoop1服务器。首先安装ngx-cache_purge,解压tar包即可。
[root@hadoop1 pub]# tar xf ngx_cache_purge-2.1.tar.gz -C /opt/nginx安装过程中,需要编译ngx_cahce_purge模块。
[root@hadoop1 pub]# tar xf nginx-1.7.6.tar.gz -C /opt/ [root@hadoop1 pub]# cd /opt/nginx-1.7.6/ [root@hadoop1 pub]# ./configure --user=www --group=www --add-module=/opt/ngx_cache_purge-2.1 --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module [root@hadoop1 pub]# make && make install关于nginx的源代码安装,比较简单。如果在过程中遇到问题,可以去网上找找答案。也可以在下面留言,一起讨论。
为了便于管理,为nginx编写服务脚本。
[root@hadoop1 ~]# vi /etc/init.d/nginx #!/bin/bash # #chkconfig: - 85 15 #description: this script use to manage nginx process. # #set -x . /etc/rc.d/init.d/functions procnum=`ps -ef |grep "/usr/local/nginx/sbin/nginx"|grep -v "grep"|wc -l` start () { if [ "$procnum" -eq 1 -a -f /usr/local/nginx/logs/nginx.pid ]; then echo -n "Starting nginx:" success echo else /usr/local/nginx/sbin/nginx if [ "$?" -eq 0 ]; then echo -n "Starting nginx:" success echo else echo -n "Starting nginx:" failure echo exit 4 fi fi } stop () { if [ "$procnum" -eq 1 -a -f /usr/local/nginx/logs/nginx.pid ]; then /usr/local/nginx/sbin/nginx -s stop if [ "$?" -eq 0 ]; then echo -n "Stopping nginx:" success echo else echo -n "Stopping nginx:" failure echo exit 3 fi else echo -n "Stopping nginx:" success echo fi } case $1 in start) start ;; stop) stop ;; restart) stop sleep 1 start ;; reload) if [ "$procnum" -eq 1 -a -f /usr/local/nginx/logs/nginx.pid ]; then /usr/local/nginx/sbin/nginx -s reload else echo "nginx is not running!please start nginx first..." exit 2 fi ;; status) if [ "$procnum" -eq 1 -a -f /usr/local/nginx/logs/nginx.pid ]; then echo "nginx is running..." else echo "nginx is not running..." fi ;; *) echo "Usage : nginx [ start|stop|reload|restart|status ]" exit 1 ;; esac然后授予脚本可执行权限,加入chkconfig引导自启动,测试。
[root@hadoop1 ~]# chmod +x /etc/init.d/nginx [root@hadoop1 ~]# chkconfig nginx on [root@hadoop1 ~]# /etc/init.d/nginx start Starting nginx: [ OK ] [root@hadoop1 ~]# /etc/init.d/nginx status nginx is running... [root@hadoop1 ~]# /etc/init.d/nginx stop Stopping nginx: [ OK ]3.配置nginx实现反向代理和web缓存。
[root@hadoop1 ~]# vi /usr/local/nginx/conf/nginx.conf user www www; worker_processes 8; error_log /usr/local/nginx/logs/error.log crit; pid /usr/local/nginx/logs/nginx.pid; ## events { use epoll; worker_connections 65535; } http { include mime.types; default_type application/octet-stream; access_log /usr/local/nginx/logs/access.log; charset utf-8; sendfile on; tcp_nopush on; keepalive_timeout 60; client_body_buffer_size 512k; proxy_connect_timeout 5; proxy_read_timeout 60; proxy_send_timeout 5; proxy_buffer_size 16k; proxy_buffers 4 64k; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 128k; 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; ## 设置缓存临时目录 proxy_temp_path /data/proxy_temp_dir; ## 设置缓存目录,并设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。 proxy_cache_path /data/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g; ## 设置代理的后端tomcat集群 upstream web_server { server 192.168.0.102:8080 weight=1 max_fails=2 fail_timeout=30s; server 192.168.0.103:8080 weight=1 max_fails=2 fail_timeout=30s; server 192.168.0.104:8080 weight=1 max_fails=2 fail_timeout=30s; server 192.168.0.105:8080 weight=1 max_fails=2 fail_timeout=30s; } server { listen 80; ## nginx监听端口 server_name 192.168.0.101; ## 设置nginx的主机名或IP地址 root html; ## nginx站点的根目录 index index.html index.htm index.jsp; location / { proxy_pass http://web_server; ## 这里设置要代理的集群名称 proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; # 如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移 proxy_next_upstream http_502 http_504 error timeout invalid_header; proxy_cache cache_one; # 对不同的HTTP状态码设置不同的缓存时间 proxy_cache_valid 200 304 12h; # 以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内 proxy_cache_key $host$uri$is_args$args; } ## 用于清除缓存,访问http://192.168.0.101/purge/shop/hadoop.html来清除http://192.168.0.101/shop/hadoop.html的页面缓存 location ~ /purge(/.*) { allow 127.0.0.1; allow 192.168.0.0/16; deny all; proxy_cache_purge cache_one $host$1$is_args$args; } ## 扩展名以.php、.jsp、.cgi、.jhtml结尾的动态应用程序不缓存。 location ~ .*\.(php|jsp|cgi|jhtml)?$ { proxy_pass http://web_server; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_cache cache_one; proxy_cache_valid 200 304 12h; proxy_cache_key $host$uri$is_args$args; } ## 关闭访问日志 access_log off; } }然后重启nginx。
[root@hadoop1 ~]# /etc/init.d/nginx restart Stopping nginx: [ OK ] Starting nginx: [ OK ]4.效果测试
测试静态页面的负载均衡和缓存,第一次访问http://192.168.0.101/shop/Hadoop.html。
然后清空缓存,再次访问http://192.168.0.101/shop/Hadoop.html。
可以看到,在第一次访问时,请求是通过nginx的反向代理转发给hadoop2上的tomcat的。而且,对于这个请求,nginx已经成功缓存在静态页面中。当缓存清空后,请求会通过再次访问同一个地址转发给hadoop3上的tomcat,说明已经达到了负载均衡。
为了测试图片是否可以缓存,我第一次访问了http://192.168.0.101/shop/QQ.jpg
可以看出nginx的上述配置已经成功缓存到图片和静态页面。让我们测试一下动态页面是否可以缓存。
访问192.168.0.101/shop/test.jsp,发现页面内容每次刷新都会发生变化,说明请求是在后端tomcat集群上轮询的,没有缓存,说明动态程序没有未缓存。吹扫也可用于验证,如下所示:
说明nginx中没有缓存动态程序,验证了上面nginx的配置文件是正确的。目前为止,已经实现了nginx反向代理后端的tomcat集群实现负载均衡,同时使用proxy_cache缓存网站静态文件,一举两得!
5.摘要
从上面的配置可以看出,使用nginx作为反向代理和web缓存是如此的容易和强大。关键是在满足需求时,缓存层(如squid)不单独使用,降低了运维成本。此外,当系统出现故障时,可以快速定位故障点。当应用不可用时,只需要访问后端的tomcat和nginx,就可以确定问题发生在哪一层。而且在性能上,Nginx比Squid更好的利用了多核CPU。此外,Nginx在反向代理、负载均衡、健康检查、后端服务器故障转移、重写、易用性等方面比Squid强大得多 。考虑用nginx代替你的鱿鱼。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)