设为首页 收藏本站
查看: 668|回复: 0

[经验分享] Nginx Tomcat Mysql

[复制链接]

尚未签到

发表于 2018-9-27 08:57:45 | 显示全部楼层 |阅读模式
  第一阶段: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
  
  配置开启最大线程为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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-602588-1-1.html 上篇帖子: 如何在Ubuntu Linux上安装 MySQL 8.0.11 下篇帖子: 解决 mysql主从失败
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表