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服务启动成功!");  
    }  


}