情景说明

学校部署了城市热点的服务,但是,领导不想让学生看到服务器的 IP,想给服务一个域名。但是,服务部署在 8080 端口。领导也不想让学生看到端口。

城市热点的人员考虑采用重新部署应用的方式,不过,似乎他用了很长的时间也没有搞定。然后我就里所应当的用了他从学校那里申请的虚拟机了。

嘛,虚拟机不是给我玩的,我的方案是采用 Nginx 进行反向代理。随便加上缓存、限速啥的。

在 CentOS 上安装 Nginx

在 CentOS 上安装 Nginx 可真麻烦,也许是虚拟机的 CentOS 版本太旧。反正没有 Debian、Ubuntu 用的舒服。

使用以下命令进行安装:

yum install -y nginx

恭喜,这是不可行的。你会被提示没有 Nginx 这个包。如果你不甘心,使用了以下命令:

yum search nginx

你会发现根本没有 Nginx,即使你随便安装了一个长的比较像的,也是不对的。

你要在 /etc/yum.repos.d 下添加一个 nginx.repo 文件,里面的内容如下:

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

然后就可以开心的执行安装命令了。

yum install -y nginx

配置代理

这里直接贴上我的配置文件,我是不是泄露了一些信息。嘛,我也不担心你会渗透到服务器里,反正是学校内网,你又进不来。除非你也是安农的。话说,自己人黑自己人有意思吗。

server{
    listen 0.0.0.0:80;
    listen [::]:80;
    server_name ss.ahau.edu.cn;

    proxy_set_header Host $host:$server_port;
    proxy_set_header Remote_Addr $remote_addr;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Access-Control-Allow-Origin *;
    proxy_http_version 1.1;
    add_header Access-Control-Allow-Origin *;

    location / {
        access_log off;
        log_not_found off;
        rewrite ^.*$ http://ss.ahau.edu.cn/Self/;
    }
    location ~* \.(css|js|png|jpg|jpeg|ico|icon|gif) {
        access_log /var/log/nginx/access-static.log;
        error_log /var/log/nginx/error-static.log;
        proxy_cache web;
        proxy_cache_valid 200 304 7d;
        proxy_cache_valid 404 500 10m;
        add_header ProxyCache "$upstream_cache_status";
        proxy_pass http://114.213.145.140:8080;
    }
    location ~^/Self/login/verify$ {
        access_log /var/log/nginx/access-login.log;
        error_log /var/log/nginx/error-login.log;
        proxy_pass http://114.213.145.140:8080;
    }
    location ~^/Self.*$ {
        access_log /var/log/nginx/access-other.log;
        error_log /var/log/nginx/error-other.log;
        proxy_pass http://114.213.145.140:8080;
    }
}

我在这里配置缓存,除了缓存、日志那里我明白一切,其他部分感觉都有问题。但是,只有这样它工作了,如预期一般工作了。你可以进行各种更改尝试,反正只有这样写,location 的顺序也是这样的,它才会工作。

配置缓存

配置缓存,将各种静态文件缓存到虚拟机里,而且缓存到虚拟机的内存里。没错,内存里,内存大就是可以为所欲为。

不仅可以加速学生的访问,而且可以非常明显的减少真实服务器的压力。虽然它的抗压能力估计比虚拟机更好。

proxy_temp_path /var/lib/nginx/cache_temp;
proxy_cache_path /var/lib/nginx/cache levels=1:2 keys_zone=web:200m max_size=900m inactive=7d;

上面的一段要在 http 字段里设置,然后在 http 字段里的 server 下进行如下配置

proxy_cache web;
proxy_cache_valid 200 304 7d;
proxy_cache_valid 404 500 10m;
add_header ProxyCache "$upstream_cache_status";
proxy_pass http://114.213.145.140:8080;

配置限速

配置限速是为了防止有人进行大规模的密码爆破行为。因为城市热点的系统传输数据没有加密。没有加密不仅意味着可以进行嗅探,还可以进行密码爆破。一旦这个系统的密码被破解了,校园网的密码也就被破解了。这是绝对不能发生的。

嘛,估计没人会这样做,除了我……

limit_conn_zone $binary_remote_addr zone=proxy_conn:10m;
limit_conn proxy_conn 8;
limit_rate 200k;
limit_rate_after 10m;

不知道为啥,只能限制每个 IP 的连接数,不能限制并发数。一旦限制并发数,页面就无法加载。

踩坑

proxy_set_header Host $host:$server_port;

看到这一行了没,注意,没了它就完了。而且,我现在也不知道为啥要这样写。