tomcat+nginx配置websocket

第一步:

tomcat配置:

<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener SSLEngine="on" className="org.apache.catalina.core.AprLifecycleListener" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
  <GlobalNamingResources>
    <Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase" />
  </GlobalNamingResources>
  <Service name="Catalina">
    <Connector connectionTimeout="20000" port="8091" protocol="HTTP/1.1" redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    <Engine defaultHost="gzjad.gzjerryli.cn" name="Catalina">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase" />
      </Realm>
      <Host appBase="webapps" deployOnStartup="true" autoDeploy="true" name="gzjad.gzjerryli.cn" unpackWARs="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="gzjad_access_log" suffix=".txt" />
        <Context  docBase="website" path="" reloadable="false" />
      </Host>
      <Host appBase="webapps" deployOnStartup="true" autoDeploy="true" name="localhost" unpackWARs="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="localhost_access_log" suffix=".txt" />
      
       <Context  docBase="hello" path="" reloadable="false" />
    
     </Host>
    </Engine>
  </Service>
  <Service name="Catalina_wnapplet">
    <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" 
redirectPort="8445" />
    <Engine defaultHost="wnapplet.gzjerryli.cn" name="Catalina_wnapplet">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase" />
      </Realm>
      <Host appBase="/www/server/tomcat/webapps1" deployOnStartup="true" autoDeploy="true" name="wnapplet.gzjerryli.cn" unpackWARs="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="wnapplet_log" suffix=".txt" />
 
     </Host>
    </Engine>
  </Service>
</Server>

nginx配置:

server
{
 listen 80;
 listen 443 ssl http2;
 server_name www.***.com;
 index index.php index.html index.htm default.php default.htm default.html;
 root /www/server/tomcat/webapps1/你的项目;
 
 #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
 #error_page 404/404.html;
 ssl_certificate    /www/server/panel/vhost/cert/www.***.com/fullchain.pem;
 ssl_certificate_key    /www/server/panel/vhost/cert/www.****.com/privkey.pem;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
 ssl_prefer_server_ciphers on;
 ssl_session_cache shared:SSL:10m;
 ssl_session_timeout 10m;
 error_page 497 https://$host$request_uri;
 #SSL-END
 
 #ERROR-PAGE-START  错误页配置,可以注释、删除或修改
 #error_page 404 /404.html;
 #error_page 502 /502.html;
 #ERROR-PAGE-END
 
 #PHP-INFO-START  PHP引用配置,可以注释或修改
 #清理缓存规则
 location ~ /purge(/.*) {
 proxy_cache_purge cache_one $host$1$is_args$args;
 #access_log  /www/wwwlogs/www.***.com_purge_cache.log;
 }
 #引用反向代理规则,注释后配置的反向代理将无效
 include /www/server/panel/vhost/nginx/proxy/www.***.com/*.conf;
 include enable-php-00.conf;
 #PHP-INFO-END
 
 #REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
 include /www/server/panel/vhost/rewrite/www.***.com.conf;
 #REWRITE-END
 
 #禁止访问的文件或目录
 location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
 {
 return 404;
 }
 
 #一键申请SSL证书验证目录相关设置
 location ~ \.well-known{
 allow all;
 }
 
 access_log  /www/wwwlogs/www.***.com.log;
 error_log  /www/wwwlogs/www.***.com.error.log;
}

反向代理:
#PROXY-START/
location /
{
 expires 12h;
 if ($request_uri ~* "(php|jsp|cgi|asp|aspx)")
 {
 expires 0;
 }
 proxy_pass http://www.***.com:8080/你的项目/;
 proxy_set_header Host $host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header REMOTE-HOST $remote_addr;
 
 #持久化连接相关配置
 proxy_connect_timeout 30s;
 proxy_read_timeout 86400s;
 proxy_send_timeout 30s;
 proxy_http_version 1.1;
 proxy_set_header Upgrade $http_upgrade;
 proxy_set_header Connection "upgrade";
 add_header X-Cache $upstream_cache_status;
 
 #Set Nginx Cache
 
  add_header Cache-Control no-cache;
}
location /你的项目/webSocket
{
 expires 12h;
 if ($request_uri ~* "(php|jsp|cgi|asp|aspx)")
 {
 expires 0;
 }
 proxy_pass http://www.***.com:8080/wssdemo/webSocket;
 
 #持久化连接相关配置
 proxy_connect_timeout 30s;
 proxy_read_timeout 86400s;
 proxy_send_timeout 30s;
 proxy_http_version 1.1;
 proxy_set_header Upgrade $http_upgrade;
 proxy_set_header Connection "upgrade";
 add_header X-Cache $upstream_cache_status;
 
 }
#PROXY-END/


如果想80端口强制跳转443:

加上这:
server {
 listen 80;
 server_name  www.***.com;
 rewrite ^ https://$http_host$request_uri? permanent;
 if ($http_x_forwarded_proto = 'http'){
 return 301 https://$host$request_uri;
 }
}

前端配置:


<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
 <meta charset="utf-8"></meta>
 <title>websocket集群</title>
</head>
<body>
本服务端口号:[[${port}]],使用redismq实现websocket集群<br/>
[[${topic}]] 频道 聊天中。。。<br/>
<input id="input_id" type="text" /><button onclick="sendMessage()">发送</button>    <button onclick="closeWebsocket()">关闭</button>
<div id="message_id"></div>
</body>
<script type="text/javascript">
 document.getElementById('input_id').focus();
 var websocket = null;
 //当前浏览前是否支持websocket
 if("WebSocket" in window){
 var url = "wss://www.***.com/你的项目/webSocket";
 websocket = new WebSocket(url);
 }else{
 alert("浏览器不支持websocket");
 }
 websocket.onopen = function(event){
 setMessage("打开连接");
 }
 websocket.onclose = function(event){
 setMessage("关闭连接");
 }
 websocket.onmessage = function(event){
 setMessage(event.data);
 }
 websocket.onerror = function(event){
 setMessage("连接异常");
 }
 //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
 window.onbeforeunload = function(){
 closeWebsocket();
 }
 //关闭websocket
 function closeWebsocket(){
 //3代表已经关闭
 if(3!=websocket.readyState){
 websocket.close();
 }else{
 alert("websocket之前已经关闭");
 }
 }
 //将消息显示在网页上
 function setMessage(message){
 document.getElementById('message_id').innerHTML += message + '<br/>';
 }
 //发送消息
 function sendMessage(){
 //1代表正在连接
 if(1==websocket.readyState){
 var message = document.getElementById('input_id').value;
 //setMessage(message);
 websocket.send(message);
 }else{
 alert("websocket未连接");
 }
 document.getElementById('input_id').value="";
 document.getElementById('input_id').focus();
 }
</script>
</html>



分享到: