ECM
ECM
总版主
总版主
  • 社区居民
  • 忠实会员
  • 原创写手
阅读:619回复:0

Nginx Tomcat Mysql

楼主#
更多 发布于:2016-05-10 23:13
第一阶段:3台服务器组成的Nginx+Tomcat+Mysql可扩展架构

1、架构

因为公司上一个项目使用Rails框架的缘故,这次继续沿用上一个框架的前端Nginx,作为一款轻量级的HTTP服务器,它在Linux平台上的表现毋庸置疑,本项目只用它来作为静态文件的处理及动态请求的转发更是显得绰绰有余,它的负载均衡功能也为以后的扩展提供良好的保证。由于本项目的后台开发语言使用JAVA,因此APP上面选用了大名鼎鼎的Tomcat用来处理前端Nginx转发的动态请求。后台数据库采用Mysql,Tomcat与DB使用 JDBC连接。

2、配置

2.1 Nginx配置

Nginx配置文件nginx.conf:

#user nobody;

worker_processes 8; #开启8个进程,根据CPU个数调整

#error_log logs/error.log;

#error_log logs/error.log notice;

#error_log logs/error.log info;

#pid logs/nginx.pid;



events {

use epoll; #使用epoll模式

worker_connections 60000; #允许的连接数

}

http {

include mime.types;

default_type application/octet-stream;

#access_log logs/access.log main;

sendfile on;

keepalive_timeout 65; #设置长连接超时时间

#gzip on;

upstream tomcatapp { #转发并负载均衡的服务器写在这下面

server 192.168.1.2; #Tomcat服务器地址

}

#下面开始虚拟主机的配置

server {

listen 80; #开启80端口提供服务

server_name 192.168.1.3; #本机IP,写localhost或申请的域名也可以,URL处输入

#charset koi8-r;

#access_log logs/host.access.log main;

#下面是配置.html .jsp .swf等静态文件本地处理,要用到正则表达式

location ~ \.(html|jsp|gif|jpg|jpeg|png|bmp|js|xml|java|jar|txt|swf|xls|txt)$ {

root /var/www; #Nginx根目录,可以在http、server或location设置

expires 24h; #控制页面缓存时间

#Nginx支持if判断并内置很多变量,如下面的$request_filename为请求的文件名。该if语句在location{}中,因此判断以.html .jsp等结尾的文件请求如果在本地不存在,则转发到tomcatapp中去处理。if语句在Nginx中一般和rewrite搭配用以实现URL的重定向。需要注意的是安装Nginx时./configure后面要有--with-pcre --with-http_stub_status_module --with-http_ssl_module --with-http_sub_module等几个参数,否则nginx.conf中出现if会报错如:nginx unknown directive "if" in /usr/local/nginx/conf/nginx.conf。至于哪个参数决定可以使用if还没有测试,总之都加上就好。

if (!-f $request_filename) {

proxy_pass http://tomcatapp; #这是要转发的服务器列表,名字随便起,要和upstream后面接的列表名对应

break;

}

}

#以下为全局配置,除了以上的静态文件之外,所有请求都转发给proxy_pass后设置的服务器列表去处理

location / {

root /var/www;

proxy_pass http://tomcatapp;

index index.jsp index.html index.htm;

proxy_redirect off;

#以下配置设置Nginx在反向代理的时候发送域名和用户真实IP给后端APP

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

error_page 500 502 503 504 /50x.html;

location = /50x.html {

}

}

}

2.2 Tomcat配置

Tomcat要根据实际的生产环境进行优化,主要有以下几个需要修改的地方

2.2.1内存

修改tomcat安装目录bin/catalina.sh,添加export JAVA_OPTS='-Xms1024m -Xmx1024m',前面是初始化内存大小,后面是可以使用最大内存

2.2.2线程及连接

编辑安装目录下conf/server.xml

<Connector port="8080"

maxThreads="500"

minSpareThreads="25"

maxSpareThreads="75"

acceptCount="100"

/>

配置开启最大线程为500,25个空线程等待,75个最大空线程等待及连接数大于maxThreads时最多允许100个连接等待。以上根据实际项目配置,也可以配置线程池。

连接参数的配置也是修改connector参数,主要有:

connectionTimeout 网络连接超时,单位毫秒,设置为0表示永不超时

keepAliveTimeout 长连接最大保持时间,单位毫秒

MaxKeepAliveRequests 为一次连接可以进行的HTTP请求的最大请求次数,1表示禁用,-1表示不限制个数,默认100个,一般设置在100~200之间

2.2.3多虚拟主机及多实例

多虚拟主机是在一个实例中的server.xml中配置多个虚拟目录以指向相同或不同项目,多实例是安装多个Tomcat实例,修改为不同端口,启动不同进程实现不同项目或者同项目的访问,与虚拟主机不同的是多实例可以实现简单的单台主机上的负载均衡。具体配置这里不介绍了。

2.2.4集群

Tomcat集群是在多台主机上实现负载均衡的技术,由于APP目前只有一台主机,集群到了第二阶段才能考虑。

2.3 Mysql

Mysql的表结构是开发人员根据程序需要来设计,这个要根据项目区分。

3、部署及问题

最后将项目的静态文件及动态文件分别部署到Nginx和Tomcat上,做到动静分离。Tomcat上没有必要放置多余的静态文件,但要配置好和后台数据库连接的jdbc,如:

jdbc.driverClassName=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://192.168.1.1:3306/kingdom?characterEncoding=utf-8

jdbc.username=root

jdbc.password=root

别忘了还有个连接DB的驱动jar包。这样一个Nginx+Tomcat+Mysql架构的项目就部署完毕。接下来说说遇到的问题。

问题1:连接不到后台数据库,但数据库本身没有问题,服务开启并且也可以登录。在排除了防火墙之类的配置后,用其他主机远程登录提示Access denied for user 'root'@'ip' (using password: YES),mysql默认禁止远程连接,解决办法:

mysql -uroot -p

mysql>GRANT all privileges ON *.* to root@'%' IDENTIFIED BY "root" with grant option;

格式:grant 权限 on 数据库名.表名 to 用户@登录主机 identified by "用户密码";

权限分为select,update,insert,delete或者直接all

数据库名.表名可以*.*表示所有

登录主机'%'表示所有

用户密码不是本机真实密码,为本机给远程登陆用户设的密码

之后FLUSH PRIVILEGES;即可

问题2:访问Nginx上的应用连接不到数据库,但直接访问Tomcat正常。将Nginx指向其他APP访问正常,说明Nginx配置没有问题,连接不到数据库是因为Nginx连接不到Tomcat,而Tomcat连接着数据库,Nginx只能访问自己本地的项目。从以上判断应该是Tomcat上项目的权限问题。找到故障点后着手解决,发现Tomcat上项目主目录下没有crossdomain.xml文件,这是Tomcat的跨域策略文件,配置后问题解决。

问题3:一切就绪后使用Loadrunner进行压力测试,Nginx日志报错accept() failed (24: Too many open files),这是由于服务器开的文件描述符太小造成。ulimit –n只能改变当前shell的设定,要永久改变有以下三步:

(1.) /etc/pam.d/login添加

session required /lib/security/pam_limits.so

(2.) /etc/security/limits.conf添加

www - nofile 1006154

www 是一个用户,如果是想所有用户生效的话换成 * ,设置的数值与硬件配置有关,别设置太大

(3.) 修改/etc/rc.local添加

echo 8061540 > /proc/sys/fs/file-max

第一阶段的生产环境搭建完毕,还有很多需要测试和优化的地方,这期间Google也帮了大忙,第二阶段的扩展也会在这个基础上展开,记录与总结也会继续。

 

 

 

 

 

 

 

异常中心网是一家专门收集整理程序员编程过程中遇到的常见异常(exception)以及各种异常问答中心的网站。异常中心网旨在,减少程序员在编码遇到异常,处理各种异常时间和痛苦,让程序员能更愉快的、快速的定位异常并查找对应的异常解决方案。异常中心网诚心打造最完美的编程社区为程序员用户服务,努力成为最好的程序员乐园程序员社区程序异常中心程序bug中心异常问答中心

 

喜欢0 评分0
游客

返回顶部