nginx+tomcat部署笔记

来源:互联网 发布:网页视频剪辑软件 编辑:程序博客网 时间:2024/06/06 00:11

公司服务器端一直是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服务器的强项# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用# 这里^表示强制匹配,一旦匹配成功,不会再去找其他locationlocation ^~ /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

原创粉丝点击