Tomcat Nginx cluster note

nginx install

需要先装pcre, zlib,前者为了重写rewrite,后者为了gzip压缩。

5.安装nginx

Nginx 一般有两个版本,分别是稳定版和开发版,您可以根据您的目的来选择这两个版本的其中一个,下面是把 Nginx安装到 /usr/local/nginx 目录下的详细步骤:

cd /usr/local/

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

tar -zxvf nginx-1.2.8.tar.gz

cd nginx-1.2.8

./configure --prefix=/usr/local/nginx

make

make install

--with-pcre=/usr/src/pcre-8.21 指的是pcre-8.21 (解压后的文件路径)的源码路径。

--with-zlib=/usr/src/zlib-1.2.7 指的是zlib-1.2.7 的源码路径。

6.启动

确保系统的 80 端口没被其他程序占用,

/usr/local/nginx/sbin/nginx

检查是否启动成功:

netstat -ano|grep 80 有结果输入说明启动成功

打开浏览器访问此机器的 IP,如果浏览器出现 Welcome to nginx! 则表示 Nginx 已经安装并运行成功。

7.重启

/usr/local/nginx/sbin/nginx –s reload

8.修改配置文件

cd /usr/local/nginx/conf

vi nginx.conf

9.常用配置

#nginx运行用户和组

user    www www;

#启动进程,通常设置成和cpu的数量相等

worker_processes  4;

#全局错误日志及PID文件

pid /var/run/nginx.pid;

error_log  /var/log/nginx/error.log;

events {

#epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能

use epoll;

#单个后台worker process进程的最大并发链接数

worker_connections  10240;

}

#设定http服务器,利用它的反向代理功能提供负载均衡支持

http {

include       mime.types;

default_type  application/octet-stream;

error_page 400 403 500 502 503 504  /50x.html;

index index.html index.shtml

autoindex off;

fastcgi_intercept_errors on;

sendfile        on;

# These are good default values.

tcp_nopush      on;

tcp_nodelay     off;

# output compression saves bandwidth

gzip  off;

#gzip_static on;

#gzip_min_length  1k;

gzip_http_version 1.0;

gzip_comp_level 2;

gzip_buffers  4 16k;

gzip_proxied any;

gzip_disable "MSIE [1-6]\.";

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

#gzip_vary on;

server_name_in_redirect off;

#设定负载均衡的服务器列表

upstream portals {

server 172.16.68.134:8082 max_fails=2 fail_timeout=30s;

server 172.16.68.135:8082 max_fails=2 fail_timeout=30s;

server 172.16.68.136:8082 max_fails=2 fail_timeout=30s;

server 172.16.68.137:8082 max_fails=2 fail_timeout=30s;

}

#upstream overflow {

#       server 10.248.6.34:8090 max_fails=2 fail_timeout=30s;

#       server 10.248.6.45:8080 max_fails=2 fail_timeout=30s;

#}

server {

#侦听8080端口

listen       8080;

server_name  127.0.0.1;

页面重定向地址

error_page  403 = http://www.e100.cn/ebiz/other/217/403.html;

error_page  404 = http://www.e100.cn/ebiz/other/218/404.html;

proxy_connect_timeout      90;

proxy_send_timeout         180;

proxy_read_timeout         180;

proxy_buffer_size 64k;

proxy_buffers 4 128k;

proxy_busy_buffers_size 128k;

client_header_buffer_size 16k;

large_client_header_buffers 4 64k;

#proxy_send_timeout         3m;

#proxy_read_timeout         3m;

#proxy_buffer_size          4k;

#proxy_buffers              4 32k;

proxy_set_header Host $http_host;

proxy_max_temp_file_size 0;

#proxy_hide_header Set-Cookie;

#       if ($host != 'www.e100.cn' ) {

#                rewrite ^/(.*)$ http://www.e100.cn/$1 permanent;

#       }

location / {

deny all;

}

location ~ ^/resource/res/img/blue/space.gif {

proxy_pass http://tecopera;

}

location = / {

rewrite ^(.*)$  /ebiz/event/517.html last;

}

location = /ebiz/event/517.html {

add_header Vary Accept-Encoding;

root /data/web/html;

expires 10m;

}

location = /check.html {

root /usr/local/nginx/html/;

access_log off;

}

location = /50x.html {

root /usr/local/nginx/html/;

expires 1m;

access_log off;

}

location = /index.html {

add_header Vary Accept-Encoding;

#定义服务器的默认网站根目录位置

root /data/web/html/ebiz;

expires 10m;

}

#定义反向代理访问名称

location ~ ^/ecps-portal/* {

# expires 10m;

#重定向集群名称

proxy_pass http://portals;

#proxy_pass http://172.16.68.134:8082;

}

location ~ ^/fetionLogin/* {

# expires 10m;

proxy_pass http://portals;

#proxy_pass http://172.16.68.134:8082;

}

#location  ~ ^/business/* {

#   # expires 10m;

#    proxy_pass http://172.16.68.132:8088;

#    #proxy_pass http://172.16.68.134:8082;

#}

location ~ ^/rsmanager/* {

expires 10m;

root /data/web/;

#proxy_pass http://rsm;

}

#定义nginx处理的页面后缀

location ~* (.*)\.(jpg|gif|htm|html|png|js|css)$  {

root /data/web/html/;

分钟

expires 10m;

}

#设定查看Nginx状态的地址

location ~* ^/NginxStatus/ {

stub_status on;

access_log off;

allow 10.1.252.126;

allow 10.248.6.49;

allow 127.0.0.1;

deny all;

}

#       error_page   405 =200 @405;

#       location @405

#       {

#                proxy_pass http://10.248.6.45:8080;

#       }

access_log  /data/logs/nginx/access.log combined;

error_log   /data/logs/nginx/error.log;

}

server {

listen       8082;

server_name  _;

location = /check.html {

root /usr/local/nginx/html/;

access_log off;

}

}

server {

listen       8088;

server_name  _;

location ~ ^/* {

root /data/web/b2bhtml/;

access_log off;

}

}

server {

listen       9082;

server_name  _;

#        location ~ ^/resource/* {

#            expires 10m;

#           root /data/web/html/;

#       }

location  / {

root /data/web/html/sysMaintain/;

if (!-f $request_filename) {

rewrite ^/(.*)$ /sysMaintain.html last;

}

}

}

}

==============================================================

<--avoid missing-->

管理 Servlet 的容器是 Context 容器,一个 Context 对应一个 Web 工程

<Context path="/projectOne " docBase="D:\projects\projectOne"
reloadable="true" />

Tomcat 增加一个 Web 工程时会增加一个Context ctx = new StandardContext();

Tomcat处理一个HTTP请求的过程
假设来自客户的请求为: http://localhost:8080/wsota/wsota_index.jsp 
1) 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得 
2) Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应 
3) Engine获得请求localhost/wsota/wsota_index.jsp,匹配它所拥有的所有虚拟主机Host 
4) Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机) 
5) localhost Host获得请求/wsota/wsota_index.jsp,匹配它所拥有的所有Context 
6) Host匹配到路径为/wsota的Context(如果匹配不到就把该请求交给路径名为""的Context去处理) 
7) path="/wsota"的Context获得请求/wsota_index.jsp,在它的mapping table中寻找对应的servlet 
8) Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类 
9) 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法 
10)Context把执行完了之后的HttpServletResponse对象返回给Host 
11)Host把HttpServletResponse对象返回给Engine 
12)Engine把HttpServletResponse对象返回给Connector 
13)Connector把HttpServletResponse对象返回给客户browser

location是nginx用来处理对同一个server不同的请求地址使用独立的配置的方式
location path
cat /usr/local/nginx/conf/nginx.conf

nginx.conf:
user mobileweb mobileweb;
worker_processes 8;
error_log /home/mobileweb/logs/nginx_error.log crit;
pid /usr/local/nginx/nginx.pid;
worker_rlimit_nofile 65535;

events
{
use epoll;
worker_connections 65535;
}

http
{
upstream backendjms #负载均衡
{
server 10.127.3.215:9250 max_fails=3 fail_timeout=20s;
server 192.168.8.1:3128 weight=5;
server 192.168.8.2:80 weight=1;
server 192.168.8.3:80 weight=6;
}
server {
listen 80 default_server;
server_name dcshi.com;
root www;
proxy_pass http://myserver;
location /break/ {
rewrite ^/break/(.*) /test/$1 break;
echo "break page";
}

location /last/ {
rewrite ^/last/(.*) /test/$1 last;
echo "last page";
}

location /test/ {
echo "test page";
}
}
}

语法规则: location [=|~|~*|^~] /uri/ { … }
= 开头表示精确匹配
^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
~ 开头表示区分大小写的正则匹配
~* 开头表示不区分大小写的正则匹配
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
/ 通用匹配,任何请求都会匹配到。
多个location配置的情况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,不必拘泥,仅供参考):
首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

rewrite的生效区块为sever, location, if
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
/download/eva/media/op1.mp3 ->/download/eva/mp3/op1.mp3
if ($host ~* ^www\.(cafeneko\.info)) {
set $host_without_www $1;
rewrite ^(.*)$ http://$host_without_www$1 permanent;
}
不想自动追加query string
rewrite ^/users/(.*)$ /show?user=$1? last;

sever区块中如果有包含rewrite规则,则会最先执行,而且只会执行一次
然后再判断命中哪个location的配置,再去执行该location中的rewrite
当该location中的rewrite执行完毕时
rewrite并不会停止
而是根据rewrite过的URL再次判断location并执行其中的配置
last和break最大的不同在于
- last会重新发起一个新请求,并重新匹配location
- break是终止当前location的rewrite检测,而且不再进行location匹配
– last是终止当前location的rewrite检测,但会继续重试location匹配并处理区块中的rewrite规则

location /download/ {
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
} //10 ->500

上一篇:git 教程(15)--分支管理策略


下一篇:Jmeter+Jenkins的聚合报告中添加QPS栏目显示