Serveo.net

網址:https://serveo.net/
找 ngrok alternative 時,找到這個用 ssh 指令就可以破牆,挺方便的。

例子1

Port forwarding

在 A 電腦裡輸入

ssh -R 80:localhost:3000 serveo.net

按下 yes,會拿到一個類似 https://talis.serveo.net 的網址,當從另外一台電腦連到此網址時,會連接到 A 電腦的 port 3000

P.S. 

  1. 要拿到不一樣的網址,就帶 username,例如:ssh -R 80:localhost:8888 foo@serveo.net
  2. localhost 可以替換為其他電腦,例如 192.168.1.1

例子2

ssh port forwarding

在 A 電腦裡有 SSH server,然後輸入

ssh -R myalias:22:localhost:22 serveo.net

接著在其他電腦有 ssh client 的電腦裡輸入

ssh -o ProxyCommand="ssh -W myalias:22 serveo.net" user@myalias

就可以連接到 A 電腦的 SSH server

P.S.

  1. OpenSSH client 7.3 以後可以用 -J 參數:ssh -J serveo.net user@myalias

用 autossh 自動重連

事前預備

  1. sudo adduser –system –group –disabled-password autossh
  2. sudo chsh –shell /bin/false autossh
  3. 預先使用 autossh ,執行過一次 autossh 指令

autossh + upstart

# /etc/init/autossh.conf
# http://logan.tw/posts/2014/12/15/autossh-and-ubuntu-upstart-daemon/
description "autossh daemon for ssh tunnel"
start on net-device-up IFACE=br0 # 此處需因應網路裝置來調整為 eth0, eth1 ...
stop on runlevel [01S6]

setuid autossh
respawn
respawn limit 5 60
script
#export AUTOSSH_FIRST_POLL=30
#export AUTOSSH_GATETIME=0
#export AUTOSSH_POLL=60
autossh -M 0 -R pokemon22:22:localhost:22 serveo.net
end script

autossh + systemd

# /etc/systemd/system/autossh.service
# https://gist.github.com/thomasfr/9707568
[Unit]Description=Keeps a tunnel to 'serveo.net' open
After=network-online.target

[Service]
User=autossh
# -p [PORT]
# -l [user]
# -M 0 --> no monitoring
# -N Just open the connection and do nothing (not interactive)
# LOCALPORT:IP_ON_EXAMPLE_COM:PORT_ON_EXAMPLE_COM
# ExecStart=/usr/bin/autossh -M 0 -N -q -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -p 22 -l autossh remote.example.com -L 7474:127.0.0.1:7474 -i /home/autossh/.ssh/id_rsa
ExecStart=/usr/bin/autossh -M 0 -R pokemon22:22:localhost:22 serveo.net

[Install]
WantedBy=multi-user.target

s3proxy

網址:https://github.com/gaul/s3proxy
可以在本機端測試 S3,而不需要去開 S3 bucket 跟弄 AWS credential ,s3proxy 提供了跟 S3 一樣的 API 介面。

boto3 可以用,用法參考這邊:https://github.com/gaul/s3proxy/wiki/Client-compatibility-list

# Python3 + boto3 example
session = boto3.session.Session(aws_access_key_id='identity',
                                aws_secret_access_key='credential')
config = boto3.session.Config(s3={'addressing_style': 'path'})
# low level S3 client
client = session.client('s3', endpoint_url='http://localhost:60080',
                        config=config)
# S3 resource object
resource = session.resource('s3', endpoint_url='http://localhost:60080',
                            config=config)

用 docker 快速啟動

mkdir -p /tmp/data
docker run --publish 60080:80 -v /tmp/data:/data --env S3PROXY_AUTHORIZATION=none andrewgaul/s3proxy

django-storage 的話,應該是要改設定裡的 AWS_S3_ENDPOINT_URL

goaccess

安裝

# 最新版
echo "deb http://deb.goaccess.io/ $(lsb_release -cs) main" | sudo tee -a /etc/apt/sources.list.d/goaccess.list
wget -O - https://deb.goaccess.io/gnugpg.key | sudo apt-key add -
sudo apt update && sudo apt install goaccess

要可以使用 –keep-db-files 得安裝 goaccess-tcb

使用

詳細的使用可以看 手冊,以下是常用的用法

# Console
goaccess --log-format=COMBINED -f /var/log/apache2/access.log

# 先詢問要怎麼解析 log
goaccess -c -f /var/log/apache2/access.log

# 輸出 HTML (特定版本以後才有)
goaccess --log-format=COMBINED -f /var/log/apache2/access.log -o report.html

# 輸出 realtime HTML (特定版本以後才有)
goaccess --log-format=COMBINED -f /var/log/apache2/access.log --real-time-html -o report.htm

有多個 log (含 .gz) 的情況,可以參考 https://github.com/allinurl/goaccess/issues/600

# 先解析並存到 db
zcat /var/log/nginx/access.log*gz | goaccess -p /etc/goaccess.conf -a -o /dev/null --keep-db-files
# 從 db 載入資料,並且解析最新的 access.log
goaccess -p /etc/goaccess.conf -f /var/log/nginx/access.log --real-time-html -a -o /usr/share/nginx/html/goaccess.html --load-from-disk

Automatically generate GoAccess stats 的處理更費工,還放到 git 去,我覺得蠻值得研究的。我只大略看一下,後來沒用。

Vagrantfile 依版本給設定

上個月因為 vagrant 升級,在 Vagrantfile 裡加了 vb.default_nic_type = “virtio”,但今天同事使用 vagrant up 時,出現錯誤。原來我同事使用的是 vagrant 2.1,而我已經用 vagrant 2.2 了。

之前知道 Vagrantfile 其實是 ruby 語言,因此知道可以在裏面寫程式來處理,在網路上找看看怎麼做,就找到了。關鍵就是利用 Vagrant::VERSION 這個變數。

如果要印出訊息,就直接用 puts ,在執行 vagrant status 等指令時,就會看到。在找這個時,意外看到 vagrant 有 message 系統 (print message after booting vagrant machine with “vagrant up”),可以在指定的情況輸出訊息:

config.vm.post_up_message = "This is the start up message!"

tldr

tldr = too long don’t read

覺得 man 太冗長,懶得看嗎?試試 tldr,這指令直接給你常用的範例跟簡短的說明。
tldr 專案網址:https://github.com/tldr-pages/tldr
有各種語言的客戶端,用 bash 版的是最方便的了 (適用於 zsh/bash/csh/ksh…..):https://github.com/raylee/tldr

安裝很簡單,用 curl 下載,放到 PATH ,收工。

# 下載到 ~/bin,然後確定 ~/bin 有在 PATH 裡
curl -o ~/bin/tldr https://raw.githubusercontent.com/raylee/tldr/master/tldr
# 設定自動完成
complete -W "$(tldr 2>/dev/null --list)" tldr

gv.vim / committia.vim

之前看到有人介紹 gv.vim 跟 committia.vim,試了一下,真的挺不錯的。

gv.vim 是 git commit browser,文件上只有提 vim-plug 的安裝,但我試的結果,Vundle 也可以安裝。
裝了以後,用 :GV 就可以開啟 commit browser,挺方便的。我之前是都到 terminal 用 tig 這個指令來看,現在有 gv.vim ,就不需要特別離開 vim ,到 terminal 了。

committia.vim 是可以在 git commit 時,可以直接看到檔案變更 (diff) 的 plugin 。之前是開另外一個 terminal ,輸入 git diff 來看 ,或是在 git commit 前先 git diff 來看。

WordPress 升級以後無法登入後台

Embed from Getty Images

才想說趕緊要把電影流水帳寫一寫,結果就遇到 WordPress 無法登入後台,查了 php-fpm slow log,發現是 media-deduper plugin 問題,使用 wp-cli 去 deactivate 以後,就可以登入了。

wp plugin deactivate media-deduper –path=’/var/www/wp’ –network

有人回報這問題了:https://wordpress.org/support/topic/504-bad-gateway-3/

但是登入以後,編輯器進不去… 見鬼了,後來發現是 MySQL的 CPU使用率超高,用 show processlist 去看,有 Waiting for table level lock 的情況。
查了以後才知道是因為 table 是 MyISAM 格式的關係。 (可以用這指令看 SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES where TABLE_SCHEMA = ” AND ENGINE IS NOT NULL; ),而主因則是 media-deduper 所導致的。

要改可以用 alter table 來改 engine,可以先用下面這組指令一次產生出所有需要改格式的 alter table 敘述,再用 source 來執行。

 SET @DATABASE_NAME = 'name_of_your_db';
SELECT CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;') AS sql_statements
FROM information_schema.tables AS tb
WHERE table_schema = @DATABASE_NAME
AND ENGINE = 'MyISAM'
AND TABLE_TYPE = 'BASE TABLE'
ORDER BY table_name DESC;

不過修改以後,media-deduper 還是會引起 MySQL 的 CPU 使用率超高,再去 media-deduper 的論壇找,找到這篇:Urgent: New Update Release (of 3 hours ago) broke my Website! 裏面講的,其實跟前面有人回報的問題 (504 bad gateway) 一樣,只是最後作者說有修正了,並且建議先移除 plugin 之後,再重新裝即可。於是我照著做就解決問題了。

Ansible提速

參考資料

上面的文章幾乎都是說要調整 ansible.cfg,Speeding up Ansible Playbook runs 這篇仔細說明每個參數加了之後有提速多少,很有參考價值。accelerate mode 則是加在 playbook 裡。

ansible.cfg 主要關鍵設定:

  1. pipeline = True
  2. control_path = /tmp/ansible-ssh-%%h-%%p-%%r
  3. ssh_args = -o ControlMaster=auto -o ControlPersist=60s
  4. poll_interval = 5
  5. forks = 25
  6. fact_caching = jsonfile
  7. fact_caching_connection = /tmp/.ansible_fact_cache

補充 ssh_args 的說明,這兩個設定主要是在會一直頻繁使用時,可以重複使用連線並避免太快斷線。

也可以加上 UseDNS = no,避免使用 DNS 反查。

s3cmd

想要把某個 bucket 裡的檔案備份到另外一個 bucket 去,找了一下,在 StackOverflow 上找到這篇:How do I back up an AWS S3 Bucket without versioning the source bucket [closed]
裏面提到一個 s3cmd 的指令,只要簡單的下 s3cmd –recursive cp s3://bucket_a s3://bucket_b 就可以了。
在 Ubuntu 14.04 裡只要使用 sudo apt install s3cmd 就可以安裝了,使用前需要使用 s3cmd –configure 來設定 AWS Access key id 跟 secret access key。
想要安裝最新版本,可以使用 pip 來安裝。

Bash 4 的 hash table

Python 的 dict 很方便,寫 bash 時,自然會想 Bash 到底有沒有這個呢?

在 StackOverflow 上找到這篇 How to define hash tables in Bash? ,裏面就介紹了用法:

# Python 語法:animals = {'moo': 'cow', 'woof': 'dog'}
# 宣告1
declare -A animals
animals=( ["moo"]="cow" ["woof"]="dog")
# 宣告2
declare -A animals=( ["moo"]="cow" ["woof"]="dog")
# 取某個鍵對應的內容,跟 Python 的 animals['moo'] 一樣。
echo "${animals[moo]}"
# Iterate
for sound in "${!animals[@]}"; do echo "$sound - ${animals[$sound]}"; done