Nginx
Install Nginx at windows
添加服务
需要借助"Windows Service Wrapper"小工具,下载地址: http://repo.jenkins-ci.org/releases/com/sun/winsw/winsw/1.18/winsw-1.18-bin.exe
下载后放在nginx目录下,并修改名字为nginx-service.exe
创建配置文件nginx-service.exe.config 和 nginx-service.xml
nginx-service.xml的内容如下:
<service>
<id>nginx</id>
<name>Nginx Service</name>
<description>High Performance Nginx Service</description>
<logpath>C:\nginx-1.14.0\logs</logpath>
<log mode="roll-by-size">
<sizeThreshold>10240</sizeThreshold>
<keepFiles>8</keepFiles>
</log>
<executable>C:\nginx-1.14.0\nginx.exe</executable>
<startarguments>-p C:\nginx-1.14.0</startarguments>
<stopexecutable>C:\nginx-1.14.0\nginx.exe</stopexecutable>
<stoparguments>-p C:\nginx-1.14.0 -s stop</stoparguments>
</service>
nginx-service.exe.config内容如下:
<configuration>
<startup>
<supportedRuntime version="v2.0.50727" />
<supportedRuntime version="v4.0" />
</startup>
<runtime>
<generatePublisherEvidence enabled="false"/>
</runtime>
</configuration>
最后用cmd命令进入nginx目录安装服务
nginx-service.exe install
最后分享一个删除服务的命令 在cmd命令输入 sc delete 服务名
location / {
proxy_pass http://localhost;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
Nginx Socket.io SpringBoot.
添加ngnix的配置
location /socket.io {
proxy_pass http://localhost:8098;
# WebScoket Support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
前端代码
socket = io.connect('http://qh.zbzl.top/?token=${loginToken}', opts);
socket.on('connect', function () {
console.log("连接成功");
serverOutput('<span class="connect-msg">连接成功</span>');
});
application.properties 代码
# netty socket io setting
#============================================================================
# host在本地测试可以设置为localhost或者本机IP,在Linux服务器跑可换成服务器IP
socketio.host=localhost
socketio.port=8098
# 设置最大每帧处理数据的长度,防止他人利用大数据来攻击服务器
socketio.maxFramePayloadLength=1048576
# 设置http交互最大内容长度
socketio.maxHttpContentLength=1048576
# socket连接数大小(如只监听一个端口boss线程组为1即可)
socketio.bossCount=1
socketio.workCount=100
socketio.allowCustomRequests=true
# 协议升级超时时间(毫秒),默认10秒。HTTP握手升级为ws协议超时时间
socketio.upgradeTimeout=1000000
# Ping消息超时时间(毫秒),默认60秒,这个时间间隔内没有接收到心跳消息就会发送超时事件
socketio.pingTimeout=6000000
# Ping消息间隔(毫秒),默认25秒。客户端向服务器发送一条心跳消息间隔
socketio.pingInterval=25000
springboot 代码
@Configuration
public class SocketIOConfig {
private Logger log = LoggerFactory.getLogger(SocketIOConfig.class);
@Autowired
RedisCacheUtil<TUser> sharededJedisTemplate;
@Value("${socketio.host}")
private String host;
@Value("${socketio.port}")
private Integer port;
@Value("${socketio.bossCount}")
private int bossCount;
@Value("${socketio.workCount}")
private int workCount;
@Value("${socketio.allowCustomRequests}")
private boolean allowCustomRequests;
@Value("${socketio.upgradeTimeout}")
private int upgradeTimeout;
@Value("${socketio.pingTimeout}")
private int pingTimeout;
@Value("${socketio.pingInterval}")
private int pingInterval;
/**
* 以下配置在上面的application.properties中已经注明
* @return
*/
@Bean
public SocketIOServer socketIOServer() {
SocketConfig socketConfig = new SocketConfig();
socketConfig.setTcpNoDelay(true);
socketConfig.setSoLinger(0);
com.corundumstudio.socketio.Configuration config = new com.corundumstudio.socketio.Configuration();
config.setSocketConfig(socketConfig);
//config.setHostname(host);//线上部署不能有Hostname
config.setPort(port);
config.setBossThreads(bossCount);
config.setWorkerThreads(workCount);
config.setAllowCustomRequests(allowCustomRequests);
config.setUpgradeTimeout(upgradeTimeout);
config.setPingTimeout(pingTimeout);
config.setPingInterval(pingInterval);
config.setHostname(host);
config.setPort(port);
config.setTransports(Transport.POLLING, Transport.WEBSOCKET);
config.setOrigin(":*:");
config.setAuthorizationListener(new AuthorizationListener() {// 类似过滤器
@Override
public boolean isAuthorized(HandshakeData data) {
String token = data.getSingleUrlParam("token");
if(token==null) {
return false;
}
TUser tuser=sharededJedisTemplate.getCacheObject(token);
if (tuser!=null) {
log.info("SocketIO认证成功,用户[{}],Token-[{}] Address-[{}]", tuser.getUsername(), token,
data.getAddress(),data.getHttpHeaders().getAsString(""));
return true;
}
log.info("SocketIO认证失败token="+token);
return false;
}
});
final SocketIOServer socketIOServer = new SocketIOServer(config);
return socketIOServer;
}
@Bean
public SpringAnnotationScanner springAnnotationScanner(SocketIOServer socketIOServer) {
return new SpringAnnotationScanner(socketIOServer);
}
}
SocketIOCommandLineRunner
@Component
public class SocketIOCommandLineRunner implements CommandLineRunner {
private Logger log = LoggerFactory.getLogger(SocketIOCommandLineRunner.class);
private final SocketIOServer socketIOServer;
@Autowired
public SocketIOCommandLineRunner(SocketIOServer socketIOServer) {
this.socketIOServer = socketIOServer;
}
@Override
public void run(String... args) throws Exception {
socketIOServer.start();
log.info("SocketIO服务启动成功!");
}
}