供参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考
花了整整一个礼拜时间,现在可以收官了,一来自己确实呆的可以,二来百度查到的资料千篇一律毫无价值,对那些作者强烈鄙视之。
再次强烈鄙视。
我的在官网下载,在windows下面跑。绿色,点击nginx.exe开始运行。进入conf目录打开nginx.conf文件编辑服务器所有的配置。非常简单。
linux环境还没跑出来。因为很简单的表达式都不能识别。可能需要重新安装nginx和pcre什么。
下面都是在windows跑的。版本是1.4.1
对于java应用nginx一般仅仅用作负载均衡,缓存会交给其他专用缓存服务器。nginx自带的缓存机制,可以看看这篇文章,据说完全可以替代squid
http://server.51cto.com/sCollege-189132.htm
nginx还有一个fastcgi模块,我的理解是,java应用用不着这个模块,php可以用,fastcgi是一种web服务器,用来处理页面,类似servlet等等,jsp可以交给servlet处理而交给fastcgi就难说了。
相关文章:
http://www.iteye.com/topic/20751
http://blog.sina.com.cn/s/blog_638e029a0100qu95.html
如果仅仅用作负载均衡,那么nginx.conf的配置就尤其简单了。
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
charset utf-8;
upstream tomcat_server {
server localhost:18002;
server localhost:18001;
#ip_hash;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://tomcat_server;
proxy_connect_timeout 1s;
proxy_next_upstream error timeout invalid_header http_404 http_502 http_503 http_504 http_500;
}
}
}
这一段配置意思是:server_name是请求地址,location表示对各种请求地址分别处理,可以有很多个location和很多个server。
location /表示匹配全部请求(优先级最低,其他的location都匹配不到才匹配这一个)。
proxy_pass表示讲这个请求转发到tomcat_server,对应上面的upstream负载均衡列表。
这里也可以写proxy_pass http://locathost:18002;等等。
如果是http://localhost:18002/CardHolderWeb/;这里最后要加/,nginx对/要求很严格。访问网址就应该是localhost。
这里如果location 后面是/efg/ ,这里前后都加/,访问网址应该是localhost/efg/CardHolderWeb。
意思是:访问网址包括三部分,server_name/location/app,由localhost找到server_name对应的server,由第二项efg找到对应的location,由proxy_pass找到后台服务器,最终得到实际的URL就是upstream下面的localhost:18002加上访问地址去除第一项server_name、第二项location的值。
另外,upstream下面貌似只能写地址+端口,否则nginx重启报错。
nginx在stop的时候检查nginx.conf文件,错误的话stop执行失败。
进入exe目录,
nginx -s stop停止
nginx -s reload重启
nginx启动
proxy_next_upstream error timeout invalid_header http_404 http_502 http_503 http_504 http_500;
表示故障自动转移。
一开始我后台tomcat里面两个CardHolderWeb是不一样的。跑出来每次都丢失了几个css、图片文件,原因是:加载jsp的顺序是第一步拿到jsp文件,也就是一堆源代码,然后再次多次访问服务器去取其中引用的链接,如css js 图片,在app1里面取到jsp后,又随机到另外一个app2去提取其中引用的css文件,而app2没有这个文件。
或者app2根本没有启动。
加上这一句故障转移就不用担心了。
proxy_connect_timeout 1s;
表示连接超时时间。默认好像60秒。如果app1里面没有找到文件,就会在那里转60秒才去app2找。
#ip_hash;
这句注释以后,登录就一般会出现验证码错误。因为初始页面app1的session保存了验证码,登录时到app2去找session。
所以ip_hash可以直截了当解决session问题。这个机制,就是根据访问ip将其每次都分配到同一台服务器。
如果nginx不能取得浏览器真实ip或者后端不是直接连接到tomcat,这个ip_hash就不一定能实现了。但是还有很多其他办法。memcache session manage(msn)很常用。
-----------------------------------------------------------------------------------------------------------------------
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
charset utf-8;
upstream tomcat_server {
server localhost:18002;
server localhost:18001;
#ip_hash;
}
server {
listen 80;
server_name localhost;
index index.html index.htm index.php;
root d:/tools/nginx/html;
#location / {
# proxy_pass http://tomcat_server;
# proxy_connect_timeout 1s;
# proxy_next_upstream error timeout invalid_header http_404 http_502 http_503 http_504 http_500;
#}
location ^~/e/ {#没有前缀会报500,请求/dd/a.jpg时
alias e:/;
index cc.html;
#root e:/;
}
location ~*\.jpg$ {
#请求的地址是不带http和localhost这些前缀的。会是/dd/a.jpg。前面带/
rewrite (((\w)*/)*)((\w)+(.jpg)) /e/$4 redirect;
}
}
}
index index.html index.htm index.php;
root d:/tools/nginx/html;
这里是配置默认访问地址,如请求地址localhost,会根据找到root目录,依次找index罗列的文件。我在d:/tools/nginx/html下面有index.html,所以这个地址会打开index.html。如果不配置这两句,访问时就报404类似。如果root目录下没有index罗列的文件,会报出403 forbidden。
alias e:/;
index cc.html;
访问localhost/e时会打开e:/cc.html。
alias和root不能同时使用。如果改成root e:/;打开的文件是e:/e/cc.html。
root与alias:alias的路径就是值。root的路径是值加上location后面的值。(后面要有/?)
这里指的都是访问地址去除第一项server_name、第二项location剩余的部分。
nginx除了配置负载均衡,还可以保存静态文件。比如取jsp引用的图片,这个文件要从tomcat到nginx再到浏览器,所以现在可以把图片复制到nginx主机,然后根据图片的访问地址加一个location,讲访问地址重定向到本地文件系统。这可不能叫做缓存。
如果要改这些图片,就要到nginx主机去改。这时候改app里面的图片是没有用的。
找不到文件重定向
location /testsession/img/ {
alias e:/hb/;
#if(!-e $request_filename) {
if (!-e $request_filename) {#上面的写法报错,另外这个if块要加在location里面
proxy_pass http://tomcat_server;
#return;#加return报错
}
}
如果e:/hb/下面找不到文件,pass到后台服务器去找。
假如访问地址是localhost/testsession/img/b.jpg,进入location后只有/b.jpg这一部分,经过alias后得到e:/hb/b.jpg。如果是root e:/hb/;会把/testsession/img/加上。如果没有/,得到值也不一样。
if的语法要去很严格。if和 ( 之间要保留空格,而 ( 和 ! 之间不能有空格,可能跟版本也有关系。
if (!-e $request_filename)
表示文件或目录找不到,$request_filename是全局变量,请求文件。
-f -d -e 分别表示文件、目录、文件或目录,!加在前面。
全局变量:
$args #这个变量等于请求行中的参数。
$content_length #请求头中的Content-length字段。
$content_type #请求头中的Content-Type字段。
$document_root #当前请求在root指令中指定的值。
$host #请求主机头字段,否则为服务器名称。
$http_user_agent #客户端agent信息
$http_cookie #客户端cookie信息
$limit_rate #这个变量可以限制连接速率。
$request_body_file #客户端请求主体信息的临时文件名。
$request_method #客户端请求的动作,通常为GET或POST。
$remote_addr #客户端的IP地址。
$remote_port #客户端的端口。
$remote_user #已经经过Auth Basic Module验证的用户名。
$request_filename #当前请求的文件路径,由root或alias指令与URI请求生成。
$query_string #与$args相同。
$scheme #HTTP方法(如http,https)。
$server_protocol #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr #服务器地址,在完成一次系统调用后可以确定这个值。
$server_name #服务器名称。
$server_port #请求到达服务器的端口号。
$request_uri #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
$uri #不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
$document_uri #与$uri相同。
日志格式
$remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址;
$remote_user :用来记录客户端用户名称;
$time_local : 用来记录访问时间与时区;
$request : 用来记录请求的url与http协议;
$status : 用来记录请求状态;成功是200,
$body_bytes_s ent :记录发送给客户端文件主体内容大小;
$http_referer :用来记录从那个页面链接访问过来的;
$http_user_agent :记录客户毒啊浏览器的相关信息;
nginx还有一个重要的功能,rewrite URL重写。
location ~*\.jpg$ {
#请求的地址是不带http和localhost这些前缀的。会是/dd/a.jpg。前面带/
rewrite (((\w)*/)*)((\w)+(.jpg)) /e/$4 redirect;
}
会tomcat URL重写的人看到这段代码一眼就知道怎么回事,而没搞过的就不一定那么容易能理解了。
location ~*\.jpg$ {
以.jpg结尾。十有八九的网页资料都写的是:location ~*\.(jpg|png)$,我这里能启动但是匹配不到。后来就改成这样了。
rewrite (((\w)*/)*)((\w)+(.jpg)) /e/$4 redirect;
想达到的效果是,请求地址以.jpg结尾重定向到/e/这个location
比如地址localhost/a/b/c/b.jpg-》》》localhost/e/b.jpg-》》》e:/b.jpg
这里分为三部分,访问地址、重定向地址,重定向类型,其中访问地址要用正则表达式写,而好像不能用{},不能启动。
这里的第一项正则表达式匹配到的地址就是/a/b/c/b.jpg
重定向地址的话,会重新加载这个地址,匹配location等等。这里/e/$4得到的值就是/e/b.jpg,$4是从第一项正则表达式取到的,为什么是4呢。我是从一二三四五一个个试出来的。第三项如果用last,浏览器地址栏地址不会改变,而redirect就会显示重定向后的地址,所以可以由此看到$1等等得到的值是多少。
开始一直以为是$2的。
$1对应最外层第一个(),$2是$1里面最外层第一个(),$3继续,$4才是最外层第二个(),也就是dd.jpg,$5是dd,$6是.jpg
nginx还有一个gzip模块,意思是把文件打包发送到浏览器,然后浏览器将其解包,大多数浏览器都支持解包。
日志:
http下面加一段:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'';
server下面加一句:
access_log logs/access.log main;
可以自定义日志了。在logs文件夹下面有两个日志文件。但是好像不能记录分发到哪一个后台服务器。
OK没有了。