Spring Boot + Java爬虫 + 部署到Linux(八、Nginx实现反向代理、动静分离和websocket处理)

    Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。所以,我们就用Nginx来实现反向代理和动静分离的功能。

    反向代理,通过搜索、百科也可以大概知道。不过因为同为代理,所以总是和正向的代理区分不了。我的理解就是一个是对服务器的,一个是对客户端的。正向代理和反向代理都是客户将请求发向代理服务器,然后代理服务器再将请求发送给目标服务器,同时获得响应内容,再返回给客户。正向的就是客户端配置的,反向就是服务器配的,对用户透明的。

    首先下载Nginx,很小的轻量应用。下载完毕之后,可以先试一下。直接打开nginx.exe,然后一个窗口一闪而过,打开任务管理器可以看到有nginx的进程。然后浏览器打开localhost,就可以看到一个index界面了。这个就是安装目录下面的html/index.html。如果发现窗口(默认是80)被占用,可以使用命令行netstat -ano |findstr ":port"来查。如果是一些特殊进程占了,百度解决方法。如果是一般进程占了,可以直接杀掉就行了。

    打开安装目录下面的conf目录下面的nginx.conf。反向代理实现非常简单,在文件的 location / (代表所有的请求),把自带的两行去掉,加上一行“proxy_pass http://127.0.0.1:8080;  ”其中http://127.0.0.1:8080就是spring boot项目的服务器的地址。然后把spring boot启动了,再直接访问127.0.0.1或者localhost就可以看到效果了。

    实现动静分离也很简单,动静分离就是静态内容就由nginx直接返回。动态的内容,才用代理。我们可以在location /{}的下面加上

location ~\.(js|css|png|html)$ {
            
            root D:/eCrawler/src/main/resources/static;
			#实际路径为root+url
		}

首先~是区分大小写的正则匹配,\是对 . 进行转义,和后面小括号里的组成后缀名。$表示结束位置。这个location的意思就是碰到以.js,.css,.png,.html结束的访问都从root 下面去返回。root的内容,就是我们这些资源的根路径,可以像这样用绝对路径,也可以用相对路径(比如../)。如果是spring boot并且将静态资源放到/src/main/resources/static位置的话,一般这样就行了。那个注释的意思就是,假如我们访问的是localhost/js/jquery.js,那么nginx会去找配置的root/js/jquery.js这个文件,然后返回。

然后至于为啥访问这些资源不直接用上面的location /通配的,这是因为当多个匹配都满足时通配的优先级最低。遵循的原则就是越精确,越匹配。同样精确,匹配到第一个就结束了。具体的可以参考nginx匹配规则。

当这些都配完之后,发现websocket用不了,建立不了连接。然后去nginx官网看了一下解决方法。就直接粘贴过来了。

http {
    include       mime.types;
    default_type  application/octet-stream;
	map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            #root   html;
            #index  index.html index.htm;
			proxy_pass http://127.0.0.1:8080;
			proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;		
			proxy_read_timeout 3600s;
        }
		location ~\.(js|css|png|html)$ {

            root G:/eCrawler/src/main/resources/static;
			#实际路径为root+url
		}........................................................

其中proxy_read_timeout是超时时间,如果不设置,默认是一分钟好像。就是保持连接这么长的时间,双方都没有发送消息,就断开连接。原来的我嫌慢,就设了一个小时。如果一个小时没动静,就强制断开连接。同时spring boot那边也会报相应的异常。

配置好文件之后,在命令行下执行nginx -s reload就会重新加载配置文件了。执行nginx -s stop 就结束了。其中-s是signal的意思。可以用nginx -h查看更多命令。

这时候,保持着nginx和spring boot都打开着,直接访问localhost,就可以看到效果了。如果样式没有,说明静态文件配错了,如果websocket没反应,则是相关配置缺少。

Nginx还有很多强大的功能,比如负载均衡啊之类的,但在这用不到。可以搜索尝试。

你可能感兴趣的:(Spring,Boot)