浅见池也 发表于 2018-9-27 08:57:45

Nginx Tomcat Mysql

  第一阶段:3台服务器组成的Nginx+Tomcat+Mysql可扩展架构
  1、架构
  因为公司上一个项目使用Rails框架的缘故,这次继续沿用上一个框架的前端Nginx,作为一款轻量级的HTTP服务器,它在Linux平台上的表现毋庸置疑,本项目只用它来作为静态文件的处理及动态请求的转发更是显得绰绰有余,它的负载均衡功能也为以后的扩展提供良好的保证。由于本项目的后台开发语言使用JAVA,因此APP上面选用了大名鼎鼎的Tomcat用来处理前端Nginx转发的动态请求。后台数据库采用Mysql,Tomcat与DB使用 JDBC连接。
  2、配置
  2.1 Nginx配置
  Nginx配置文件nginx.conf:
  #usernobody;
  worker_processes8;             #开启8个进程,根据CPU个数调整
  #error_loglogs/error.log;
  #error_loglogs/error.lognotice;
  #error_loglogs/error.loginfo;
  #pid      logs/nginx.pid;
  events {
  use epoll;                                             #使用epoll模式
  worker_connections60000;    #允许的连接数
  }
  http {
  include       mime.types;
  default_typeapplication/octet-stream;
  #access_loglogs/access.logmain;
  sendfile      on;
  keepalive_timeout65;            #设置长连接超时时间
  #gzipon;
  upstream tomcatapp {            #转发并负载均衡的服务器写在这下面
  server 192.168.1.2;          #Tomcat服务器地址
  }
  #下面开始虚拟主机的配置
  server {
  listen       80;               #开启80端口提供服务
  server_name192.168.1.3;    #本机IP,写localhost或申请的域名也可以,URL处输入
  #charset koi8-r;
  #access_loglogs/host.access.logmain;
  #下面是配置.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;
  indexindex.jsp index.html index.htm;
  proxy_redirect      off;
  #以下配置设置Nginx在反向代理的时候发送域名和用户真实IP给后端APP
  proxy_set_header       Host $host;
  proxy_set_headerX-Real-IP$remote_addr;
  proxy_set_headerX-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
  
  配置开启最大线程为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@'%'>
  格式:grant 权限 on 数据库名.表名 to 用户@登录主机>  权限分为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也帮了大忙,第二阶段的扩展也会在这个基础上展开,记录与总结也会继续。

页: [1]
查看完整版本: Nginx Tomcat Mysql