Google+ Followers

2017年6月15日 星期四

透過 Nginx proxy_pass 架構,進行 Service migration

有一個舊網站已活了數年,改造的方向不外乎提升 SEO、移除不需要的檔案、增加系統安全、架構拆分,或是基本的 Web Framework 的抽換使用等等。對於一個 IoT 產業來說,包袱多多,像是 device 不見得會更新到新版,更別說會跟隨 HTTP 301/302 去取得新資源,甚至新網站的開發還沒辦法一步到位全部切換,只好透過 Nginx proxy_pass 架構去處理相容並扛流量了。

在此使用 upstream 管理舊機器們,並且添加新的 log format 多紀錄 $upstream_addr 資訊以便後續維護:

log_format add_proxy_pass '$remote_addr - $remote_user [$time_local] [=$upstream_addr=] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';

resolver 8.8.8.8;
upstream oldserver {
hostname1;
hostname2;
hostname3;
}


後續,都是在 nginx server {} 定義範圍下。

更改 log 記錄格式:

access_log  /var/log/nginx/access.log add_proxy_pass;

預期 http client 能處理 HTTP 301/302 的服務位置,給予更佳的 SEO URL:

location ~ old_page\.php$ {
return 301 $scheme://$host/new/page/;
}


對於不能用 HTTP 301/302 的,則改用 proxy_pass 機制:

location ~ ^/old/resource {
proxy_pass http://oldserver$uri;
}


對於,有些文件很清楚要更改內文關鍵字的,可以善用 ngx_http_sub_module:

location /old/resource/file\.json {
proxy_pass http://oldserver$uri;
sub_filter_types *;
sub_filter_once off;
sub_filter '//old.hostname/' '//cdn.hostname/';
}


也可以順順換成 CDN 架構囉。

2017年6月14日 星期三

AWS 筆記 - AWS ELB 與 Nginx 之 DOS 惡意攻擊者的處理方式

這個緣由是這樣的,有一台 Server 被狂打,但架構是:

Remote client <-> AWS ELB <-> Web server (Nginx) <-> Application

當有用戶非常好心地發大量 request 來檢查機器漏洞,若 Nginx 預設都沒多做設定,那 access.log 都會只記錄到 AWS ELB IP ,也就是不能把 access.log 紀錄的 IP 拿來 ban ,會變成 ban 掉 ELB。

而 AWS 提供的 Security group 預設是從 Allow 的角度,若要特意 ban 掉某個 IP 會有點難搞,例如要改寫防火牆規則,因此,最後就改成從實體 server 去阻擋遠端 client request 了。

步驟一:先讓 Nginx 可以記錄到真實的 remote ip

/etc/nginx/nginx.conf

http {
    # ...
    real_ip_header X-Forwarded-For;
    set_real_ip_from 0.0.0.0/0;

    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 的 remote_addr 就可以不是 AWS ELB IP 了。

步驟二:用 Nginx 去 deny ip

/etc/nginx/conf.d/your-service.conf

server {
  # ...
  deny RemoteIP;
  # ...
}


這樣設定後,在用 sudo nginx -t 檢查語法後,就可以啟用了

在此不用 iptables 去阻擋的主因是封包進來的 IP 都是 AWS ELB ,所以才改從 Nginx/App 這層取阻擋。缺點就是 access.log 還是一直肥,好處是可以觀察 access.log 看看對方是不是放棄攻擊了?XD

未來若碰到 DDOS 就...

2017年5月31日 星期三

[Linux] cross compile tmux for Synology DS216play via DSM 6.1 Tool Chains - STMicroelectronics Monaco Linux 3.10.102 @ Ubuntu 16.04 64bit

連假最後一天跑來把玩一下 cross compiler ,想說未來應該會越來越常用 NAS 做事,覺得裡頭沒有個 tmux/screen 很煩,然而,等了很久還是沒人為 DS216play 編譯 tmux ,一直很搞不懂,直到我翻了這張表出來:

https://www.synology.com/en-global/knowledgebase/DSM/tutorial/General/What_kind_of_CPU_does_my_NAS_have

System Model CPU Model Cores Threads FPU Package Arch RAM
DS216play STM STiH412 Dual Core 2 Yes Monaco DDR3 1 GB

好的,看起來有點冷門的 STM STiH412/Monaco 囧,不過找一些討論串才知道,由於要讓 DS216play 可以做一些多媒體影音的事,所以,就別抱怨了 XD

下載 Tool chains: https://sourceforge.net/projects/dsgpl/files/DSM%206.1%20Tool%20Chains/STMicroelectronics%20Monaco%20Linux%203.10.102/

$ wget https://sourceforge.net/projects/dsgpl/files/DSM%206.1%20Tool%20Chains/STMicroelectronics%20Monaco%20Linux%203.10.102/monaco-gcc493_glibc220_hard-GPL.txz/download -O monaco-gcc493_glibc220_hard-GPL.txz
$ tar -xvf monaco-gcc493_glibc220_hard-GPL.txz
$ tree -L 1 arm-unknown-linux-gnueabi/
arm-unknown-linux-gnueabi/
├── arm-unknown-linux-gnueabi
├── bin
├── build.log.bz2
├── include
├── lib
├── libexec
└── share


前置環境:

$ sudo apt install make python gcc
$ chmod 755 $HOME/arm-unknown-linux-gnueabi $HOME/arm-unknown-linux-gnueabi/include $HOME/arm-unknown-linux-gnueabi/lib $HOME/arm-unknown-linux-gnueabi/bin $HOME/arm-unknown-linux-gnueabi/share


編譯 ncurses:

$ wget ftp://invisible-island.net/ncurses/ncurses.tar.gz
$ tar -xvf ncurses.tar.gz
$ cd ncurses-5.9
$ PATH=$PATH:$HOME/arm-unknown-linux-gnueabi/bin CC=$HOME/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi-gcc CFLAGS="-I$HOME/arm-unknown-linux-gnueabi/include"  ./configure --host arm-unknown-linux-gnueabi --prefix=$HOME/arm-unknown-linux-gnueabi
$ PATH=$PATH:$HOME/arm-unknown-linux-gnueabi/bin make
$ PATH=$PATH:$HOME/arm-unknown-linux-gnueabi/bin make install


編譯 libevent:

$ wget https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz
$ tar -xvf libevent-2.1.8-stable.tar.gz
$ cd libevent-2.1.8-stable
$ PATH=$PATH:$HOME/arm-unknown-linux-gnueabi/bin CC=$HOME/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi-gcc CFLAGS="-I$HOME/arm-unknown-linux-gnueabi/include"  ./configure --host arm-unknown-linux-gnueabi --prefix=$HOME/arm-unknown-linux-gnueabi
$ PATH=$PATH:$HOME/arm-unknown-linux-gnueabi/bin CC=$HOME/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi-gcc CFLAGS="-I$HOME/arm-unknown-linux-gnueabi/include"  make
$ PATH=$PATH:$HOME/arm-unknown-linux-gnueabi/bin make install


編譯 tmux:

$ wget https://github.com/tmux/tmux/releases/download/2.5/tmux-2.5.tar.gz
$ tar -xvf tmux-2.5.tar.gz
$ cd tmux-2.5
$ PATH=$PATH:$HOME/arm-unknown-linux-gnueabi/bin CC=$HOME/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi-gcc CFLAGS="-I$HOME/arm-unknown-linux-gnueabi/include -I$HOME/arm-unknown-linux-gnueabi/include/ncurses" LDFLAGS="-L$HOME/arm-unknown-linux-gnueabi/lib" ./configure --host arm-unknown-linux-gnueabi --prefix=$HOME/arm-unknown-linux-gnueabi
$ PATH=$PATH:$HOME/arm-unknown-linux-gnueabi/bin make
$ file tmux
tmux: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.32, not stripped


or:

$ PATH=$PATH:$HOME/arm-unknown-linux-gnueabi/bin CC=$HOME/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi-gcc CFLAGS="-I$HOME/arm-unknown-linux-gnueabi/include -I$HOME/arm-unknown-linux-gnueabi/include/ncurses" LDFLAGS="-L$HOME/arm-unknown-linux-gnueabi/lib" ./configure --host arm-unknown-linux-gnueabi --prefix=$HOME/arm-unknown-linux-gnueabi --enable-static
$ PATH=$PATH:$HOME/arm-unknown-linux-gnueabi/bin make
...
...
cmd-string.o: In function `cmd_string_split':
cmd-string.c:(.text+0x820): warning: Using 'getpwnam' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
cmd-string.c:(.text+0x760): warning: Using 'getpwuid' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
$HOME/arm-unknown-linux-gnueabi/lib/libevent.a(evutil.o): In function `test_for_getaddrinfo_hacks':
evutil.c:(.text+0x1be8): warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
$HOME/arm-unknown-linux-gnueabi/lib/libevent.a(evutil.o): In function `evutil_unparse_protoname':
evutil.c:(.text+0x1554): warning: Using 'getprotobynumber' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
$HOME/arm-unknown-linux-gnueabi/lib/libevent.a(evutil.o): In function `evutil_parse_servname':
evutil.c:(.text+0x14a0): warning: Using 'getservbyname' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
$ file tmux
tmux: ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, not stripped


收工

2017年5月28日 星期日

ASUS X556U 更換 SSD 筆記

mainboard

前幾天室友的 ACER 4810TZG 掛了,於是乎人生中第二台 ASUS 的筆電入手,找了許久不想買太舊也不想買太新,就挑了個接近兩萬且大螢幕的 ASUS X556U ,其特色是 CPU 是 i5-6198UD 吧,看起來不差勁 XD 可惜預設是 HDD 就真的悲劇了點,按了電源後到進入 Windows 10 桌面,大概要 3-5 分鐘吧,所以,讓我想把舊筆電的 120GB SSD 拿來頂用,果然效果奇佳,開機就不到 10 秒進入到 Windows 10 桌面。筆記一下做了哪些事:

首先,是下載 Windows 10 ISO 並製作成 USB 開機碟,找了良久,原來當年可以從微軟官網透過簡單的 JS Code 可下載各種版本的 Windows ISO 的部分已被拿掉,但在 macOS 環境上還是可以輕鬆下載 ISO - https://www.microsoft.com/zh-tw/software-download/windows10ISO, 而在 Windows 上會被引導下載 MediaCreationTool.exe 工具,就透過 MediaCreationTool.exe 引導而製作 USB 開機碟。

如此一來,就只剩下換掉硬碟的部分,先上網隨便找個 ASUS 筆電看一下,才知道換硬碟真麻煩,主因是螺絲有一個躲在墊子下方,而就算所有螺絲都弄下來,拆殼還是很麻煩 Orz 後來,某天晚上終於牙一咬動手了

step01 step02

先拆座墊!在拆記憶體旁的螺絲,就開始用一字慢慢橇開背殼,自己手工很差,所以都會有刮傷,反正自用啦 XD

step03 affected

如此一來,就看到硬碟所在之處,在拆兩個螺絲、拆掉兩邊排線後,再把旁邊的小板拿起來就可換硬碟了!

subboard disk-move

2017年5月22日 星期一

[macOS] m3u/m3u8 -> grep -> xargs -> wget -> ffmpeg: ts -> mp4

目的是把 m3u8 的資料備份,接著又覺得檔案一堆,不如就用 ffmepg 轉 mp4 ,久久用一次,又忘得差不多。

連續動作:

$ wget http://.../index.m3u8 -O index.m3u8
$ grep -v "#" index.m3u8 | xargs wget
$ vim index.m3u8
:%s/http[^\/]+//g
:%s/?.*//g
$ grep -v "#" index.m3u8 | tr -d '\r' | awk '{cmd="mv "$1"* "$1; print cmd}'
$ grep -v "#" index.m3u8 | tr -d '\r' | awk '{cmd="mv "$1"* "$1; system(cmd)}'
$ ffmpeg -i index.m3u8 -vcodec copy -acodec copy -bsf:a aac_adtstoasc out.mp4