基本概念
百度百科上定义 Nginx 是这样的:
Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个 BSD-like 协议下发行。由俄罗斯的程序设计师 Igor Sysoev 所开发,供俄国大型的入口网站及搜索引擎 Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上 Nginx 的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用 Nginx 网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
今天用 Nginx 和Tomcat 实现了一个简单的负载均衡的例子,记录如下。
准备Tomcat 应用
前两天整理 websocket 时用的一个简单项目,修改 server.xml 中的端口为 8080,启动
Tomcat ,JSP 页面引用 jquery1.9.js 。现在验证下这个静态资源请求分发的情况。
<script type="text/javascript" src="/jquery1.9.0.js"></script>
<script type="text/javascript">
直接访问 Tomcat 请求,由于项目路径中没有该文件,所以报404错误:
添加配置
使用 Nginx 实现 Tomcat 请求的动静资源分离,在 Nginx 安装目录下的 html 目录中放入 jquery1.9.js 这个文件:
修改 nginx.conf
,在 http
节点中添加如下配置:
upstream local_tomcat {
server localhost:8080;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
# 所有静态请求都由 nginx 处理,存放目录为 html
location ~ \.(gif|jpg|jpeg|png|bmp|swf)$ {
root html;
}
# 所有动态请求都转发给 tomca t处理
location ~ \.(jsp|do)$ {
proxy_pass http://local_tomcat;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
从 Nginx 服务器的响应行为来看,这个配置文件就是配置 Nginx 请求处理规则,Server定义的是 Nginx 服务器的信息,它监听 80 端口和 443 端。对 80 端口的情况是这样的:
- upstream:负载均衡模块,配置主机列表;
- location / :所有的 / 请求最终转发到根目录 和 index 模块;
- location ~ .(jsp|do) 转发到 http://local_tomcat目录(这里的 local_tomcat 就是upstream这个配置里面的名称 local_tomcat;
- location ~ .(gif|jpg|jpeg|png|bmp|swf) 所有的静态资源文件都转发到根目录。
进入Nginx 目录,启动它:start nginx,访问主页面 http://localhost/
进入主页面:
再次通过 Nginx 访问 Tomcat 应用:
此时这个 jquery1.9.js 文件的请求是先被 Nginx 服务器解析的,所以能正确访问到。
启示录
上周六参加的那个架构大会,好几位讲师的 PPT 框架中的负载均衡实现方式中都有Haproxy 和 Nginx,以前也听过 Nginx 服务器,但是没有深入了解过,所以就有了本文的实验操作。
没有系统地看过它的资料,单从实验过程来看,还是能得出一点编程注意事项的。例如:要结合 Nginx ,实现 Tomcat 动、静资源分离功能,那么在开发过程中就需要统一所有的静态资源路径,否则就容易出现 404 错误。
此外 Tomcat 可以在 server.xml 中配置 docBase 将所有的静态资源统一放在 web 工程目录之外。
<Context docBase="D:\WoodWang\JavaSoft\nginx-1.12.0\html" path="/" reloadable="true" />
加上这行配置之后,直接访问 http://localhost:8080/websocketDemo/index.jsp 也不会报错。