Glances – 超強大資源使用監視工具

只要說到伺服器的資源監視想到的不外乎就是 top 與 進階版的htop, 今天要介紹一個更厲害的資源使用監視工具 Glances.

Glances 是一套使用 python 構成的資源監視工具, 除了基本的資源監視外還提供了 Web 介面以及遠端查看的功能.

Requirements

Python > 2.7, >= 3.3
psutil>=2.0.0

Installation

使用 pip 安裝

pip install glances

使用 shell script 安裝

curl -L https://bit.ly/glances | /bin/bash

Usage

基本使用

就跟 top 一樣, 直接在畫面上顯示資訊

glances

啟動 Web 介面

Glances 可以提供 web 介面, 但在使用前要補安裝相依套件 bootle

pip install bottle

接著啟動

glances -w

接著就可以使用喜歡的瀏覽器訪問 http://127.0.0.1:61208

遠端模式

server 模式

glances -s

client 連接

glances -c ip

Access Control

預設模式下 Glances 是免帳密驗證的, 但是為了安全起見我們還是設定一組帳號進行驗證
加入驗證的方法很簡單, 只需要帶入參數 --username--password

glances -s --username  --password

Glances 便會在啟動過程確認要設置的帳號密碼

Define the Glances server username: keniver
Define the Glances server password (keniver username):
Password (confirm):

最後, Glances 會詢問是否紀錄帳號與密碼, 之後啟動就不會再詢問了

Do you want to save the password? [Yes/No]:

當我們為 Glances 啟動驗證後, 我們連線時需要帶入 --username , --password, 並輸入先前設定的密碼才能連線

Python pip 發生 TypeError: __call__() takes exactly 2 arguments (1 given) 的解決辦法

在某次 apt-get update 後發現 pip install 出現 TypeError: call() takes exactly 2 arguments (1 given), 所有操作都無法繼續進行

追查了一下錯誤資訊, 發生錯誤的原因是 /Library/Python/2.7/site-packages/packaging/requirements.py 的 59 行

原始程式碼如下

MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker")

比對其他版本的 pip 後, 發現這行應該是

MARKER_EXPR = originalTextFor(MARKER_EXPR)("marker")

於是乎就用正確的程式碼替換掉原來的程式碼, 重新運行 pip install 之後就正常了

pip 官方後續也修復了這個 Bug, 可以使用下列指令進行強制更新

python -m pip install --upgrade --force pip 

使用 CloudFlare SSL 憑證後出現過多重新導向的問題

CloudFlare 是一間非常有名的 CDN 廠商, 除了 CDN 與抗DDoS 的功能外, 免費版也提供了 SSL 憑證服務, 讓網站可以立刻從 HTTP 升級到 HTTPS, 使網站內容可以安全傳遞.

某日一個掛在 CloudFlare 的服務突然不能訪問, 只要嘗試訪問服務都會出現 ERR_TOO_MANY_REDIRECTS(過多重新導向) 的問題, 經過追查後整理出成因與解決辦法

發生條件


Cloudflare SSL 模式選擇 Flexible
Server Side 有設定 HTTP rewrite to HTTPS

發生原因

先來看 一下 CloudFlare SSL 的各種模式

(來源: https://www.cloudflare.com)

從上圖可以看出 Flexible 與 Full 最大的差別在於 CloudFlare 與 Origin Server 之間是否走 HTTPS, 這也是過多重新導向的核心原因

若我們在 Origin Server 設定 HTTP 自動導往 HTTPS, 或者程式本身有重新導向(Ex: WordPress), 從 Flexible 的角度來看, CloudFlare 透過 HTTP 存取 Origin, Origin 根據設定要求 Rewrite 到 HTTPS, CloudFlare 將 301/302 導向送往使用者端, 但SSL 模式下, 使用者訪問的網址已經是 HTTPS 了, 因此發生 HTTPS 不斷跳往 HTTPS 的問題, 這也就引發了 ERR_TOO_MANY_REDIRECTS 的問題

解決辦法

  1. Origin Server 關閉 HTTP 導向 HTTPS 功能
  2. 啟動 SSL Full 模式, 直接使用 HTTPS 訪問 Origin (推薦)
    (備註: Origin 要啟動 HTTPS, Strict 模式下憑證必須是有效的不能自簽)

後記

服務本身就有提供HTTPS, 但為了相容一些舊設備因此繼續開放HTTP, 前些日子為了提升整體安全性將所有流量導往 HTTPS, 沒想到悲劇就這樣發生了, 雖然快速找到問題並暫時後復, 但團隊為此猶豫要不要繼續開放 HTTP, 後來研究發現 CloudFlare SSL 相容性竟然意外的好, 因此後續還是強制使用 HTTPS.

XCode – Bitcode bundle could not be generated

這陣子升級了 XCode 到最新版, 結果原來好端端的專案突然變得無法編譯了, 吐了一個 Bitcode bundle could not be generated 的錯誤給我, 根據 Apple 的說明, bitcode 是 ios 的中間碼, 讓 App Store 可以壓縮以及優化 App, 但如果使用的第三方套件沒有使用 bitcode 則整個專案不能啟動 bitcode 功能.

既然知道了問題的成因, 那我們只要想辦法把 bitcode 關閉, 那這個問題應該就會解決了


在 Build Setting 中可以讓我們調整是否使用 Bitcode, 關閉 bitcode 後就可以正常編譯專案了!! 可喜可賀啊~

Unity3d – Mac 上發生 Case sensitive filesystems are not supported

Unity3d 是一套很好用的跨平台遊戲開發工具, 但是在編譯不同平台的時候還是得更換作業系統, 因此我們時常得在 Mac/Linux 與 Windows 之間換來換去, 這陣子升級專案的時候, Unity3d 突然出現下列錯誤訊息.

Fatal Error! The project is on case sensitive file system. Case sensitive filesystems are not supported at the moment. Please move the project folder to a case insensitive file system.

這個問題的構成原因主要是因為 Unity3d 的 Resource Loader 功能本身是大小寫敏感的, 進而導致 Unity3d 無法運作在大小寫敏感的檔案系統上.

啊… 慘了, 我豈不是要重灌 Mac 才能解決這個問題麻…

好險 Mac 有一個變通的方法, 我們可以透過下列步驟建立一個大小寫不敏感的虛擬磁碟來解決這個問題

建立虛擬硬碟

使用 Mac 內建的磁碟工具程式建立空白映像檔
檔案 -> 新增映像檔 -> 空白映像檔

設定值的部分就依照需求填寫即可, 只需要注意格式的部分要選擇 OSX 擴充格式 (日誌式), 不要選區分大小寫即可

這樣一來我們就有一個大小寫不敏感的磁區, 接著我們只要將 Unity3d 專案放入這個磁區就可以正常使用了

在 Debian 8 上安裝 Nginx + PHP7-FPM

Nginx 在 Web Server 領域有著極為優異的表現, 如果搭配 PHP-FPM 可以讓網站的速度更上一層樓, 本篇文章將與各位分享如何在 Debian 8 上安裝 Nginx 與 PHP-FPM

環境資訊

Debian 8 (Jessie) 請注意OS版本, 本文針對 Debian 8 做說明
Nginx 1.6.2
PHP 7.0

安裝 nginx

sudo apt-get install nginx -y

安裝 PHP7-FPM

本文章為濃縮版, 指令細節可以參考 在 Debian 8 (Jessie) 上安裝 Apache + PHP 7

echo "deb http://mirrors.teraren.com/dotdeb/ stable all" | sudo tee --append /etc/apt/sources.list
echo "deb-src http://mirrors.teraren.com/dotdeb/ stable all" | sudo tee --append /etc/apt/sources.list
wget -qO - https://www.dotdeb.org/dotdeb.gpg | sudo apt-key add -
sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install php7.0-fpm php7.0-common -y
sudo apt-get install php7.0-zip php7.0-mysql php7.0-mcrypt php7.0-mbstring php7.0-json php7.0-imagick php7.0-gmp php7.0-curl php7.0-dom php7.0-gd -y

調整 PHP-FPM 設定

我們必須調整 php 的設定, 使得 php 更加安全

sudo vim /etc/php/7.0/fpm/php.ini

將本來由 ;註解掉的設定

;cgi.fix_pathinfo=1

修改為

cgi.fix_pathinfo=0

重新啟動 PHP-FPM

sudo systemctl restart php7.0-fpm

連接 Nginx 與 PHP

sudo vim /etc/nginx/sites-available/default

將下方設定檔寫入其中

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/html;
    index index.html index.htm index.php index.nginx-debian.html;

    server_name _;

    location / {
        try_files $uri $uri/ =404;
    }

        location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
    }
}

重新啟動 Nginx

sudo systemctl restart nginx

測試

將測試用檔案寫入 Nginx 預設目錄

echo "<?php phpinfo();" | sudo tee /var/www/html/info.php

打開瀏覽器前往 http://你的IP/info.php


當你看到這個畫面就代表PHP成功運行, 紅框的部分顯示 FPM/FastCGI 代表我們的 PHP 確實是使用 PHP-FPM 模式運行

由於 phpinfo 會透露很多詳細資訊, 為了安全起見, 欣賞完畢要順手把 info.php 刪除

sudo rm /var/www/html/info.php

在 Debian 8 上安裝 MariaDB 10.1

MariaDB 是 MySQL 的移植版本, 不僅保有 MySQL 原本的功能, 也新增很多 MariaDB 獨有的功能, 使用上相容於 MySQL 函數庫以及相關工具, 是非常棒的MySQL替代品, 本文章將介紹如何透過 apt-get 將 MariaDB 10.1 安裝在我們的 Debian 8 主機上

新增 MariaDB 官方套件庫

sudo apt-get install software-properties-common -y
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
sudo add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://ftp.ubuntu-tw.org/mirror/mariadb/repo/10.1/debian jessie main'

在 IPv6 的環境下, 第二行指令可能會連線失敗, 改用 IPv4 連線就可以解決這個問題

更新套件庫

sudo apt-get update

安裝 MariaDB

sudo apt-get install mariadb-server -y

設定 MariaDB Root 密碼

安裝過程會詢問 root 密碼, 連續輸入兩次即可

啟動 MariaDB

sudo service mysql start

強化 MariaDB 安全性

mysql_secure_installation

依照提示回答下列問題

Enter current password for root (enter for none): 輸入 root 密碼

Change the root password? [Y/n] n
安裝時已經設定過 root 密碼, 因此無須更換 root 密碼

Remove anonymous users? [Y/n] Y
移除匿名使用者

Disallow root login remotely? [Y/n] Y
禁止 root 遠端登入

Remove test database and access to it? [Y/n] Y
移除多餘不必要的資料庫

Reload privilege tables now? [Y/n] Y
立刻重新載入權限表

測試

我們可以透過以下指令嘗試連接資料庫

mysql -u root -p

輸入 root 密碼後 按下 enter, 若畫面出現 Welcome to the MariaDB monitor. Commands end with ; or \g. 就代表我們成功安裝了 MariaDB 到我們的 Debian 主機上

控制 MariaDB

啟動

sudo service mysql start

停止

sudo service mysql stop

重新啟動

sudo service mysql restart

Robots.txt 的使用方法與安全注意事項

Robots.txt 是什麼

robots.txt (固定全小寫) 是一個放在網域的根目錄的文字檔案, 裡面的內容用於指示網路爬蟲什麼東西該索引以及什麼東西不該索引, 不難看出網站的SEO與安全性都與這個小小的檔案有莫大的關聯.

由於 robots.txt 是約定成俗的用法並不是一個標準, 因此不能保證遵守以及隱私性(不該給別人看到的東西就要鎖好)

Robots.txt 的使用方法

常見指令

User-agent: 設定什麼爬蟲要遵守接下來的規定
Disallow: 禁止索引
Allow: 歡迎索引
Sitemap: 網站的 Sitemap 位置, 加速爬蟲索引
Crawl-delay: 每一次的請求之前的延遲時間

使用範例

  • 禁止所有爬蟲索引
User-agent: * 
Disallow: /
  • 禁止所有爬蟲索引 /img/ 這個目錄
User-agent: * 
Disallow: /img/
  • 禁止百度爬蟲索引所有內容
User-agent: Baiduspider
Disallow: /
  • 禁止所有爬蟲索引但 Google 爬蟲例外
User-agent: *
Disallow: /
User-agent: Googlebot
Allow: /
  • 每一次存取間隔 1秒
    禁止所有爬蟲索引, 但 Google 爬蟲例外
User-agent: *
Disallow: /

User-agent: Googlebot
Allow: /
Crawl-delay: 1

不是所有的爬蟲都支援 Allow 抵銷 Disallow

  • 不索引任何 js 檔案
User-agent: *
Disallow: /*.js$

路徑匹配方式

超乎預期的影響力

若想要阻擋 /news 這個網頁的存取, 下面這個寫法看起來正確, 但實際上影響範圍更廣

Disallow: /news

這個寫法不只阻擋 /news, 連同 /news-123, /news-234 也都會被阻擋, 只要前面吻合就會忽略

正確寫法

因此正確寫法應該是在末端加入 $(結尾符號), 表示要完全吻合

Disallow: /news$

如此一來就只會不索引 /news, 其餘網頁仍然會正常索引

使用後設(Meta)資料

robots.txt 通常用來阻擋固定不變的內容, 但有時候我們會需要動態生成阻擋名單, 我們不必動態生成 robots.txt, 可以透過在網頁中加入以下後設(Meta)資料, 來達到禁止索引的效果

<meta name="robots" content="noindex,nofollow" />

爬蟲在讀取該網頁後便會放棄索引網站內容

逆向 SEO

我們可以透過 robots.txt disallow 與 後設(Meta)資料來促使爬蟲移除特定頁面, 藉此移除過期內容以及增加網站資料簡潔度

注意事項

  • 大小寫敏感, /img 不等於 /IMG
  • 文字間的空白會被省略, /hello world 等於 /helloworld

Robots.txt 帶來的資安問題

網站中有很多秘密不想讓別人知道, 其中最常見的就是管理後台,為了避免後台被索引, 我們可能會將 robots.txt 寫成這樣

User-agent: * 
Disallow: /admin/

這樣一來, 攻擊者就無法使用 Google Hacking 技巧來找出後台位置了, 這樣的想法大錯特錯.

對於攻擊者而言, 他可以打開 robots.txt 檔案看看你 Disallow 哪些東西, 等同於告訴攻擊者哪裡有機密, 這是一種此地無銀三百兩的概念.

即使你的後台名稱叫做 /you_will_never_never_guess_where_is_the_admin/, 不管當中有多少 never, 攻擊者都可以直接找到正確位置.

為了避免這類型的問題, 我們可以將 robots.txt 寫成這樣

User-agent: * 
Disallow: /you_will_never

利用路徑匹配的特性, 間接的禁止索引真正的後台位置.

結論

robots.txt 應該視為引導爬蟲索引網站的工具, 而不是保護網站的工具, 任何不希望出現在網路上的資料不應該上傳到網路上, 假若逼不得已必須放到網路上, 必須使用 Http Authorization 之類的存取保護機制保護資料.

macOS 無法使用 127.0.0.2 的解決辦法

127.0.0.0/8 是保留給 loopback 網路卡使用的網段, 我們可以藉由 127.0.0.0/8 來模擬不同的IP以及測試網卡驅動是否正常, 在 Windows 跟 Linux 下 127.0.0.0/8 都可以正常運作, 但 macOS 下卻無法連線, 主要原因是因為 FreBSD家族預設只會 bind 127.0.0.1, 因此 127.0.0.2, 127.0.0.3 之類的都不會通.

我們可以透過下列指令將需要的 loopback IP 叫回來( 這邊用 127.0.0.2 作為範例)

sudo ifconfig lo0 alias 127.0.0.2 netmask 0xFFFFFFFF

指令執行成功後, 我們就會發現可以 ping 到 127.0.0.2 了

註: 重新開機設定會消失, 需要重新執行指令

Linux 設定 VLAN 802.1Q

在複雜網路環境中適度的使用 VLAN 會幫助我們降低管理複雜度, 當我們設定完 Switch 端 VLAN 設定後, 我們也必須調整電腦端的 VLAN 設定來接入 VLAN 網路, Linux 對於 VLAN 的支援非常穩定, 透過以下的方法我們便可以在 Linux 輕鬆使用 VLAN.

安裝相關套件

安裝 VLAN 套件

sudo apt-get install vlan

將 802.1q 模組載入 Kernel

modprobe 8021q

確認 Kernel 有正確載入 802.1Q 模組

sudo lsmod | grep -i 8021q 

有輸出就代表有正常載入 802.1Q 模組

8021q                  27844  0 
garp                   13117  1 8021q
mrp                    17343  1 8021q

設定網路卡

在我的網路環境中, 我有一張實體網路卡 eth0, 並且要設定兩張 VLAN 網卡, 分別為 VLAN 5 與 VLAN 10.

編輯 /etc/network/interfaces

# 將 eth0 網卡切入手動模式
auto eth0
iface eth0 inet manual
        pre-up ifconfig $IFACE up

# 網卡名稱格式為 Bridge 網卡.VLAN

# 建立 VLAN 5 網卡, 靜態網路設定
auto eth0.5 
iface eth0.5 inet static
        vlan-raw-device eth0  #Bridge 到 eth0
        # 以下為基本網卡設定, 依照需求設定即可
        address 10.10.10.254
        netmask 255.255.255.0

# 建立 VLAN 10 網卡, DHCP
auto eth0.10
iface eth0.10 inet dhcp
        vlan-raw-device eth0

設定完畢後重新啟動 networking

/etc/init.d/networking restart

若設定都正確, ifconfig 將會顯示設定好的 VLAN 網卡, 這樣我們就可以正常存取 VLAN 網路了