大家好,关于一篇学会 Nginx与Tomcat 打配合-nginx 和tomcat很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
[[442098]]
前言
前段时间,我使用nginx来共享我的网站由tomcat处理的http服务。本文将与大家分享我的实践过程以及如何从头开始使用nginx来访问您的前端项目。欢迎大家。有兴趣的开发人员应该阅读这篇文章。
写在前面
我的开源项目[1]的第三方登录模块使用localStorage获取用户的授权结果。前几天,有网友反映点击我文章中的链接后无法登录。
经过一番调查,发现我在文章中留下的链接是https://kaisir.cn/chat-system[2],第三方认证回调设置的链接是https://www.kaisir.cn/chat-system[3] 。由于我的域名解析中配置的@访问和www访问指向同一个网站,所以两个访问接口是相同的。但回调地址中包含www,而请求授权的访问接口没有www。出现跨域问题。
跨域之后,localStorage中的东西自然就不一样了,所以就出现了这位网友提到的问题。
解决办法
由于两者都访问同一服务器上的资源,所以我们可以在服务器端配置重定向。当请求的地址不带www时,我们会把他重定向到带www的地址。
于是我查了很多资料,用tomcat配置不带www的网站自动添加www。我看了一下解决方案,发现挺麻烦的,不想麻烦了。
使用nginx解决这个问题
经过一番查找,发现使用nginx解决这个问题还是比较简单的,于是我花了一些时间学习了nginx,完美解决了这个问题。
注意:本文不介绍如何安装nginx。对此不了解的开发者应该去nginx官网[4]学习。
移除tomcat的配置
首先,我们删除一些已经在tomact中配置的http服务。这里要删除的有:http访问跳转https、域名证书、静态资源。
注:如果你不是使用tomcat,可以跳过本章,直接学习nginx的相关配置。
关闭https访问并删除域名证书
我们打开tomcat的conf目录下的server.xml,在Service标签中找到端口为80的Connector标签,删除标签中的redirectPort属性,如下图所示。
注意:还需要将端口值修改为80以外的任意值,因为nginx需要使用80端口号。
然后,继续查找端口为443的Connector标签,将其删除,如下图所示。
最后删除目录下后缀为jks的域名文件。
删除静态资源
打开tomcat的webapps目录并删除您的静态资源(前端项目)。
关闭http强跳https
我们打开tomcat的conf目录下的web.xml文件,找到login-config标签和security-constraint的内容,将其删除,如下图:
--启用http强制重定向到https访问----SSL的授权设置--CLIENT-CERTnameClientCertUsers-onlyAreanameconstraint--SSL的授权设置--nameSSLname/*user-data-constraintCONFIDENTIALuser-data-constraintconstraint
配置nginx
接下来我们配置nginx,使其能够完全接管客户端的http请求,反向代理tomcat提供的服务,成功与tomcat配合。
配置虚拟主机
首先我们需要配置虚拟主机。它的作用是模块化地管理你所有的服务器资源,避免将它们全部写入nginx主配置文件中,这会导致可维护性降低。
我们打开nginx的conf目录,在其目录中找到virtualhost.conf文件(如果不存在,则需要手动创建)。该文件的作用是引入所有服务器配置,以便统一管理。打开文件后我们写入如下所示:
#VirtualHostConfiguration.#默认存在。如果不存在,可以忽略includevhosts/localhost.vhost;#我们新添加的includevhosts/kaisir.cn;在上面的配置文件中,我们新增了kaisir.cn的配置,我们需要在创建这个文件vhosts目录,也在conf目录下(如果没有的话自己创建),我们可以直接创建这个文件。
注意:创建的文件不能包含后缀名。如果您有多个应用程序,请在此处创建它们,然后使用virtualhost.conf 文件中的include 指令引入它们。
然后,我们打开conf目录下的nginx.conf文件,引入我们刚刚创建的virtualhost.conf文件。我们找到http标签,并在标签内添加以下内容:
#.其他内容省略.http{#引入服务配置文件includevirtualhost.conf;}完成以上操作后,我们就可以愉快地编辑我们在vhosts目录下创建的文件了。
服务器配置文件
在上面的配置中,我们在vhosts目录中创建的文件是我们的服务器配置文件。 http访问的相关配置都写在这个文件中。
配置端口监听
我们打开之前创建的kaisir.cn文件,写入以下内容:
server{listen80;listen443ssl;}上述配置中:
server 是该文件的根指令。本章后面的所有配置都写在本指令中。 Listen to 监听80端口(即普通http访问)、监听443端口和ssl访问(即https访问)
配置ssl证书
我们编写如下代码,配置https访问所需的ssl证书文件:
#配置ssl证书ssl_certificate/Users/likai/nginx-website/conf/kaisir.cn/1_kaisir.cn_bundle.crt;ssl_certificate_key/Users/likai/nginx-website/conf/kaisir.cn/2_kaisir.cn.key;ssl_session_timeout5m; ssl_ciphersECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:NULL:aNULL:MD5:ADH:RC4;ssl_protocolsTLSv1TLSv1.1TLSv1。 2TLSv1.3;ssl_prefer_server_cipherson;上面的配置中,我们主要修改两部分的配置:
ssl_certificate 您域名的SSL 证书文件所在位置(文件类型必须为crt 格式) ssl_certificate_key 您的域名证书对应的密钥文件(文件类型必须为key 格式) 注:SSL 证书需要为从您的域名注册商处下载
配置网站访问路径
接下来我们配置各个访问路径指向的静态资源(前端项目)。我们将使用location 指令来配置对路径的访问。如下图,我们配置域名指向的根目录(即/(意思),该指令指定了静态资源在硬盘上的路径以及默认的主页文件。
#根路径位置/{#项目路径root/Users/likai/nginx-website/kasir.cn;#默认首页文件indexindex.htmlindex.htm;}配置好根目录后,我们看一下相关的访问配置子目录。如下图:
location/chat-system{#项目路径alias/Users/likai/nginx-website/chat-system/;#默认首页文件indexindex.htmlindex.htm;#解决网页刷新404 try_files$uri$uri//chat- system/index .html;} 观察上述配置后,我们发现差异如下:
alias 在配置子目录时,我们使用alias来指向项目try_files。下面是vue项目中启用历史模式后,刷新网页时出现404问题的解决方案。注意:如果您的vue 项目是使用Vue CLI 构建的,则需要修改vue.config。 js中publicPath属性的值为:process.env.NODE_ENV==='development' ? './':'/聊天系统'。 '/chat-system'是生产环境的访问路径,我们刚刚在location命令行配置的。如果这里配置错误的话,你打包好的Vue项目在浏览器中访问时会是一片空白?
最后在路由配置文件中传入参数:createWebHistory(process.env.BASE_URL)。
请在此提交具体代码:build: 启用路由的历史模式[5]
自定义错误页
当浏览器访问不存在的页面或者服务器内部出现错误时,我们可能需要进行处理。在这种情况下,我们需要使用error_page指令,如下所示:
#自定义404和500页面,指向如下位置error_page404500/404.html;#自定义404页面位置/404.html{alias/Users/likai/nginx-website/404-page/;#默认首页文件indexindex.htmlindex .htm;} 注意:配置完error_page后,一定要配置location指向你要访问的静态项目。
反向代理tomcat提供的服务
我们需要在location指令中使用proxy_pass来代理tomcat提供的服务。配置如下:
#反向代理Java接口,多路径使用正则表达式匹配位置~^/(api|uploads|download|other)/{proxy_passhttp://127.0.0.1:8080;proxy_set_headerHost$host;proxy_set_headerX-Real- IP$remote_addr;proxy_set_headerX-Forwarded- For$proxy_add_x_forwarded_for;} 注意:location指令使用正则表达式来匹配接口前缀地址。这里匹配的是/api/*、/uploads/*、/download/*、/other/*
如果你的tomcat也提供了websocket服务,你需要为proxy配置一个单独的location指令。配置如下:
#反向代理websocket请求位置/websocket{proxy_passhttp://127.0.0.1:8080/websocket/;proxy_http_version1.1;proxy_set_headerU pgrade$http_upgrade;proxy_set_headerConnection'upgrade';} 如果不使用Java作为服务器,而是使用python、php、c#和其他语言一样,您还可以使用proxy_pass 作为反向代理。
重定向未携带www的请求
最后解决本文开头提到的问题。在nginx中解决这个问题非常简单。我们只需要判断请求地址中是否包含www即可。如果不存在,则301 重定向到带有www 的URL。地址就够了,配置如下:
#主机名,前面写哪个就会默认跳转到哪个server_namewww.kaisir.cnkaisir.cn; #如果请求URL不包含www,则重定向到携带www的https地址if ($http_host!~'^www.kaisir.cn$'){return301https://$server_name$request_uri;}配置完成后,我们打开浏览器访问kaisir.cn[6],验证是否满足我们的预期,如下图,完美的解决方案吗?
注意:上面的配置中,我们使用正则表达式对URL进行一波匹配。 server_name指令的作用是,如果访问地址包含这里写入的内容,就会触发这里配置的执行。
默认情况下,此配置还将您的http 请求重定向到https。
完整的配置文件
本章完整配置文件内容如下:
server{listen80;listen443ssl;#主机名,前面写哪个就默认重定向server_namewww.kaisir.cnkaisir.cn;#请求URL不包含www,则重定向到携带www的https地址if ($http_host !大约likai/nginx-website/conf/kaisir.cn/1_kaisir.cn_bundle.crt;ssl_certificate_key/Users/likai/nginx-website/conf/kaisir.cn/2_kaisir.cn.key;ssl_session_timeout5m;ssl_ciphersECDHE-RSA-AES128- GCM- SHA256:ECDHE:ECDH:AES:HIGH:NULL:aNULL:MD5:ADH:RC4;ssl_protocolsTLSv1TLSv1.1TLSv1.2TLSv1.3;ssl_prefer_server_cipherson;#引用虚拟配置文件include vhosts/_nginx.vhost.fpm;#根路径位置/{#项目路径root/Users /likai/nginx-website/kasir.cn;#默认首页文件indexindex.htmlindex.htm;}location/chat-system{#项目路径alias/Users/likai/nginx-website/chat-system/;#默认首页页面文件indexindex.htmlindex .htm;#解决网页刷新404try_files$uri$uri//chat-system/index.html;}#自定义404页面位置/404.html{alias/Users/likai/nginx-website/404-page/;# 默认首页文件indexindex.htmlindex.htm;}#反向代理Java接口,多路径使用正则表达式匹配位置~^/(api|uploads|download|other)/{proxy_passhttp://127.0.0.1:8080; proxy_set_headerHost$host;proxy_set_headerX -真实IP$remote_addr; proxy_set_header Connection'upgrade';}}
nginx配置文件
接下来我们看一下nginx的配置文件,做一些小优化。本章所有配置均在nginx.conf文件中完成。本章提到的所有配置文件均指nginx.conf。
最大连接数
最大连接数也可以是并发数,即同时支持的最大客户端连接数。在配置文件中添加如下配置:
events{#允许的连接数worker_connections20000;}
开启gzip
Gzip压缩可以节省我们的带宽资源,提高网站的加载速度。启用方法也非常简单。将其添加到配置文件中的http指令中,如下所示:
http{#打开gzipgzipon;#允许压缩的最小字节数gzip_min_length10;#禁用gzipgzip_disable'MSIE[1-6].';#对于IE浏览器版本1-启用gzip文件类型gzip_typestext/plainapplication/x-javascripttext/6 csstext/javascriptapplication/xml;}
配置日志
日志可以用来记录每个客户端的访问时间、IP、浏览器等信息,这有助于我们后续的网站维护。将以下内容添加到配置文件中的http 指令中。配置:
#设置日志格式,添加客户端真实IP等信息格式atchatSystemLogFormat'$http_xforwarded_for-$remote_user[$time_local]'''$request'$status$body_bytes_sent'''$http_referer''$http_user_agent'';#访问日志文件存储路径ss_log/Users/likai/nginx-website/logs-chat-system/access.logchatSystemLogFormatbuffer=32k;
配置文件上传大小
如果你的网站提供文件上传服务,那么你的服务器项目中必须配置文件大小限制,另外还需要在nginx中配置。
同样,在配置文件的http指令中添加以下配置:
#客户端可以上传的文件大小client_max_body_size100m;
完整的配置文件
完整配置如下:
userlikaistaff;worker_processes8;error_log/Applications/MxSrvs/logs/errors_nginx.log;#error_loglogs/error.lognotice;#error_loglogs/error.loginfo;#pidlogs/nginx.pid;events{#允许的连接数worker_connections20000;}http{ # gzip匹配类型配置文件includemime.types;default_typeapplication/octet-stream;#客户端可以上传的文件大小client_max_body_size100m;#开启gzipgz
ip on; # 允许压缩的最小字节数 gzip_min_length 10; # IE浏览器1-6版本禁用gzip gzip_disable "MSIE [1-6]."; # 启用gzip的文件类型 gzip_types text/plain application/x-javascript text/css text/javascript application/xml; # 设置日志格式,添加客户端真实ip等信息 log_format chatSystemLogFormat '$http_x forwarded_for - $remote_user [$time_local]' '"$request" $status $body_bytes_sent' '"$http_referer" "$http_user_agent"'; # 访问日志文件存放路径 access_log /Users/likai/nginx-website/logs-chat-system/access.log chatSystemLogFormat buffer=32k; # 引入服务配置文件 include virtualhost.conf; sendfile on; keepalive_timeout 65; }参考资料
[1]开源项目: https://kaisir.cn/chat-system [2]https://kaisir.cn/chat-system: https://kaisir.cn/chat-system [3]https://www.kaisir.cn/chat-system: https://www.kaisir.cn/chat-system [4]nginx官网: https://www.nginx.com/resources/wiki/start/topics/tutorials/install/ [5]build: 启用路由的history模式: https://github.com/likaia/chat-system/commit/e7c55a714f2610a87a5c87d5864bc4c342a298b0 [6]kaisir.cn: http://kaisir.cn [7]个人网站: https://www.kaisir.cn/一篇学会 Nginx与Tomcat 打配合-nginx 和tomcat和的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!
本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.iotsj.com//kuaixun/7472.html
用户评论
看了标题感觉很有意思,我一直想学习Nginx和Tomcat怎么一起用!
有13位网友表示赞同!
最近项目要用到这两种工具,正好可以看看这篇博客学习下。
有6位网友表示赞同!
做网站开发的时候经常用到这两个,希望能学到更多实际技巧。
有8位网友表示赞同!
好专业sounding 的标题啊!一定很能帮到我们新手。
有11位网友表示赞同!
Nginx和Tomcat搭配确实挺强大的,期待看看文中详细的配置步骤。
有12位网友表示赞同!
学习学习,提升一下自己的技能!
有18位网友表示赞同!
终于有人来分享这款组合的使用啦,感谢你!
有13位网友表示赞同!
我觉得这两种工具用起来很有优势,看完这篇文章后应该能理解了它的作用。
有17位网友表示赞同!
我之前听说过Nginx 和 Tomcat 的配合,但具体操作还不太了解,希望文章能够详细讲解。
有17位网友表示赞同!
很多博客都在说Nginx和Tomcat搭配的强大,希望能真正看懂原理和实践方法!
有11位网友表示赞同!
分享的文章看起来很全面,期待学习到更多关于 Nginx 的知识。
有20位网友表示赞同!
这篇文章应该能让新手更快入门这两个工具的结合吧,太棒啦!
有6位网友表示赞同!
项目开发中确实挺常用Nginx 和 Tomcat 的,希望文中能给出一些通用的案例。
有9位网友表示赞同!
学习一下这些知识总会有用处,期待文章的分享!
有17位网友表示赞同!
看了标题感觉这篇博客很有实用价值,一定会读完的!
有9位网友表示赞同!
希望能把Nginx 和Tomcat 的配置方法学得更加熟练!
有10位网友表示赞同!
这个话题我一直比较感兴趣,终于看到相关的文章分享了!
有9位网友表示赞同!
学习新技术总是很让人兴奋,期待这篇博客能让我了解更多关于Nginx和 Tomcat的配合!
有18位网友表示赞同!
我觉得这篇文章一定对我的项目开发很有帮助!
有16位网友表示赞同!