使用Debian环境。安装Nginx(默认安装)、Web项目、安装tomcat(默认安装)等
1.一份Nginx.conf配置文件
基本配置好这个文件后,就可以实现加载了。但要了解里面的各种关系就比较麻烦了。本博客不是教学文章,只是一个记录,方便以后阅读。
2.基础讲解现在假设有一台计算机192.168.8.203,上面部署了Tomcat。 8080端口有J2EE服务,可以通过浏览器正常浏览网页。现在有一个问题。 Tomcat是一个比较全面的Web容器。静态网页的处理应该是比较消耗资源的,尤其是静态页面每次都要从磁盘读取然后返回。
[[282053]]
这将消耗Tomcat 资源,并可能影响这些动态页面的解析性能。秉承Linux哲学,一个软件只做一件事的原则。 Tomcat 应该只处理JSP 动态页面。这里我们使用之前学过的Nginx来进行反向代理。第一步是充当代理来分离动态和静态网页。这很简单。
服务器部分的解释如下:第35行监听本机的80端口。第37-39 行表示默认主页。这里默认的首页是index.jsp,对应我项目中的一个索引。这可以更改为
indexindex.jspindex.htmlindex.htmindex.php
详细请参考其他文章。关键40行,这个是常规搭配,网上有很多介绍。这与我的项目中使用的所有静态网页后缀相匹配。第41行是代理地址。在这里,我代理到我的网络应用程序。 expires 30d 缓存是30天。这里的缓存对应的是前端页面和用户的Cache-Control字段。
第44 行的正则表达式匹配没有后缀的页面。我的项目中的jsp页面没有后缀。这可以根据需要进行修改。还代理到192.168.8.203:8080。说到这里你可能会问,这有什么意义呢?当然不是那样的。为了简单实现动静分离,我们可以将第41行修改为
根/var/lib/tomcat7/webapps/JieLiERP/WEB-INF
意思是不用代理,直接从本地磁盘获取即可。通过查看tomcat日志可以看到静态页面没有被访问。但还有另一个问题。
这种灵活性不好,对下面讨论的内存缓存和集群部署也不友好,所以采用了下面的写法。写入另一个服务器段。
这次监听808端口,然后将上面代码第41行改为proxy_pass http://192.168.8.203:808。至此,就实现了动静分离。如果有多台服务器,修改对应的IP即可。如果发现无法连接,需要检查防火墙、权限等外部问题。这个配置是这样的。
如果只是这样的话,我们会发现直接传输页面占用了太多的带宽。对应web的优化,这里想到的就是对页面进行gzip压缩,然后传输给用户,然后再解压,可以有效减少带宽。这里会用到Nginx的gzip模块。默认的Nginx 集成了gzip 模块。只需将以下配置添加到http 部分即可。
给个主页看看效果
不用担心不同数量的请求。这两个请求来自Google 插件。别以为我在骗你。
作为一个被很多人访问的网站,缓存肯定是非常重要的。
一开始我想用一个插件来综合Nginx和Redis,然后Nginx使用Redis来做缓存。但是我发现配置起来非常麻烦。必须自己下载插件并重新编译Nginx,相当麻烦,所以我决定使用Nginx自带的插件。缓存也是一个不错的选择。
虽然效率不如redis,但也聊胜于无。 Nginx的默认缓存是磁盘文件系统缓存,而不是像Redis那样的内存级缓存。起初我以为Nginx 就只有这些了。后来查了一些资料才发现,原来是自己太天真,对Linux了解不多。 Linux 中的一切都是文件。
原来我们可以将文件缓存到内存对应的Linux文件系统中。我说的可能很难理解。请自行搜索/dev/shm文件目录。当我们将文件缓存到这个文件目录中时,其实就相当于内存缓存了。只是它仍然依赖于文件系统管理。所以不如自定义格式的Redis之类的内存缓存。
在http段中进行基本配置
经过这两个配置就基本可以实现了。这里有几个注意事项,也是困扰我很久的问题。上面第一段代码的第6行,proxy_ignore_headers如果在web项目中的html的head中指定
如果这些没有被缓存,则必须添加proxy_ignore_headers 配置项。还有一点是/dev/shm下的文件系统权限默认只授予root用户,所以chmod 777 -R /dev/shm并不是一个非常安全的做法。如果你真的在线的话,你可以赋予一定的用户组。关于用户组的设置是配置的第一行
用户www www;
上面第二段代码第6行添加了一个头字段,方便检查缓存是否命中。
我们rm -rf /dev/shm/JieLiERP/proxy_* 下面所有文件(注意,如果你在这里做多个测试,你需要nginx -s reload 重新读取配置或者重启服务,因为你rm -rf 只删除缓存文件,但是缓存的结构信息还在nginx进程中,如果不重启的话,结构仍然存在)。
所以记得重启。以下是运行效果
第一次访问
第二次访问,在浏览器中按Ctrl+Shift+R强制刷新
你可以在这里看到效果。我们看一下/dev/shm
到这里就快结束了。最后也是更关键的技术点是集群、集群、集群。这就需要上游。你看到一开始的配置文件了吗?就是那个。
上面的是集群组。 upload是关键字,static和dynamic是两个服务器集群组的名称。以第一个为例,服务器127.0.0.1:808为服务器地址,后面的weight=1为权重。如果有多个,请尽可能多地写。
我自己测试过,如果其中一个集群坏了,并不影响系统运行。至于更多的轮询规则,可以参考网上的更多信息。这里不多说。至于如何使用呢?代理通行证
将http://192.168.8.203:808 更改为proxy_pass http://static;这样就可以达到平衡。
到这里就结束了。
通过根据自己的需求配置以上各部分,就可以实现单机房的负载均衡。上述方式的一个缺点是,如果前面的nginx崩溃了,后面的机器就会失去访问的能力,所以需要实现前面多个nginx多机房的负载。这是另一个话题了。目前还没有研究。以后有机会的话我再谈。
如果上面的动态服务器组需要保存用户状态,就会出现一个问题,就是会话问题。例如,我登录server1后,下次轮询动态服务器组时,可能会分配给server2,这会导致需要再次登录。
临时的解决办法是配置轮询规则,根据用户请求的IP进行hash,然后分配对应的服务器。具体配置如下:
这样,一个用户就可以对应一个服务器节点。这样就不会出现重复登录的问题。另一个根本解决方案是使用缓存系统对会话进行统一存储管理。具体方法我还没有尝试过。参考资料中有相关文章,大家可以进一步了解。
Nginx添加了SSL功能。同样,Nginx默认具有SSL模块功能。我们不需要另外安装,只需要简单的配置就足够了。首先,让我们生成一些必要的证书。生产工艺比较简单。
下面是配置Nginx。我们可以将需要使用的client.pem、client.pem、client.key、unsecure这三个文件放在Nginx的一个目录下。剩下的Nginx配置如下:
重启Nginx,我们就可以访问HTTPS网站了。但这就是发生的事情
这没有问题。具体原因是CA证书必须被认可。所以我们上面生成的https证书就是我们自己生成的。如果我们想改成下面的,就需要花钱去买,剩下的就可以自己网上解决了。
(虽然可以使用自行生成的证书,但是仍然无法抵御DNS欺骗,所以这种不安全的证书就和没有一样。不过据说这样可以防止运营商劫持。)
好了,文章到此结束,希望可以帮助到大家。
本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.iotsj.com//kuaixun/7701.html
用户评论
听起来很专业啊,我还在琢磨如何把网站做得更快呢。
有16位网友表示赞同!
动静分离?这个概念听过一遍,不知道具体的细节是什么样的。
有8位网友表示赞同!
感觉Nginx和Tomcat都很有潜力,学习一下这段代码能让我对它们更加了解。
有12位网友表示赞同!
upstream 负载均衡技术听起来很厉害,能保证网站访问更流畅吗?
有19位网友表示赞同!
这个主题真有趣!我一直在想怎么提高服务器的效率。
有7位网友表示赞同!
好像可以用到很多场景啊。比如电商平台或者高访问量网站?
有9位网友表示赞同!
我要去看看相关的教程了,了解下具体的实现方法。
有6位网友表示赞同!
如果能理解这个原理,我的前端项目应该能跑得更快吧!
有10位网友表示赞同!
这篇文章一定能帮到我,我一直想搞搞动静分离这种技术。
有12位网友表示赞同!
听起来很复杂啊,但是学习一下说不定能让我技能提升。
有6位网友表示赞同!
网站访问慢会影响用户体验,这个知识点很重要!
有5位网友表示赞同!
希望文章中能详细讲解upstream 的工作机制,我对这个部分比较感兴趣。
有6位网友表示赞同!
感觉Nginx + Tomcat 组合很强大,可以把一个网站做得十分安全可靠。
有17位网友表示赞同!
我以前一直想学习一下高并发系统的架构设计,这篇文章正好合适!
有20位网友表示赞同!
很多教程都讲得很抽象,希望这篇文章能用通俗易懂的语言讲解技术细节。
有5位网友表示赞同!
以后我可以尝试把这个知识应用到我的实际项目中!
有16位网友表示赞同!
学习一下nginx和tomcat的相关知识,未来开发会更得心应手。
有16位网友表示赞同!
很多网站都是利用这种技术提高效率吧?
有10位网友表示赞同!
感觉这篇文章很有用,我要把它推荐给我的朋友们。
有15位网友表示赞同!