2014-02-11 11:46:01
来 源
ITJS.CN
Nginx
本文介绍Nginx+tomcatLVS群集的安装配置方法,希望对于初学Nginx服务器相关的朋友有帮助,更多Nginx安装、配置、报错处理等资源请本站内搜索。。

LVS群集   nginx+tomcat

项目拓扑图:

一.安装nginx + tomcat           

192.168.1.248和192.168.1.249服务器上如下配置:

1.  JDK的安装

将下载好的安装程序放到/soft目录下

cd /soft

chmod a+x jdk-6u23-linux-i586.bin

./jdk-6u23-linux-i586.bin

mkdir -p /data/conf

mv jdk1.6.0_23/ /data/conf/jdk

删除系统中旧的版本

rm -rf /usr/bin/java

rm -rf /usr/bin/javac

创建链接,设置新的版本

ln -s /data/conf/jdk/bin/java /usr/bin/java

ln -s /data/conf/jdk/bin/javac /usr/bin/javac

查看新的版本信息

java -version

javac -version

查看jdk版本是否是1.6.到此JDK已经安装完成

2. Tomcat安装

解压压缩文件

cd /soft

tar xzvf apache-tomcat-6.0.32.tar.gz

mv apache-tomcat-6.0.32 /data/conf/tomcat

cd /data/conf/tomcat/bin/ 

添加用户

useradd webuser -s /sbin/nologin

chown -R webuser:webuser /data/

tomcat优化选项

(1)添加tomcat管理员

# vi /usr/local/www/tomcat/conf/tomcat-users.xml

在<tomcat-users>  </tomcat-users>中间添加

<role rolename="manager"/>

<user username="tomcat" password="li147258369" roles="manager"/>

其中username="tomcat"为用户名password="li147258369"为密码

(2)修改JVM

JAVA_OPTS="-Xms1024m -Xmx1024m -Xmn256m -Djava.awt.headless=true"

(3)server.xml 参数修改

<Connector port="8080" protocol="HTTP/1.1"  

maxHttpHeaderSize="8192" useBodyEncodingForURI="true" 

maxThreads="600"      最大连接数 

redirectPort="8443" 

enableLookups="false"  禁用DNS查询

compression="on"  

compressionMinSize="2048"    压缩,压缩大小

compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"  

connectionTimeout="20000" 

disableUploadTimeout="true" 

/>

设置环境目录 

vi /etc/profile

TOMCAT_HOME=/data/conf/tomcat

JAVA_HOME=/data/conf/jdk

JRE_HOME=/data/conf/jdk/jre

export JAVA_HOME JRE_HOME  TOMCAT_HOME

备份tomcat配置文件

cd /data/conf/tomcat/conf

mv server.xml server.xml.bak

设置tomcat配置文件,配置虚拟主机

vi server.xml

在</Host>后面添加

<Host name="www.benet.com" unpackWARs="true" autoDeploy="true" appBase="webapps">

<Context path="" docBase="/data/web/www.benet.com" />

</Host>

<Host name="www.accp.com" unpackWARs="true" autoDeploy="true" appBase="webapps">

<Context path="" docBase="/data/web/www.accp.com" />

</Host>

<Host name="www.apache.com" unpackWARs="true" autoDeploy="true" appBase="webapps">

<Context path="" docBase="/data/web/www.apache.com" />

</Host>

启动tomcat

/data/conf/tomcat/bin/startup.sh

查看启动进程

ps -ef |grep tomcat

访问tomcat测试页,出现猫头网页,则安装成功!

links http://localhost:8080

3. 安装nginx

解压压缩文件

tar zxvf pcre-8.02.tar.gz

cd pcre-8.02/

编译安装

./configure

make && make install

tar zxvf nginx-0.8.50.tar.gz

cd nginx-0.8.50/

编译安装

./configure --prefix=/data/conf/nginx --with-http_stub_status_module

make && make install

配置nginx配置文件

cd /data/conf/nginx

备份nginx.conf配置文件

mv nginx.conf nginx.conf.bak

vi nginx.conf 

user nobody nobody;

worker_processes 4;

pid /data/conf/nginx/logs/nginx.pid;

worker_rlimit_nofile 51200;

events

{

use epoll;

worker_connections 51200;

}

http{

include       mime.types;

default_type application/octet-stream;

server_names_hash_bucket_size 128;

client_header_buffer_size 32k;

large_client_header_buffers 4 32k;

client_max_body_size 8m;

sendfile on;

tcp_nopush     on;

keepalive_timeout 60;

tcp_nodelay on;

fastcgi_connect_timeout 300;

fastcgi_send_timeout 300;

fastcgi_read_timeout 300;

fastcgi_buffer_size 64k;

fastcgi_buffers 4 64k;

fastcgi_busy_buffers_size 128k;

fastcgi_temp_file_write_size 128k;

gzip on;

gzip_min_length 1k;

gzip_buffers     4 16k;

gzip_http_version 1.0;

gzip_comp_level 2;

gzip_types       text/plain application/x-javascript text/css application/xml;

gzip_vary on;

upstream www

{

server 192.168.1.248:8080;

server 192.168.1.249:8080;

}

server {

listen 80;

server_name www.benet.com;

location / {

root /data/web/www.benet.com ;

index index.jsp index.htm index.html;

proxy_redirect off;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass http://www;

}

access_log /data/logs/benet.com/www.benet.access.log;

error_log /data/logs/benet.com/error-www.benet.com;

}

server {

listen 80;

server_name www.accp.com;

location / {

root /var/www ;

index index.jsp index.htm index.html;

proxy_redirect off;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass http://www;

}

access_log /data/logs/accp.com/www.accp.access.log;

error_log /data/logs/accp.com/error-www.accp.com;

}

server {

listen 80;

server_name www.apache.com;

location / {

root /data/web/www.apache.com ;

index index.jsp index.htm index.html;

proxy_redirect off;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass http://www;

}

access_log /data/logs/apache.com/www.apache.access.log;

error_log /data/logs/apache.com/error-www.apache.com;

}

}

检测配置文件是否存在错误

./nginx -t

启动nginx

创建项目目录

mkdir /data/web/www.benet.com

mkdir /data/web/www.accp.com

mkdir /data/web/www.apache.com

mkdir -p /data/logs/benet.com

mkdir -p /data/logs/accp.com

mkdir -p /data/logs/apache.com

建立测试网页

echo "This is benet home page !!!" > /data/web/www.benet.com/index.html

echo "This is accp home page !!! " > /data/web/www.accp.com/index.html

echo "This is apache home page !!!" > /data/web/www.apache.com/index.html

添加hosts记录

echo "192.168.1.248 www.benet.com" >> /etc/hosts

echo "192.168.1.248 www.accp.com" >> /etc/hosts

echo "192.168.1.248 www.apache.com" >> /etc/hosts

浏览测试网页,出现相应的网页,则配置完成。

links http://www.benet.com

links http://www.accp.com

links http://www.apache.com

2011年04月07日修改完成

4.  sersync 同步配置,使得网站项目文件一致。

在192.168.1.248服务器上安装rsync

tar xzvf rsync-3.0.7.tar.gz

cd rsync-3.0.7

./configure --prefix=/data/conf/rsync

make && make install

rpm -qa |grep rsync

rpm -qf /usr/bin/rsync

rpm -e rsync-2.6.8-3.1

ln -s /data/conf/rsync/bin/rsync /usr/bin/rsync

查看rsync版本

rsync -version

配置rsync配置文件

vi rsyncd.conf

port = 873

max connections = 4

pid file = /data/conf/rsync/rsync.pid

lock file = /data/conf/rsync/rsync.lock

log file = /data/conf/rsync/rsync.log

[dataweb]

path = /data/web

auth users = aa

secrets file = /data/conf/rsync/conf/rsync.passwd

uid = webuser

gid = webuser

read only = no

创建认证用户名和密码文件 

vi /data/conf/rsync/conf/rsync.passwd

aa:123456

启动rsync守护进程

rsync --daemon

配置sersync配置文件

vi confxml.xml

修改为<localpath watch="/data/web">

<remote ip="192.168.1.248" name="dataweb"/>

<!--<remote ip="192.168.8.39" name="tongbu"/>-->

<!--<remote ip="192.168.8.40" name="tongbu"/>-->

</localpath>

<rsync>

<commonParams params="-artuz"/>

<auth start="true" users="aa" passwordfile="/data/conf/rsync/conf/rsync.passwd"/>

<userDefinedPort start="false" port="873"/><!-- port=874 -->

<timeout start="true" time="100"/><!-- timeout=100 -->

<ssh start="false"/>

开启sersync守护进程

./sersync2 -d

测试文件是否同步

在192.168.1.249服务器上/data/web/目录下创建些文件

在192.168.1.248服务器上/data/web/目录下看是否同步有相应的文件

LVS群集配置

1.客户端 就是真实服务器

在192.168.1.248和249服务器环回接口上绑定 虚拟ip

vi /data/conf/realserver 

#!/bin/bash

#description : start realserver

VIP=192.168.1.100

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

case "$1" in

start)

echo " start LVS of REALServer"

/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up

echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore

echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce

echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore

echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

;;

stop)

/sbin/ifconfig lo:0 down

echo "close LVS Directorserver"

echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore

echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce

echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore

echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce

;;

*)

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

exit 1

esac

开启虚拟IP

cd /data/conf

./realserve start

查看虚拟IP

ip add  或者 ifconfig

192.168.1.246 lvs主机------------192.168.1.247 lvs备份机

1. 在1.246和247上安装 ipvsadm

yum -y install ipvsadm

2.             192.168.1.246 lvs主机安装keepalived

安装keepalived

cd /soft

tar xzvf keepalived-1.1.19_.tar.gz

./configure --prefix=/data/conf/keepalived

make

make install

创建keepalived目录

mkdir -p /etc/keepalived

创建keepalived.conf配置文件

! Configuration File for keepalived

global_defs {

notification_email {

[email protected]

}

notification_email_from [email protected]

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id LVS_DEVEL

}

# 20081013 written by :netseek

# VIP1

vrrp_instance VI_1 {

state MASTER             #备份服务器上将MASTER改为BACKUP  

interface eth0

virtual_router_id 51

priority 100   # 备份服务上将100改为99

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.1.100           #(如果有多个VIP,继续换行填写.)

}

}

virtual_server 192.168.1.100 80 {

delay_loop 6                  #(每隔10秒查询realserver状态)

lb_algo wrr                  #(lvs 算法)

lb_kind DR                  #(Direct Route)

persistence_timeout 60        #(同一IP的连接60秒内被分配到同一台realserver)

inhibit_on_failure            #当web挂掉的时候,前面请求的用户,可以继续打开页面,但是后面的请求不会调度到挂掉的web上面。

protocol TCP                #(用TCP协议检查realserver状态)

real_server 192.168.1.248 80 {

weight 3               #(权重)

TCP_CHECK {

connect_timeout 10       #(10秒无响应超时)

nb_get_retry 3

delay_before_retry 3

}

}

real_server 192.168.1.249 80 {

weight 1

TCP_CHECK {

connect_timeout 10

nb_get_retry 3

delay_before_retry 3

}

}

启动keepalived

cd /data/conf/keepalived/sbin

./keepalived -D

查看keepalived进程,是否有3个进程

ps -ef |grep keepalived

查看ipvsadm

ipvsadm -L -c

LVS群集测试:

设置hosts文件

192.168.1.100  www.benet.com

192.168.1.100 www.accp.com

192.168.1.100 www.apache.com

访问测试网页

http://www.benet.com

关闭LVS master主机,看是否还能访问测试网页不,如果能访问,则LVS配置成功了,若不行,则进行相应的排错啦.

本文出自 “fallenleaves” 博客,请务必保留此出处http://fallenleaves.blog.51cto.com/1383716/530901

Apache,tomcat,nginx,apache+tomcat,nginx+tomcat自动化安装脚本

#!/bin/bash

#Auto Install Apache Tomcat Nginx apache+tomcat nginx+tomcat.

#apache version: 2.2.17       download: http://httpd.apache.org/download.cgi#apache22

#jdk    version: 1.6          download: http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html

#tomcat version: 6.0.23       download: http://tomcat.apache.org/download-60.cgi

#nginx  version: 0.8.54       download: http://nginx.org/en/download.html

#执行这个自动化安装脚本需要把apache tomcat jdk nginx的安装包拷贝到/soft目录下.

#apache安装在/opt/conf/apache目录下. nginx安装在/opt/conf/nginx目录下.

#tomcat安装在/opt/conf/tomcat目录下. jdk安装在/opt/conf/jdk目录下.

# 20110413 write: liweizhong   e-mail:[email protected]  QQ:543302969  Version 1.1

IN_SRC=/soft

IN_DIR=/opt/conf

echo "=================Check software development environment.================" 

echo ""

rpm -q  gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel

zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel > /dev/null

if  [ "$?" != 0 ] ;

then

echo "Please check your need software"

exit 0

else

echo "software is OK !! "

fi

if [[ ! -d $IN_DIR ]]

  then

  mkdir -p $IN_DIR

fi

function apache_ins {

echo ""

echo "===========================Apache installing============================="

sleep 5

#Auto apache echo "installing httpd..."

cd $IN_SRC

tar jxvf httpd-2.2.17.tar.bz2

cd httpd-2.2.17

./configure --prefix=$IN_DIR/apache --with-mpm=worker --enable-rewrite --enable-deflate --disable-userdir --enable-so

[ $? != 0 ] && exit

make

[ $? != 0 ] && exit

make install

[ $? != 0 ] && exit

echo "Include conf/vhost.conf" >> $IN_DIR/apache/conf/httpd.conf

sed -i "s/#ServerName/ServerName localhost/g" $IN_DIR/apache/conf/httpd.conf

touch $IN_DIR/apache/conf/vhost.conf

$IN_DIR/apache/bin/apachectl start

echo "$IN_DIR/apache/bin/apachectl start" >> /etc/rc.local

${SERVICES}_ins

sleep 2

echo "==========================Auto Install  finished=========================="

}

function tomcat_ins {

echo ""

echo "===========================Tomcat installing============================="

sleep 5

#Auto Install JDK

cd /soft

chmod 700 jdk*

./jdk-6u23-linux-i586.bin

mv jdk1.6.0_23/ /opt/conf/jdk

rm -rf /usr/bin/java

rm -rf /usr/bin/javac

ln -s /opt/conf/jdk/bin/java /usr/bin/java

ln -s /opt/conf/jdk/bin/javac /usr/bin/javac

java -version

sleep 3

javac -version

echo ""

echo ""

echo "====================Auto Install JDK Have finished======================"

#Auto Install tomcat

sleep 5

cd /soft

tar xzvf apache-tomcat-6.0.32.tar.gz

mv apache-tomcat-6.0.32 /opt/conf/tomcat

cat >> /etc/profile << EFF

TOMCAT_HOME=/opt/conf/tomcat

JAVA_HOME=/opt/conf/jdk

JRE_HOME=/opt/conf/jdk/jre

PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$TOMCAT_HOME/bin/

export JAVA_HOME JRE_HOME  PATH TOMCAT_HOME

EFF

source /etc/profile

sleep 3

cd /opt/conf/tomcat/bin

./startup.sh

echo ""

echo ""

echo "=================Already all installation is complete================="

}

function nginx_ins {

echo ""

echo "===========================Nginx installing==========================="

sleep 5

#Auto nginx

echo "installing nginx..."

cd $IN_SRC

tar zxvf nginx-0.8.54.tar.gz

cd nginx-0.8.54

make_clean

useradd www

./configure --user=www --group=www  --prefix=$IN_DIR/nginx --without-http_rewrite_module --with-http_stub_status_module --with-http_ssl_module 

[ $? != 0 ] && exit

make

[ $? != 0 ] && exit

make install

[ $? != 0 ] && exit

/opt/conf/nginx/sbin/nginx

echo "$IN_DIR/nginx/sbin/nginx " >> /etc/rc.local

${SERVICES}_ins

sleep 3

echo "===============Auto Install finished================================="

}

echo "Slect install

1. apache

2. tomcat+jdk

3. nginx

4. apache+tomcat

5. nginx+tomcat

6. don't install is now

"

read -p "Please Input 1,2,3,4,5,6:" SERVER_ID

if [[ $SERVER_ID == 5 ]]; then

   SERVICE="nginx"

   SERVICES="tomcat"

elif [[ $SERVER_ID == 4 ]]; then

   SERVICE="apache"

   SERVICES="tomcat"

elif [[ $SERVER_ID == 3 ]]; then

   SERVICE="nginx"

elif [[ $SERVER_ID == 2 ]]; then

   SERVICE="tomcat"

elif [[ $SERVER_ID == 1 ]]; then

   SERVICE="apache"

else

echo ""

echo "Thanks bye!!"

exit

fi

${SERVICE}_ins

本文出自 “fallenleaves” 博客,请务必保留此出处http://fallenleaves.blog.51cto.com/1383716/545832

自动安装多个tomcat shell脚本

自动安装多个tomcat shell脚本

#!/bin/bash

#Auto Install JDK、tomcat and they connector.

#执行这个脚本需要在/soft目录下放好JDK、tomcat、的tar.gz源码包,

#以及已经执行过的jdk(本人无法做到在jdk执行时输入Enter和空格,所以这一步骤需要手动做。)

#tomcat安装到/data/conf/tomcat,已设置环境变量。

#JDv安装>/data/conf/jdk,已设置环境变量。

# 20110401 [email protected]  Version 1.0 write:fallenleaves QQ:543302969

echo "===========================Began installing============================="

if [ ! -d /opt/conf ]

then

mkdir -p /opt/conf

else

echo "This directory is already exists"

fi

#Auto Install JDK

cd /soft

chmod 700 jdk*

./jdk-6u24-linux-i586.bin

mv jdk1.6.0_24/ /opt/conf/jdk

rm -rf /usr/bin/java

rm -rf /usr/bin/javac

ln -s /opt/conf/jdk/bin/java /usr/bin/java

ln -s /opt/conf/jdk/bin/javac /usr/bin/javac

java -version

sleep 5

javac -version

echo ""

echo ""

echo "====================Auto Install JDK Have finished======================"

#Auto Install tomcat

for i in `seq 1 3`

do

mkdir -p /opt/conf/tomcat$i

cd /soft

tar xzvf apache-tomcat-7.0.12.tar.gz

mv apache-tomcat-7.0.12/*  /opt/conf/tomcat$i

cat >> /etc/profile << EFF

TOMCAT$i=/opt/conf/tomcat$i

EFF

done

cat >> /etc/profile << FFG

JAVA_HOME=/opt/conf/jdk

JRE_HOME=/opt/conf/jdk/jre

PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$TOMCAT1/bin:$TOMCAT2/bin:$TOMCAT3/bin/

export JAVA_HOME JRE_HOME  PATH TOMCAT1 TOMCAT2 TOMCAT3

FFG

source /etc/profile

本文出自 “fallenleaves” 博客,请务必保留此出处http://fallenleaves.blog.51cto.com/1383716/547974

nginx+tomcat负载均衡缓存服务器集群

根据公司的需求,以及以后的访问量,决定用nginx做负载均衡服务器和cache缓存服务器,后端用2台tomcat提供web服务,用户信息数据用oracle来存储,音频文件用一台单独的应用服务器来存储。下面是nginx和tomcat的配置信息,关于oracle的安装和配置请参考本博客的centos+oracle10g的安装文件说明来配置。

1、环境描述

nginx和tomcat1服务器地址:192.168.81.131

tomcat2服务器地址:192.168.81.128

tomcat3服务器地址:192.168.81.132

2、

Nginx从0.7.48版本开始,支持了类似Squid的缓存功能。这个缓存是把URL及相关组合当作Key,用md5编码哈希后保存在硬盘上,所以它可以支持任意URL链接,同时也支持404/301/302这样的非200状态码。虽然目前官方的Nginx Web缓存服务只能为指定URL或状态码设置过期时间,不支持类似Squid的PURGE指令,手动清除指定缓存页面,但是,通过一个第三方的Nginx模块,可以清除指定URL的缓存。

Nginx的Web缓存服务主要由proxy_cache相关指令集和fastcgi_cache相关指令集构成,前者用于反向代理时,对后端内容源服务器进行缓存,后者主要用于对FastCGI的动态程序进行缓存。两者的功能基本上一样。

最新的Nginx 0.8.32版本,proxy_cache和fastcgi_cache已经比较完善,加上第三方的ngx_cache_purge模块(用于清除指定URL的缓存),已经可以完全取代Squid。我们已经在生产环境使用了 Nginx 的 proxy_cache 缓存功能超过两个月,十分稳定,速度不逊于 Squid。

在功能上,Nginx已经具备Squid所拥有的Web缓存加速功能、清除指定URL缓存的功能。而在性能上,Nginx对多核CPU的利用,胜过Squid不少。另外,在反向代理、负载均衡、健康检查、后端服务器故障转移、Rewrite重写、易用性上,Nginx也比Squid强大得多。这使得一台Nginx可以同时作为“负载均衡服务器”与“Web缓存服务器”来使用。

(1)、Nginx 负载均衡与缓存服务器在 Linux 下的编译安装:

ulimit -SHn 65535

wget http://nginx.org/download/nginx-0.8.32.tar.gz

tar zxvf nginx-0.8.32.tar.gz

cd nginx-0.8.32/

./configure –user=www –group=www –add-module=../ngx_cache_purge-1.0 –prefix=/usr/local/webserver/nginx –with-http_stub_status_module –with-http_ssl_module

make && make install

cd ../

(2)、nginx完整的配置文件如下:

user  www www;

worker_processes 10;

error_log  /usr/local/webserver/nginx/logs/nginx_error.log  crit;

pid        /usr/local/webserver/nginx/nginx.pid;

#最大文件描述符

worker_rlimit_nofile 51200;

events

{

use epoll;

worker_connections 51200;

}

http

{

include       mime.types;

default_type  application/octet-stream;

keepalive_timeout 60;

tcp_nodelay on;

sendfile on;

server_names_hash_bucket_size 128;

client_header_buffer_size 32k;

large_client_header_buffers 4 32k;

client_max_body_size 300m;

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_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;

upstream tomcat

{

server  192.168.81.131:8080;

server  192.168.81.128:8080;

server  192.168.81.132:8080;

}

#注:proxy_temp_path和proxy_cache_path指定的路径必须在同一分区

proxy_temp_path /data0/proxy_temp_dir;

#设置Web缓存区名称为cache_one,内存缓存空间大小为50MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为10GB。

proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:50m inactive=1d max_size=10g;

server

{

listen       80;

server_name  tomcat.hxqm.com;

root  /data0/htdocs/tomcat;

index index.html index.htm index.jsp default.jsp index.do default.do;

 if (-d $request_filename)

 {

 rewrite ^/(.*)([^/])$ http://$host/$1$2/ last;

 }   

location /

 {

#如果后端的服务器返回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;

 proxy_set_header Host  $host;

 proxy_set_header X-Forwarded-For  $remote_addr;

 proxy_pass http://tomcat;

expires      1d;   

 #用于清除缓存,假设一个URL为http://tomcat.hxqm.com/docs/appdev/index.html,通过访问http://tomcat.hxqm.com/purge/docs/appdev/index.html就可以清除该URL的缓存。

 location ~ /purge(/.*)

 {

 allow 127.0.0.1;

 allow 192.168.81.0/24;

 deny  all;

 proxy_cache_purge cache_one $host$1$is_args$args;

 }

  #扩展名以.php、.jsp、.cgi结尾的动态应用程序不缓存。

 location ~ .*.(php|jsp|cgi)?$

 {

 proxy_set_header Host $host;

 proxy_set_header X-Forwarded-For $remote_addr;

 proxy_pass http://tomcat;

 }

location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$

 {

 expires      30d;

 }

location ~ .*.(js|css)?$

 {

 expires      1h;

 }  

log_format  tomcatlogs  ‘$remote_addr – $remote_user [$time_local] “$request” ‘

  ’$status $body_bytes_sent “$http_referer” ‘

  ’”$http_user_agent” $http_x_forwarded_for’;

 access_log  /data1/logs/tomcatlogs.log  tomcatlogs;

}

}

(3)、启动nginx服务,先测试nginx配置文件是否正确,用

/usr/local/webserver/nginx/sbin/nginx -t 测试

如果提示如下就说明配置文件没有问题可以启动nginx服务器了:

[[email protected] local]# /usr/local/webserver/nginx/sbin/nginx -t

the configuration file /usr/local/webserver/nginx/conf/nginx.conf syntax is ok

configuration file /usr/local/webserver/nginx/conf/nginx.conf test is successful

如果启动报错,你可以根据报错其实的行数来查看你的配置文件

3、tomcat的配置

把jdk文件和tomcat文件放在/usr/local/src目录下(各位习惯,可以自己定义)

(1)、安装jdk(本人装的jdk用的是jdk-6u17-linux-i586.bin)

cd /usr/local/src;chmod+x jdk-6u17-linux-i586.bin;./jdk-6u17-linux-i586.bin

在安装过程中敲几下空格,然后输入”yes”,然后中途中再按回车jdk就装好了。

做软连接:

ln -s /usr/local/jdk1.6.0_17/ /usr/local/jdk

(2)、java环境变量的配置

vi /etc/profile,把以下内容写到文件的尾部

JAVA_HOME=”/usr/local/jdk”

CLASS_PATH=”$JAVA_HOME/lib:$JAVA_HOME/jre/lib”

PATH=”.:$PATH:$JAVA_HOME/bin”

CATALINA_HOME=”/usr/local/tomcat”

export JAVA_HOME CATALINA_HOME

然后保存退出,执行 source /etc/profile 使刚才配置的环境变量生效或者也可以重启机器,自己选择适合自己的方式。

(3)、tomcat的配置

编辑tomcat的配置文件server.xml

在Hosts文件里面加上如下字段:

<Context path=”" docBase=”/data0/htdocs/tomcat/ROOT” debug=”0″ reloadable=”true” />

解释:tomcat默认回去”appBase”目录去查找要访问的文件,如果没有找到就去”docBase”目录去寻找。这个这段也可以不加,自己随意。

这是一台tomcat服务器的配置信息,其他两台一样,此处就不多说了。

(4)、启动tomcat服务

/usr/local/tomcat/bin/startup.sh

4、在本地的hosts文件里添加一条记录:

192.168.81.131 tomcat.hxqm.com

5、测试访问http://tomcat.hxqm.com,如果页面可以正常访问,说明nginx的代理和tomcat的服务都没有问题。

6、清除指定的URL缓存测试示例:

关键字: nginx+tomcat集群负载均衡

Nginx+tomcat 做负载均衡

架构描述

前端一台nginx服务器做负载均衡器,后端放N台tomcat组成集群处理服务,通过nginx转发到后面(注:没做动静分离,静态动态全部都转给tomcat)

优点:实现了可弹性化的架构,在压力增大的时候可以临时添加tomcat服务器添加到这个架构里面去

一,配置nginx

1,  下载包

2,  安装nginx包

a.安装pcre

tar zxvf pcre-7.2.tar.gz

cd pcre

 ./configure  --prefix = /pcre

 Make;make install

b,安装nginx

tar zxvf nginx-0.6.32.tar.gz

cd nginx-0.6.32

./configure  --prefix=/nginx –with-pcre=/pcre  --with-http_rewrite_module

Make;make install

3, 修改配置文件

Vi /nginx/conf/nginx.conf

#用户组

user nobody nobody;                 

#cpu个数,可以按照实际服务器来计算

worker_processes  8;                

worker_rlimit_nofile 51200;         

events {

use epoll;

#连接数

worker_connections  8192 ;      

}

http {

include       mime.types;

default_type  application/octet-stream;

server_names_hash_bucket_size 128;

#    access_log  off;

#    access_log  logs/access.log;

#缓存的时间,(可以根据不同文件设置不同时间)

#   expires           2h;      

tcp_nodelay on;

keepalive_timeout  30;      

gzip  on;

gzip_min_length  10;

gzip_buffers     4 8k;

gzip_http_version 1.1;

gzip_types       text/plain application/x-javascript text/css text/html application/xml;

sendfile         on;

tcp_nopush       on;

reset_timedout_connection  on;

client_max_body_size 30m; 

#设定负载均衡列表       

upstream  backend           

{                      

server   172.23.254.2:8080;   

server   172.23.254.3:8080;

}

#设定虚拟主机

server {

listen       80;

#对 / 所有做负载均衡 (本机nginx采用完全转发,所有请求都转发到后端的tomcat集群)

location / {       

root /web/www ;

index index.jsp index.htm index.html;

proxy_redirect         off;

#保留用户真实信息

proxy_set_header       Host $host;

proxy_set_header  X-Real-IP  $remote_addr;

proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass  http://backend;   

}

}

}

主要在配置proxy与upstream

Upstream具有负载均衡能力,可以自动判断下面的机器,并且自动踢出不能正常提供服务的机器。

4,启动程序

/nginx/sbin/nginx

5,编写启动脚本

Vi nginx.sh

#!/bin/sh

CWD=`pwd`

case $1 in

start)

/nginx/sbin/nginx;

;;

stop)

kill -2 `ps -ef|grep "/nginx/sbin/nginx"|grep -v "grep"|awk '{print $2}' `

;;

restart)

cd "$CMD"

$0 stop

$0 start

;;

*)

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

exit 1

esac

exit 0

二,配置tomcat

1,  下载tomcat5.59

tar zxvf tomcat5.59

2,修改配置文件

a,配置数据源

b,优化tomcat最大并发数

<Connector port="8080" maxHttpHeaderSize="8192"

maxThreads="2048" minSpareThreads="100" maxSpareThreads="200"

enableLookups="false" redirectPort="8443" acceptCount="500"

connectionTimeout="20000" disableUploadTimeout="true" />

c,添加虚拟主机

(注,主转发的虚拟主机必须用localhost,否则nginx不能通过内网ip转发,而只有通过域名转发

d,测试

                打开http://ip:8080

页面能访问则正常

2,  其他的tomcat服务器也用同样的配置

三,做tomcat集群

两台机器 172.23.254.2  172.23.254.3

做集群需要修改的文件配置有三个地方

1,修改conf/server.xml配置文件

a. 找到Engine标签,加入属性 jvmRoute="worker1"

b.找到Cluster标签,去掉注释,同时修改tcpListenAddress为本机ip 172.23.254.2 (注:这一段Cluster必须放在hosts里面)

2,  修改应用的web.xml

修改web应用里面WEB-INF目录下的web.xml文件,加入标签

<distributable/>

直接加在</web-app>之前就可以了

这个是加入tomcat的session复制的,做tomcat集群必须需要这一步,否则用户的session就无法正常使用。

3,  开启防火墙

这两个tomcat之间必须开启防火墙信任。

分别启动两个tomcat,查看每一个tomcat是否都启动了8080端口以及4001端口

再用netstat –an 查看链接情况

tcp        0      0 172.23.254.2:43320      172.23.254.3:4001      ESTABLISHED

tcp        0      0 172.23.254.2:46544      172.23.254.3:4001      TIME_WAIT  

tcp        0      0 172.23.254.2:40118      172.23.254.3:4001      ESTABLISHED

tcp        0      0 172.23.254.2:4001       172.23.254.3:48804     ESTABLISHED

tcp        0      0 172.23.254.2:4001       172.23.254.3:34254     ESTABLISHED

如果两台机器的4001端口分别建立了连接,则说明集群配置成功,可以进行session复制。

可能存在的问题

1,  session复制问题

以前用apache做负载均衡的时候,是选择了用 session sticky的模式,这样的话,用户每次进来都会是同一个服务器中的session,不会被转发到其他的服务器上。在这样的情况下,tomcat即使不做session复制也不会影响用户访问。但是nginx并不支持sticky功能。所以必须要做session复制。否则很多地方就根本没法用。比如登录过程,先等到了第一个tomcat上,产生了一个session,在刷新页面,刷到另外一个tomcat的机器上,没有这个session,就会出现问题了。所以程序员在写jsp的时候也要注意这一点

举个简单的例子,比如我们在单机应用情况下修改SESSION中用户的某一个数据,那么通常就是:

User user = (User)request.getSession().getAttribute(“user”);

User.setName(“my name”);

这样我们就是直接存取出来,然后进行修改,虽然在单机情况下没有问题,但是在集群条件下,这样就导致了多台WEB服务器上的SESSION不同步的问题,因为SESSION并没有改变,Tomcat无法监视session中某个数据的值是否发生了变化。因此,我们还需要执行如下操作以保证SESSION的同步:

Request.getSession().setAttribute(“user”, user);

所以,我们在操作SESSION的时候要特别注意!另外的建议就是,我们应该尽可能的不要修改SESSION中的数据。

可能经常会遇到session复制不正常的情况。除了在服务端找原因再也程序上找下原因。都是有可能导致session复制不正常的

2.页面同步

为确保后面tomcat的服务器上的页面程序是一致的,可以采用如下方式

a,rsync同步,或者做成页面按钮,提供给编辑,修改了程序即使点击同步

b,共享区域存储,或者采取drbd网络raid模式

3,确认nginx可以转发成功,

在nginx上wget一下后面转发的url(包过端口),如果可以打开,那就可以转发过去。如果不能打开,则无法转发

http://surpassdream.blog.51cto.com/1347340/544270

http://wgkgood.blog.51cto.com/

nginx rewrite 参数和例子

http://www.cnblogs.com/analyzer/articles/1377684.html

]

本位转自:http://blog.c1gstudio.com/archives/434

推荐参考地址:

Mailing list ARChives 官方讨论区

http://marc.info/?l=nginx

Nginx 常见应用技术指南[Nginx Tips]

http://bbs.linuxtone.org/thread-1685-1-1.html

本日志内容来自互联网和平日使用经验,整理一下方便日后参考。

正则表达式匹配,其中:

* ~ 为区分大小写匹配

* ~* 为不区分大小写匹配

* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配

文件及目录匹配,其中:

* -f和!-f用来判断是否存在文件

* -d和!-d用来判断是否存在目录

* -e和!-e用来判断是否存在文件或目录

* -x和!-x用来判断文件是否可执行

flag标记有:

* last 相当于Apache里的[L]标记,表示完成rewrite

* break 终止匹配, 不再匹配后面的规则

* redirect 返回302临时重定向 地址栏会显示跳转后的地址

* permanent 返回301永久重定向 地址栏会显示跳转后的地址

一些可用的全局变量有,可以用做条件判断(待补全)

$args

$content_length

$content_type

$document_root

$document_uri

$host

$http_user_agent

$http_cookie

$limit_rate

$request_body_file

$request_method

$remote_addr

$remote_port

$remote_user

$request_filename

$request_uri

$query_string

$scheme

$server_protocol

$server_addr

$server_name

$server_port

$uri

结合QeePHP的例子

if (!-d $request_filename) {

rewrite ^/([a-z-A-Z]+)/([a-z-A-Z]+)/?(.*)$ /index.php?namespace=user&amp;controller=$1&amp;action=$2&amp;$3 last;

rewrite ^/([a-z-A-Z]+)/?$ /index.php?namespace=user&amp;controller=$1 last;

break;

多目录转成参数

abc.domian.com/sort/2 => abc.domian.com/index.php?act=sort&name=abc&id=2

if ($host ~* (.*)/.domain/.com) {

set $sub_name $1;   

rewrite ^/sort//(/d+)//?$ /index.php?act=sort&cid=$sub_name&id=$1 last;

}

目录对换

/123456/xxxx -> /xxxx?id=123456

rewrite ^/(/d+)/(.+)/ /$2?id=$1 last;

例如下面设定nginx在用户使用ie的使用重定向到/nginx-ie目录下:

if ($http_user_agent ~ MSIE) {

rewrite ^(.*)$ /nginx-ie/$1 break;

}

目录自动加“/”

if (-d $request_filename){

rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;

}

禁止htaccess

location ~//.ht {

deny all;

}

禁止多个目录

location ~ ^/(cron|templates)/ {

deny all;

break;

}

禁止以/data开头的文件

可以禁止/data/下多级目录下.log.txt等请求;

location ~ ^/data {

deny all;

}

禁止单个目录

不能禁止.log.txt能请求

location /searchword/cron/ {

deny all;

}

禁止单个文件

location ~ /data/sql/data.sql {

deny all;

}

给favicon.ico和robots.txt设置过期时间;

这里为favicon.ico为99天,robots.txt为7天并不记录404错误日志

location ~(favicon.ico) {

log_not_found off;

expires 99d;

break;

}

location ~(robots.txt) {

log_not_found off;

expires 7d;

break;

}

设定某个文件的过期时间;这里为600秒,并不记录访问日志

location ^~ /html/scripts/loadhead_1.js {

access_log   off;

root /opt/lampp/htdocs/web;

expires 600;

break;

}

文件反盗链并设置过期时间

这里的return 412 为自定义的http状态码,默认为403,方便找出正确的盗链的请求

“rewrite ^/ http://leech.c1gstudio.com/leech.gif;”显示一张防盗链图片

“access_log off;”不记录访问日志,减轻压力

“expires 3d”所有文件3天的浏览器缓存

location ~* ^.+/.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {

valid_referers none blocked *.c1gstudio.com *.c1gstudio.net localhost 208.97.167.194;

if ($invalid_referer) {

rewrite ^/ http://leech.c1gstudio.com/leech.gif;

return 412;

break;

}

access_log   off;

root /opt/lampp/htdocs/web;

expires 3d;

break;

}

只充许固定ip访问网站,并加上密码

root  /opt/htdocs/www;

allow   208.97.167.194;

allow   222.33.1.2;

allow   231.152.49.4;

deny    all;

auth_basic "C1G_ADMIN";

auth_basic_user_file htpasswd;

将多级目录下的文件转成一个文件,增强seo效果

/job-123-456-789.html 指向/job/123/456/789.html

rewrite ^/job-([0-9]+)-([0-9]+)-([0-9]+)/.html$ /job/$1/$2/jobshow_$3.html last;

将根目录下某个文件夹指向2级目录

如/shanghaijob/ 指向 /area/shanghai/

如果你将last改成permanent,那么浏览器地址栏显是/location/shanghai/

rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;

上面例子有个问题是访问/shanghai 时将不会匹配

rewrite ^/([0-9a-z]+)job$ /area/$1/ last;

rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;

这样/shanghai 也可以访问了,但页面中的相对链接无法使用,

如./list_1.html真实地址是/area/shanghia/list_1.html会变成/list_1.html,导至无法访问。

那我加上自动跳转也是不行咯

(-d $request_filename)它有个条件是必需为真实目录,而我的rewrite不是的,所以没有效果

if (-d $request_filename){

rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;

}

知道原因后就好办了,让我手动跳转吧

rewrite ^/([0-9a-z]+)job$ /$1job/ permanent;

rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;

文件和目录不存在的时候重定向:

if (!-e $request_filename) {

proxy_pass http://127.0.0.1;

}

域名跳转

server

{

listen       80;

server_name  jump.c1gstudio.com;

index index.html index.htm index.php;

root  /opt/lampp/htdocs/www;

rewrite ^/ http://www.c1gstudio.com/;

access_log  off;

}

多域名转向

server_name  www.c1gstudio.com www.c1gstudio.net;

index index.html index.htm index.php;

root  /opt/lampp/htdocs;

if ($host ~ "c1gstudio/.net") {

rewrite ^(.*) http://www.c1gstudio.com$1 permanent;

}

三级域名跳转

if ($http_host ~* "^(.*)/.i/.c1gstudio/.com$") {

rewrite ^(.*) http://top.yingjiesheng.com$1;

break;

}

域名镜向

server

{

listen       80;

server_name  mirror.c1gstudio.com;

index index.html index.htm index.php;

root  /opt/lampp/htdocs/www;

rewrite ^/(.*) http://www.c1gstudio.com/$1 last;

access_log  off;

}

某个子目录作镜向

location ^~ /zhaopinhui {

rewrite ^.+ http://zph.c1gstudio.com/ last;

break;

}

discuz ucenter home (uchome) rewrite

rewrite ^/(space|network)-(.+)/.html$ /$1.php?rewrite=$2 last;

rewrite ^/(space|network)/.html$ /$1.php last;

rewrite ^/([0-9]+)$ /space.php?uid=$1 last;

discuz 7 rewrite

rewrite ^(.*)/archiver/((fid|tid)-[/w/-]+/.html)$ $1/archiver/index.php?$2 last;

rewrite ^(.*)/forum-([0-9]+)-([0-9]+)/.html$ $1/forumdisplay.php?fid=$2&page=$3 last;

rewrite ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)/.html$ $1/viewthread.php?tid=$2&extra=page/%3D$4&page=$3 last;

rewrite ^(.*)/profile-(username|uid)-(.+)/.html$ $1/viewpro.php?$2=$3 last;

rewrite ^(.*)/space-(username|uid)-(.+)/.html$ $1/space.php?$2=$3 last;

rewrite ^(.*)/tag-(.+)/.html$ $1/tag.php?name=$2 last;

给discuz某版块单独配置域名

server_name  bbs.c1gstudio.com news.c1gstudio.com;

location = / {

if ($http_host ~ news/.c1gstudio.com$) {

rewrite ^.+ http://news.c1gstudio.com/forum-831-1.html last;

break;

}

}

discuz ucenter 头像 rewrite 优化

location ^~ /ucenter {

location ~ .*/.php?$

{

#fastcgi_pass  unix:/tmp/php-cgi.sock;

fastcgi_pass  127.0.0.1:9000;

fastcgi_index index.php;

include fcgi.conf;     

}

location /ucenter/data/avatar {

log_not_found off;

access_log   off;

location ~ /(.*)_big/.jpg$ {

error_page 404 /ucenter/images/noavatar_big.gif;

}

location ~ /(.*)_middle/.jpg$ {

error_page 404 /ucenter/images/noavatar_middle.gif;

}

location ~ /(.*)_small/.jpg$ {

error_page 404 /ucenter/images/noavatar_small.gif;

}

expires 300;

break;

}

      }

jspace rewrite

location ~ .*/.php?$

{

 #fastcgi_pass  unix:/tmp/php-cgi.sock;

 fastcgi_pass  127.0.0.1:9000;

 fastcgi_index index.php;

 include fcgi.conf;     

}

location ~* ^/index.php/

{

rewrite ^/index.php/(.*) /index.php?$1 break;

 fastcgi_pass  127.0.0.1:9000;

 fastcgi_index index.php;

 include fcgi.conf;

}

声明: 此文观点不代表本站立场;转载须要保留原文链接;版权疑问请联系我们。