公司服务器端一直是nginx+tomcat的环境。其中nginx用作反向代理,动态的请求交给tomcat来处理。nginx本身处理静态内容(例如图片)
因为是从头开始学,列一下自己遇到的坑。
nginx和tomcat的安装不再赘述,我的环境是centOS,因为用的公司的openstack,有现成的nginx+tomcat的镜像,所以我只是用镜像创建了一个实例,不需要自己安装。
笔记list:
1.nginx的配置要点:http要素和server要素
我的配置(部分截取)
nginx.conf:
http {
//上面部分忽略
//主要是下面这句,引入别的conf文件,都写在一起比较乱,也不容易找
include /etc/nginx/conf.d/*.conf
}
server.conf
#这里配置一个upstream,供下面使用。
#需要注意的是,因为我的tomcat跟nginx在一个实例下面,所以我用了localhost,如果不在一起,需要给出IP或者域名
upstream tomcat_server {
server localhost:8080;
}
#这个server是nginx的服务项。
#listen表示监听接口
#server_name这里我写了一个域名,如果你也要这么写的话,客户端环境需要绑定hosts,比如我nginx服务器的IP是192.168.12.12,那你需要把这个IP绑定mytest.com
#比较搞笑的是,上面绑定的IP,是客户端绑定的,你不能把上面tomcat_server的server改成mytest.com:8080,我就犯了这个错误,因为tomcat的服务器没有绑定hosts,它根本不知道mytest.com是啥
server {
listen 80;
server_name mytest.com;
#charset koi8-r;
#访问log路径,这个文件要真实存在
access_log /var/log/nginx/access.log main;
location / {
#root表示“location /”的访问路径,index代表默认访问文件
#这样当我请求mytest.com的时候,实际上是请求了root目录下的index文件
#但是因为这里我要做反向代理,所以不需要root和index,我都注释掉了
#其实就算是不注释掉,root和index也不会起作用,一样会转发到tomcat
#root /usr/share/nginx/html;
#index index.html index.htm;
#proxy_pass是配置代理,“location /”表示所有请求都转发到 http://tomcat_server,
#因为tomcat_server我已经定义过了,所以其实就是转发到了localhost:8080,
#也就是tomcat的默认页面
proxy_pass http://tomcat_server;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
2.nginx location的匹配
还是继续上面的server.conf:
#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。
#这里是直接转发给后端应用服务器了,也可以是一个静态首页
# 第一个必选规则
location = / {
proxy_pass http://tomcat:8080/index
}
# 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
# 这里^表示强制匹配,一旦匹配成功,不会再去找其他location
location ^~ /static/ {
root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
# 第三个规则就是通用规则,用来转发动态请求到后端应用服务器
# 非静态文件请求就默认是动态请求,自己根据实际把握
# 毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了
location / {
proxy_pass http://tomcat:8080/
}
#可以看到,我可以直接对某个请求返回http status,这里是返回了404,可以用这个特性来提高网站的安全性,保护某些敏感后缀的文件(比如ht文件,log文件)不能被外部访问
location ~* \.(ht|log)$ {
return 404;
}
更具体的location匹配规则如下:
location表达式类型
~ 表示执行一个正则匹配,区分大小写
~* 表示执行一个正则匹配,不区分大小写
^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他location。
= 进行普通字符精确匹配。也就是完全匹配。
@ “@” 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files
location优先级说明
在nginx的location和配置中location的顺序没有太大关系。正location表达式的类型有关。相同类型的表达式,字符串长的会优先匹配。
以下是按优先级排列说明:
第一优先级:等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项。
第二优先级:^~类型表达式。一旦匹配成功,则不再查找其他匹配项。
第三优先级:正则表达式类型(~ ~*)的优先级次之。如果有多个location的正则能匹配的话,则使用正则表达式最长的那个。
第四优先级:常规字符串匹配类型。按前缀匹配。
location优先级示例
配置项如下:
location = / {
# 仅仅匹配请求 /
[ configuration A ]
}
location / {
# 匹配所有以 / 开头的请求。但是如果有更长的同类型的表达式,则选择更长的表达式。如果有正则表达式可以匹配,则
# 优先匹配正则表达式。
[ configuration B ]
}
location /documents/ {
# 匹配所有以 /documents/ 开头的请求。但是如果有更长的同类型的表达式,则选择更长的表达式。
#如果有正则表达式可以匹配,则优先匹配正则表达式。
[ configuration C ]
}
location ^~ /images/ {
# 匹配所有以 /images/ 开头的表达式,如果匹配成功,则停止匹配查找。所以,即便有符合的正则表达式location,也
# 不会被使用
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配所有以 gif jpg jpeg结尾的请求。但是 以 /images/开头的请求,将使用 Configuration D
[ configuration E ]
}
请求匹配示例
/ -> configuration A
/index.html -> configuration B
/documents/document.html -> configuration C
/images/1.gif -> configuration D
/documents/1.jpg -> configuration E
注意,以上的匹配和在配置文件中定义的顺序无关。
另外,configuration A/B/C/D/E实际内容是类似:
root /etc/nginx/html
3.nginx配置负载均衡
继续server.conf
#这里tomcat_server配置了2个server,而且给每个server配置了权重
#权重越大,被访问到的几率越高
upstream tomcat_server {
server localhost:8080 weight=1;
server 187.12.43.241:8080 weight=5;
}
server {
listen 80;
server_name mytest.com;
#这里的反向代理设置的还是上面的tomcat_server,这样就达到了负载均衡的目的
location / {
proxy_pass http://tomcat_server;
}
}
不过实际上,公司的负载均衡并没有使用nginx的配置,而是使用了IP负载均衡。
关于IP负载均衡,可以看下面这篇文章:
http://blog.csdn.net/cywosp/article/details/38036537