情丿本是债 发布的文章

记一次通过Nginx为移动端和PC端返回不同页面内容且不影响的URL的处理方案

首先说下需求,由于WEB没写响应式页面,而是写了独立的PC和移动页面,导致必须要通过其他方式判断用户设备并且给出相应内容

初步的解决方案是

  • 通过前端JS跳转
  • 额外写一个index 隐藏跳转过程和url,根据用户UA加载移动端或者PC端代码
  • 通过服务端判断用户UA 返回不同内容

讨论结果是

  1. 通过前端JS跳转会导致移动端URL暴露,在用户做二次分享的时候体验也不好
  2. 额外写一个index来动态加载代码的方法我觉得挺棒的,但是前端太懒了不想写
  3. 通过Nginx判断UA 返回内容,并且保证URL不变

好吧那就开写

先交代服务器情况 /home/www/ 是根目录 PC代码在test里 移动端代码在 test/mobile里

最先用的 if 里嵌套 alias 的方法 代码如下(注意:这种代码是错误的)

location /test/ {
 
if ( $http_user_agent ~ "(iPhone)|(Android)" ){
        alias /home/www/test/mobile/;
}

但是Nginx提示这种语法不支持。。。。
报错内容

nginx: [emerg] "alias" directive is not allowed here in /etc/nginx/sites-enabled/default:49

关于if的各种坑,可以查看 https://xwsoul.com/posts/761?tdsourcetag=s_pctim_aiomsg
感觉写的还不错

然后咨询和讨论得到两种解决方法

  1. 通过 rewrite 和 location 做两次处理
  2. 通过 if 内嵌变量,然后把用alias+变量的方法间接处理

上代码

方案一

    location ~ ^/test(/.*) {
    set $way $1;
            if ( $http_user_agent ~ "(iPhone)|(Android)" ){
        rewrite ^ fuckurl$way;
    }
}

location fuckurl/ {
    internal;
    alias /home/www/test/mobile/;
}

方案二

location /test/ {
set $getdir "/home/www/test/";
            if ( $http_user_agent ~ "(iPhone)|(Android)" ){
        set $getdir "/home/www/test/mobile/";
    }
alias $getdir;
}

都实测过了,代码能用

Proxmox 第一次部署经历

由于要去托管一台机器,由于机房运维方式过于古老,如果直接在机器系统上操作,出了问题需要找客服来手动维修,所以考虑使用虚拟化方案,最先本来只了解到QEMU Docker LXC 等方案。咨询学长后了解到Proxmox的解决方案,它可以一次性管理Kvm和LXC的虚拟化方案,同时提供图形化界面,而且经过使用后,真的觉得其易用性非常到位。

首先是安装:
系统基础平台使用Debian9.4,安装参考

https://pve.proxmox.com/wiki/Install_Proxmox_VE_on_Debian_Stretch

首先是修改主机名
一定要按照要求改,例如主机名为 49tql 公网IP是49.49.49.49
那么一定要添加

49.49.49.49 49tql.proxmox.com 49tql pvelocalhost

这个浪费了我几个小时。

然后开始加入他的源,

echo "deb [arch=amd64] http://download.proxmox.com/debian/pve stretch pve-no-subscription" > /etc/apt/sources.list.d/pve-install-repo.list

下载GPG

wget http://download.proxmox.com/debian/proxmox-ve-release-5.x.gpg -O /etc/apt/trusted.gpg.d/proxmox-ve-release-5.x.gpg

开始更新

apt update && apt dist-upgrade

开始正式安装

apt install proxmox-ve postfix open-iscsi

会让你选择一个邮件服务器的什么玩意,不知道是啥,按照他的提示,如果不知道,就选local only

然后,重启服务器

reboot

重启后应该就能打开它的web管理页面了

注意页面是https

https://49.49.49.49:8006

进去后先加网桥,
名称 vmbr0
IP地址 192.168.3.1自己想个内网
掩码 255.255.255.0自己写
桥接端口 eno0写你的网卡名字

其他都不要填

然后开NAT 和 IP转发

iptables -t nat -I POSTROUTING -s 192.168.3.0/24 -o eno1 -j MASQUERADE

echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/50-ip_forward.conf && sysctl -p --system

接下来是把刚才的iptables持久化

apt install netfilter-persistent iptables-persistent
netfilter-persistent save

然后就可以开小鸡了,KVM 的直接下载官方安装镜像,放到 /var/lib/vz/template/iso
然后挂载成CD后进虚拟机开始安装。

小鸡里面静态IP写刚才的内网IP段内的,网关也写刚才那里面的 192.168.3.1 (这个可以自定义网段)。

好像差不多就这样了,剩下的还有端口转发,也用iptab写,我还没操作。先去买服务器了

聊聊重邮的内网和外网

什么是内网?

局域网(Local Area Network, LAN)

注:为了信息安全,隐藏了内网相关敏感信息,如果需要,请内网查看:

http://gogs.sret1.st.tn/SRE2017/wiki/wiki/%E8%81%8A%E8%81%8A%E9%87%8D%E9%82%AE%E7%9A%84%E5%86%85%E7%BD%91%E5%92%8C%E5%A4%96%E7%BD%91

参考链接

  1. https://zh.wikipedia.org/wiki/%E5%B1%80%E5%9F%9F%E7%BD%91
  2. https://baike.baidu.com/item/%E5%B1%80%E5%9F%9F%E7%BD%91/98626

局域网(LAN)是一个可连接住宅,学校,实验室,大学校园或办公大楼等有限区域内计算机的计算机网络 [1]。相比之下,广域网(WAN)不仅覆盖较大的地理距离,而且还通常涉及固接专线和对于互联网的链接。 相比来说互联网则更为广阔,是连接全球商业和个人电脑的系统。

按照标准,局域网被分配了指定段的IP,专门用于局域网连接,。也就是说,这些IP,在公网上是不会被使用的,你可以自由的分配使用这些IP。

  1. 10.0.0.0/8 地址范围:10.0.0.0 至 10.255.255.255 共有2的24次方个地址
  2. 172.16.0.0/12 地址范围:172.16.0.0 至 172.31.255.255 共有2的20次方个地址
  3. 192.168.0.0/16 地址范围:192.168.0.0 至 192.168.255.255 共有2的16次方个地址
  4. 100.64.0.0/16 这是留给运营商做局域网的IP段,一般我们不用

对于重邮来说,我们有一个内网,重邮内网的范围是多少呢?

(为了安全,这一段隐藏了)

其中 2 6 是符合IP分配标准的

剩下的几个呢?

其实,其中1 3 4 5 是没有问题的。

为什么呢?

因为这些公网IP其实是属于重邮的(好像是吧,第一个肯定是,后面三个好像是电信租给重邮的)

这些IP段就可以同时从公网和内网访问

这些IP通过内网直连,而不绕行公网,是有好处的。

  1. 他可以节约公网流量,甚至我们不需要公网就可以打开这些网站。而且,他可以跑满带宽,这个跑满不是指的你买的带宽,而且指的网线、交换机、路由器的硬件限制。
  2. 其中类似于教务在线,为了信息安全 xxx.xxx.xxx.xxx(为了安全,这一段隐藏了) 他屏蔽了从公网来的请求

但是呢,最后的7 8 9 是有问题的,这两个段的IP 被分配给 WIFI局域网 但是他的所有者是谁呢,我们来查一下

http://rwhois.he.net/whois.php?query=172.32.0.0

OrgName:        T-Mobile USA, Inc.
OrgId:          TMOBI
Address:        12920 SE 38th Street
City:           Bellevue
StateProv:      WA
PostalCode:     98006
Country:        US
RegDate:        2003-01-02
Updated:        2017-01-28

所以,这家美国公司躺枪了,所有从我校本来应该访问到美国的流量,居然被指向了内网。

那,我们能怎么办呢?我们只能在心里画圈圈。

聊完这些,我们来谈谈如何连接内网:

附:有些说寝室网线插上没网的,寝室只有一根网线是入户线,很多寝室室内提前安好三根分线,需要自己接交换机。

没办网或者电信用户教程

第一步:把寝室入户的网线插入交换机(还有些人喜欢叫他分线器)如果你寝室里只有里一个人用网线,你也可以不插交换机

第二步:从交换机接一根线到你的电脑里

大功告成了,剩下的IP地址分配等事情,内网上的DHCP服务器会帮你解决好。(有些楼栋的DHCP服务器无法为linux系统分配IP,这个有点迷,无解。。。)

没办电信网?不存在的,都说了内网不收费的,插上网线就能用。
如果里有电信网,也是直接使用内网就OK了,没有影响,电信客户端会帮你解决这些问题。

移动和联通用户如何使用呢?(或者手机开热点)

1. 断开电脑所有连接(这是为了好找活动连接,如果自己找得到,可以不用全部断开),插上移动网卡并连接网络(或者连接上手机热点)
2. 修改移动网卡的跃点数
进入相关设备的网络设置,再进入internet TCP/IP的属性设置,再进入高级属性设置

默认情况下是勾选的“自动跃点”,不要选择它,手动输入“接口跃点数”:10。

输入的数字越小,优先级越高,这样可以手动控制哪个路由的优先级了
然后插上寝室网线
3. 先下载脚本,然后插上内网网线,最后执行内网路由表修改脚本

(外网下载地址:(为了安全,这一段隐藏了))

自动检测服务器使用流量并执行命令脚本

#coding=utf-8

limit_total=0# limit_total 上传+下载的流量限制,单位GB,如果不限制就是0,如果限制1T就是1024
limit_in=0# limit_in 下载的流量限制,单位GB,如果不限制就是0,如果限制1T就是1024
limit_out=0# limit_out 上传的流量限制,单位GB,如果不限制就是0,如果限制1T就是1024
sleep=60#多久检查一次,单位是秒


import os
import time
NET_IN = 0
NET_OUT = 0

while True:
    vnstat=os.popen('vnstat --dumpdb').readlines()
    for line in vnstat:
        if line[0:4] == "m;0;":
            mdata=line.split(";")
            NET_IN=int(mdata[3])/1024
            NET_OUT=int(mdata[4])/1024
            break

    kill="这里写你要执行的命令"
    if (limit_total != 0 and (NET_IN+NET_OUT)>=limit_total):
        os.system(kill)
        break
    elif (limit_in != 0 and NET_IN>=limit_in):
        os.system(kill)
        break
    elif (limit_out != 0 and NET_OUT>=limit_out):
        os.system(kill)
        break

    time.sleep(sleep)

yum install -y epel-release yum install -y vnstat service vnstat start
chkconfig vnstat on

nohup python xxx.py &

ubuntu 16.04 磁盘RAID 挂载 mdadm

在没有硬件RAID卡的情况下,我们有时候需要使用软RAID来处理一些简单需求,这其中主要是RAID 1 和 RAID 0 。其他更多的RAID模式,由于涉及到大量的运算工作,计算性能、内存,甚至供电保护都有要求,还是是建议使用专业的RAID卡来处理这些问题。

lsblk -o NAME,SIZE,FSTYPE,TYPE,MOUNTPOINT

首先,通过上面这个指令,查看磁盘的使用情况

mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sda /dev/sdb

/dev/md0 是设备名 到时候会用这个挂载
level 是等级,RAID几就是 几

后面是磁盘数量和磁盘 可以用物理磁盘,也可以是逻辑分区

cat /proc/mdstat  #查看所有RAID阵列的大概情况
mdadm -D /dev/md0 #查看某个RAID阵列的详细情况