相对来说nginx做集群会相对比较容易一点。因此此文章才用nginx来集群项目中间有写问题处理简要说明下.新手第一次希望得到更多指点!!!
1: 工具
nginx:代理服务器。redis:用来存储session,集群式session 共享时使用。 tomcat6,项目中使用了ueditor编辑器。一并写下。因为上传图片时需要对其处理。
2:中间使用到了ueditor 编辑器。下载最新ueditor。到项目,将lib中的包加载到项目中。
配置文件上传:在ueditor.config.js 中配置 serverUrl: URL + "jsp/controller.jsp"即可。
但是你可能会发现其上传的图片文件夹在tomcat里。这样会造成tomcat膨胀应发性能问题。因此有人会去修改上传方法。
本人比较懒没有修改或者使用第三方上传。我的方法是:
我们会发现config.json 文件中配置了文件上传路径和图片名的名称规则。
如: "imagePathFormat": "/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
我们希望能配置指定绝对路径,但是很遗憾,只识别相对路径。因此我决定将imagePathFormat配置成: ../..//ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}" 使调出tomcat加载文件。但是这样tomcat就不能加载这些文件了,但是没关系我们可以在tomcat 中配置虚拟路径来加载这个文件jar。
找到server.xml 在host 便签下 添加配置
<Context path="/ueditor" docBase="G:/apache-tomcat-6.0.32/ueditor" debug="0" reloadable="true" crossContext="true"/>
启动后通过 localhost:8080/ueditor 请求能加载ueditor下的所有文件。
3:步骤
安装redis 此步相对简单 。对照着文档配置即可。和tomcat6 实现session 共享。需要的jar包有。
commons-pool-1.6.jar, jedis-2.1.0.jar , tomcat-redis-session-manager-1.2-tomcat-6.jar
(注:tomcat-redis-session-manager-1.2-tomcat-Version.jar 版本需和tomcat版本一致 )
将上述包复制到每个tomcat6 中的lib中。并在tomcat配置文件中配置。配置context.xml. 在context便签中添加
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
<Manager className="com.radiadesign.catalina.session.RedisSessionManager"
host="localhost" // redis 安装的服务器ip
port="6379" // redis安装的端口
database="0"
maxInactiveInterval="1800"/> //session 时效
经此步session实现共享。
配置nginx。配置nginx.conf. 相关配置说明看文档。
配置如下
upstream 55.zh.com {
server localhost:7005 weight=10 max_fails=2 fail_timeout=30s;
server localhost:7006 weight=10 max_fails=2 fail_timeout=30s;
}
server {
listen 9000; //监听端口
server_name 55.zh.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css|xls|json)$ { // 静态资源分离
root G:/upload; //根路径
#expires定义用户浏览器缓存的时间为7天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力
expires 7d;
}
location /{
proxy_set_header Host $host:$server_port; //如果不配置的话可能会出现端口号丢失的情况导致无法访问。
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://55.zhd.com;
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 30; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 30; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 30; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 128k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 32 128k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size 128k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 128k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
}
location ~ ^/WEB-INF/ {
deny all;
}
}
配置完成之后 依次启动 redis --》 tomcat---》nginx。发现正常运行。
但是你会察觉有点不对。没有处理上传文件资源问题。我讲下我的处理方式:
我从别人博客里看到有几种方式: 比如使用文件同步啊,ftp 共享什么的。我采取的方式是所有的上传图片所有的文件下载预览都使用都指定一台服务器。如ueditor 的上传文件,我们从config.json 中发现所以的上传action 都是以upload 开头。所有的获取路径都是以我们配置的 localhost:8080/ueditor 这个请求来访问。那么我就可以指定一台服务器。在上述nginx.conf 配置中添加配置 :
upstream 55.zh.com_file { //用来处理ueditor 文件上传预览
server localhost:7005 weight=10 max_fails=2 fail_timeout=30s;
#server localhost:7006 weight=10 max_fails=2 fail_timeout=30s; // 注释掉
}
location ^upload { //处理以upload开头的请求
proxy_pass http://55.zh.com_file;
}
location ~*/ueditor/ { //处理ueditor的 请求
proxy_pass http://55.zh.com_file;
}
具体的表达式根据实际情况处理。