1. 首页 > 快讯

一篇学会 Nginx与Tomcat 打配合-nginx 和tomcat

大家好,关于一篇学会 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和的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!

用户评论

花菲

看了标题感觉很有意思,我一直想学习Nginx和Tomcat怎么一起用!

    有13位网友表示赞同!

抓不住i

最近项目要用到这两种工具,正好可以看看这篇博客学习下。

    有6位网友表示赞同!

黑夜漫长

做网站开发的时候经常用到这两个,希望能学到更多实际技巧。

    有8位网友表示赞同!

情字何解ヘ

好专业sounding 的标题啊!一定很能帮到我们新手。

    有11位网友表示赞同!

青瓷清茶倾城歌

Nginx和Tomcat搭配确实挺强大的,期待看看文中详细的配置步骤。

    有12位网友表示赞同!

龙吟凤

学习学习,提升一下自己的技能!

    有18位网友表示赞同!

你身上有刺,别扎我

终于有人来分享这款组合的使用啦,感谢你!

    有13位网友表示赞同!

致命伤

我觉得这两种工具用起来很有优势,看完这篇文章后应该能理解了它的作用。

    有17位网友表示赞同!

打个酱油卖个萌

我之前听说过Nginx 和 Tomcat 的配合,但具体操作还不太了解,希望文章能够详细讲解。

    有17位网友表示赞同!

爱你的小笨蛋

很多博客都在说Nginx和Tomcat搭配的强大,希望能真正看懂原理和实践方法!

    有11位网友表示赞同!

蹂躏少女

分享的文章看起来很全面,期待学习到更多关于 Nginx 的知识。

    有20位网友表示赞同!

铁树不曾开花

这篇文章应该能让新手更快入门这两个工具的结合吧,太棒啦!

    有6位网友表示赞同!

■□丶一切都无所谓

项目开发中确实挺常用Nginx 和 Tomcat 的,希望文中能给出一些通用的案例。

    有9位网友表示赞同!

有阳光还感觉冷

学习一下这些知识总会有用处,期待文章的分享!

    有17位网友表示赞同!

半梦半醒i

看了标题感觉这篇博客很有实用价值,一定会读完的!

    有9位网友表示赞同!

墨染殇雪

希望能把Nginx 和Tomcat 的配置方法学得更加熟练!

    有10位网友表示赞同!

苏樱凉

这个话题我一直比较感兴趣,终于看到相关的文章分享了!

    有9位网友表示赞同!

我没有爱人i

学习新技术总是很让人兴奋,期待这篇博客能让我了解更多关于Nginx和 Tomcat的配合!

    有18位网友表示赞同!

惦着脚尖摘太阳

我觉得这篇文章一定对我的项目开发很有帮助!

    有16位网友表示赞同!

本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.iotsj.com//kuaixun/7472.html

联系我们

在线咨询:点击这里给我发消息

微信号:666666