WordPress 壓縮圖片的外掛

之前這一篇文章提到如何jpegoptim 把WordPress的圖片再壓縮一次,來節省流量,但很可惜的,jpegoptim只能對jpeg圖檔做壓縮,對於時下流行的 PNG 卻一點辦法也沒有。所以這一次介紹一個 WordPress 外掛,WP Smush.it,讓你一次搞定所有的圖片。

先到WordPress後台控制台中安裝新的外掛,WP Smush.it,目前最新版本是1.6.5.4,作者是WPMU DEV。安裝完之後就可以立刻啟用它。之後再到WordPress後台控制台的媒體中的Bulk Smush it 執行,讓你一次性對圖片做壓縮。

不過這個外掛好像是透過 Yahoo Smush API完成的,所以有幾個限制

  1. 圖片檔大小不得大於1MB。
  2. 圖片只能支持http方式上傳,對於全https協議才能拿到圖片的網站不適合。
  3. 圖片可以讓 Yahoo 能夠取得,對於擁有防止盜連機制的網站不適合。
  4. 圖片必須在本機端,而不是放在CDN網站上。

如果都符合的話,就按下 “Run all my images through WP Smush.it right now” 這個按鈕,上面已經有資訊告訴你整個網站有幾張圖片,大約要花多久時間。所以建議妳最好在月黑風高的無人晚上再來一次完成。

Ubuntu系統開啟 ufw 防火牆之後,iptables -A 和 -I的差異

今天在用 iptables 設定每個IP限制幾個連線時,來回好幾次怎麼設定都不能正常運作,正在納悶到底是怎麼一回事時,我把 -A 的參數改成 -I 之後竟然正常了。所以打算追根究柢看看到底哪裡出了什麼問題了。我們先說說這個命令好了,

iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j REJECT

一個簡單的 iptables 命令,限制每個 IP 只能 10 個 HTTP 連線,超過就丟棄封包不理它。無奈怎麼都不會正常運作,索性改成

iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j REJECT

嘿,竟然正常了。根據 iptables 語法,-A代表是Append附加在既有規則上,-I則是代表Insert添加在最前面,所以我就把整個 iptables 規則 dump 出來看看

# iptables-save > ~/rules

一看規則,明白了,雖然兩行的命令是一樣的,但順序不一樣。一個在 ufw 前面,一個在 ufw 後面。

-A INPUT -p tcp -m tcp --dport 80 -m connlimit --connlimit-above 10 --connlimit-mask 32 --connlimit-sa
(上面的規則是 -I添加進來的)
...
...
...
-A INPUT -j ufw-before-logging-input
-A INPUT -j ufw-before-input
-A INPUT -j ufw-after-input
-A INPUT -j ufw-after-logging-input
-A INPUT -j ufw-reject-input
-A INPUT -j ufw-track-input
-A INPUT -p tcp -m tcp --dport 80 -m connlimit --connlimit-above 10 --connlimit-mask 32 --connlimit-sa
(上面的規則是 -A附加進來的)
...
...

我們知道 iptables 運作規定是由上往下執行,很顯然的,如果採用 -I,因為是添加在最前面,所以運作規則會在 ufw 之前。反之如果採用 -A,那麼附加的規則會在 ufw 之後。但是 ufw 之前已經設定

# ufw allow 80

所以按照 iptables 執行順序,只要是 80 port 的都會被 ufw 允許,所以 -A 添加的規則根本不會執行到,那當然運作就不正常了。而 -I 的命令則在 ufw 之前,所以才能先過濾掉,然後才交給 ufw 判斷,唉,浪費了不少時間。

如何在 CubieTruck 上安裝論壇 Discuz 套件

Discuz 是中國開發的一套很有名的論壇套件,目前版本已經到了 3.2,安裝上也很方便,這裡我來介紹一下如何安裝 Discuz 套件。當然你必須先安裝好 Apache2/PHP5/MySQL一些基礎的套件,如果還沒有安裝好上述軟體,請參考這篇文章

首先先下載套件放到自己的家目錄。

# cd ~
# wget http://download.comsenz.com/DiscuzX/3.2/Discuz_X3.2_TC_UTF8.zip

這個是 3.2 繁體中文UTF8版本,如果要更新或其他版本,建議你去官方網站去下載適合自己的套件。

下載完之後就解壓縮檔案。

# mkdir discuz
# cd discuz
# mv ../Discuz_X3.2_TC_UTF8.zip .
# unzip Discuz_X3.2_TC_UTF8.zip

解壓縮之後有三個目錄,我們只要 upload 這個目錄,其他都是說明文件目錄,可以忽略這另外兩個目錄。然後更改upload 目錄整個權限,拷貝到入口網站的目錄去。

# chown -R www-data:www-data *
# cp -ra upload /var/www/discuz

然後第一次要自己訪問特殊路徑

http://yourip/discuz/install

然後就是第一次安裝的設定,例如:管理者名稱密碼之類的,這裡就不說明了。之後你的論壇拜訪目錄就是

http://www.yourip.com/discuz/

如果你想要原本 www.yourip.com 分流到 bbs.yourip.com (假定你可以申請到 bbs.yourip.com 域名),那麼就要動到 apache2 虛擬目錄了,先編輯這個檔案

# nano /etc/apache2/sites-enabled/000-default.conf

然後在中間安插

<VirtualHost *:80>
ServerName bbs.yourip.com

ServerAdmin webmaster@localhost
DocumentRoot /var/www/discuz
DirectoryIndex index.php

<Directory /var/www/discuz>
Options -Indexes +FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/discuz.log combined env=!dontlog
</VirtualHost>

然後重新啟動 apache2 服務

# service apache2 restart

這樣以後只要 http://bbs.yourip.com 就可以直接到論壇目錄,可以少打一個 discuz,但是如果要 https 協議的話,就得再去申請 bbs.yourip.com 的憑證,之後再依樣畫葫蘆更改虛擬目錄設定。

如何在 CubieTruck 上安裝 MemCached

最近看 OwnCloud 的日誌,常常看到一些有關 memcached 的錯誤,這才想起來,當初架這個站時,似乎忘了安裝 memcached 模組了,難怪會有錯誤發生。

請注意是 Memcached 不是 mmcache(多個字母d),很多人搞不清楚他們兩個之間的不同!多半玩過 PHP 的人大概都聽過 mmcache,mmcache它是一個預編譯緩衝的 PHP 加速程式,能夠提升 PHP 的執行效能。但卻很少人聽過 Memcached ,因為大多人乍看之下都以為它是mmcache,使得它沒什麼機會介紹自己。事實上,若您正打算架構一個真正高負載的大型網站系統,你需要了解的並不是 mmcache,而是 memcached。

Memcached 是什麼?顧名思義,他是由記憶體(Memory)和暫存(cache)所組合起來的常駐程式(Daemon),你也可以稱它為『暫存伺服器』。 Memcached 能提供一個暫存資料的服務,透過網路供其他電腦使用。Memcached 有什麼用途?最常見的應用就是在網站伺服器的叢集,它能讓許多的網站伺服器 Session 互相流通使用。如果你正在傷透腦筋煩惱這一點,恭喜你找到解決方法了!

想要在網站伺服器的叢集中,多網站伺服器 Session 互相流通使用,首先你必須將 Memcached 架起來當 Session 分享伺服器,這邊建議你使用大的記憶體,最好是能多大就有多大,因為 Memcached 並不會以硬碟當資料暫存,而是會完全跑在記憶體上,所以若記憶被用完了,Memcached 就會無法再存放更多資料。

瞭解了 MemCached 之後,首先我們先來安裝套件,這次要安裝兩個套件,一個是基礎的memcached,一個是給 php5用的延伸套件。

# apt-get install php5-memcached memcached

這兩個套件似乎並不大,很快就安裝好了。正常安裝完之後,memcached 就已經正常運作了,我們先來看看是否正常運作:

# ps aux | grep [m]emcached
memcache 20139 0.0 0.1 47616 2168 ? Sl 11:17 0:00 /usr/bin/memcached -m 64 -p 11211 -u memcache -l 127.0.0.1

嗯,memcached 看來有綁定 port和IP位址,為了安全起見,我們也順便幫它把防火牆打開。

# ufw allow from 127.0.0.1 to 127.0.0.1 port 11211
# ufw allow from 192.168.1.199 to 127.0.0.1 port 11211

上面的 192.168.1.199 換上自己的IP,這樣防火牆就可以為 memcached 打開了。

順帶一提的是,從剛剛的訊息看來,預設值給 memcached 的記憶體只有 64M,我的 CubieTruck 有 2GB的記憶體,管它的給他揮霍一筆,增加到 128MB吧(依照自己的記憶體空間決定吧)!所以我們到 /etc 目錄底下去修改 memcached.conf

# nano /etc/memcached.conf

找到 -m 64那行,把它修改成為

-m 128

然後重新啟動服務,

# service memcached restart

因為 PHP5是依附在 Apache2 套件底下的服務,所以一定要重新啟動 apache2  的服務

# service apache2 restart

這樣就可以使 php5底下的 memcached 生效了。為了證明是否有正確運行,在自己的網頁入口目錄增加一個檔案 apache.php(事後可以刪除),把內容填上

<?php
phpinfo();
?>

然後拜訪自己的網站的 apache.php

http://your_ip/apache.php

是否增加了 memcached 這一些資料呢?

memcached

 

還有一點,不要忘了常常看 log,memcached的日誌檔案在 /var/log/memcached.log(剛剛談到的 /etc/memcached.conf 裡面可以更改位置),一般是沒有什麼事情發生的。

在 CubieTruck 上如何增加 Apache 和 MySQL 連結數目

這台 CubieTruck 剛安裝完 Ubuntu 之後才發現,即便 Ubuntu 伺服器版本,Apache 預設最大連結數目只有 100 個, 資料庫 MySQL 只有 50 個。換言之,只能支援最多 50 個人同時可以同時查詢 MySQL。老實說,我不知道這台 CubieTruck 的能耐倒底到哪裡,同時50個人查詢會不會造成問題,我只是覺得有點少,所以打算把這個數目增加到 100 個。

Apache 的設定在 /etc/apache2/apache2.conf 檔案裡面

# nano /etc/apache2/apache2.conf

修改這一行

MaxKeepAliveRequests 100

MySQL 的設定在 /etc/mysql/my.cnf 檔案裡面

# nano /etc/mysql/my.cnf

然後找到這一行改為

max_connections = 100

然後重啟兩個服務即可

# service apache2 restart
# service mysql restart

這些數值僅供參考,作為一台伺服器,同時提供 200 人服務應該是沒有什麼問題才是。

如何縮短網路連結關閉時間

我們使用 netstat 指令觀看網路連結時候,常常會看到一堆 TIME_WAIT 的 socket 等待被關閉,而這些 socket 必須等待一段時間後才會被釋放重新被使用,底下是一張 TCP 完整的機制圖(state machine)。

1

一般而言,網路 socket 關閉時比建立時還要複雜很多,原因很多,其中一個是等待 keepalive 再次送訊息來,但是事實上很多時候 socket 是可以被關閉了,所以會有很多 TIME_WAIT 的 socket 殘留在系統中,這一篇我們來說說怎麼修改這些時間,縮短時間,好讓這些 socket 被釋放讓系統可以重新使用。

在 Linux 裡面,這些參數都不是寫死在系統裡面,相反的而是在 /proc/sys/net/ipv4 虛擬檔案目錄裡面,在 /etc/sysctl.conf 裡面可以有其對應的數值,只要修改這個數值,socket 結束的等待時間就可以被改變了。

# nano /etc/sysctl.conf

在檔案後面增加

net.ipv4.netfilter.ip_conntrack_generic_timeout = 120
net.ipv4.tcp_tw_recycle = 1 ; socket 可以重新被使用
net.ipv4.tcp_tw_reuse = 1 ; socket 可以重新被使用
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 30
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
net.ipv4.tcp_keepalive_intvl = 30 ; 預設值是75,建議在15-30秒內
net.ipv4.tcp_keepalive_probes = 5 ; 預設值是9,建議可以試探5次即可。
net.ipv4.tcp_timestamps = 0 
net.ipv4.tcp_sack = 1 
net.ipv4.tcp_window_scaling = 1

這些數值都是可以修改的,是有關於 socket 的狀態時限的。修改完可以輸入下面命令立刻生效。重新開機後也會自動被載入。

# sysctl -p

注意:每個系統都有其獨特性,所以上面數值僅供參考。一般而言,我們當伺服器的話,當然希望無用的 socket 趕快結束重新可以被使用,相反的如果是當做桌機,這些數值就沒有那麼敏感了。

如何增大 Apache 上傳檔案大小限制

之前架設 ownCloud 時,雖然 ownCloud 已經把上傳檔案大小限制改為 512MB,但是有時候還是上傳不了,後來查了一下原來在 PHP5裡面是有限制的,必須修改一下,設定檔案在 /etc/php5/apache2/php.ini 裡面。

# nano /etc/php5/apache2/php.ini

找到下面兩行,改成你要的檔案大小,

upload_max_filesize = 512M ;預設值是 2M
post_max_size= 512M ;預設值是 2M

然後重新啟動 Apache2 服務即可。

# service apache2 restart

CubieTruck簡易式阻擋DDoS防禦方式

DDoS是一種討厭的攻擊方式,駭客會在短時間內利用建立新連線方式阻擋他人連線的一種攻擊手法。這種攻擊手法相當難防禦,殊不見各大Server常常碰到此類型跳板式的DDoS攻擊,所以這裡用iptables做一個最簡易的防禦方式。

iptables -N WEB_SRV_DOS
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j WEB_SRV_DOS
iptables -A WEB_SRV_DOS -p tcp --syn -m multiport --dports 80,443 -m recent --rcheck --second 20 --hitcount 100 -j LOG --log-prefix "[Possible DOS Attack]"
iptables -A WEB_SRV_DOS -p tcp --syn -m multiport --dports 80,443 -m recent --rcheck --second 20 --hitcount 100 -j REJECT
iptables -A WEB_SRV_DOS -p tcp --syn -m multiport --dports 80,443 -m recent --set
iptables -A WEB_SRV_DOS -p tcp -m multiport --dports 80,443 -j ACCEPT

上面這段會把80/443(HTTP/HTTPS)Port新連線記錄下,最近20秒內如果想要建立連線超過100次,則會記錄下來並且丟棄封包進而阻擋DoS,因為  hitcount 超過 20,所以請參考這一篇文章來加大 xt_recent 的數值,以方便偵測。

如何限制CubieTruck對某個IP對HTTP Port只能有一定量的連線數目

CubieTruck是一台很小的伺服器,裡面的配備與資源相當陽春,所以經不起很多人同時連線,更遑論要阻擋DDoS了,所以我打算要用 iptables 來限制某個IP對HTTP/HTTPS Port只能有限定數量的連線,超過這個數目就丟棄封包不理會,算是一種最陽春的DDoS的阻擋了吧!

HTTP 80 Port,只要同一個IP超過10個連線就丟棄封包。

iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j REJECT

HTTPS 443 Port,只要同一個IP超過10個連線就丟棄封包。

iptables -I INPUT -p tcp --dport 443 -m connlimit --connlimit-above 10 -j REJECT

但如果你的 Apache 服務器掛載很多種引擎,例如 ownCloud私有雲,常用來上傳和下載檔案,那這個數字 10 要自己拿捏好,不要阻擋了自己合法連線而拖慢速度。

另外,還有一點必須考量的是,這個被限制的IP位址可能是某個Proxy Server的IP位址,意味著Proxy Server後面可能有很多的電腦在後面,那麼10個連線就有點太少了。

如何在 Ubuntu 系統下微調網路參數

現在台灣光纖到府(FTTH/FTTB)十分普遍,雙向100M也不是天方夜譚了,所以理論上在網路傳送上可以採用比較大的緩衝區來傳遞,但是 Ubuntu 的預設值是給普羅大眾使用的,一般人可能是用 ADSL,或是更慢的撥接上網,所以 Ubuntu 在傳送的預設值是 128KB。因為筆者的網路是光纖到府,所以我就微調一下這些數值為512KB,讓傳送可以快一點。 但是理論上必須根據你自己的網路頻寬去做調整,我這裡只是作個筆記,把我自己的設定值列出來而已,並不對裡面的數值作任何解釋,而且也許會對你的系統造成副作用。 這個參數檔案在 /etc/sysctl.conf 裡面,

# nano /etc/sysctl.conf

在這個檔案後面加入

net.core.rmem_default = 524288 # default is 163840 
net.core.rmem_max = 524288 # default is 131071
net.core.wmem_default = 524288 # default is 163840
net.core.wmem_max = 524288 # default is 131071
net.ipv4.tcp_wmem = 4096 87380 524288 # default is 4096 16384 4194304
net.ipv4.tcp_rmem = 4096 87380 524288 # default is 4096 87380 6165056

然後輸入

# sysctl -p

就可以立刻生效,如果要看是否有設定成功可以輸入

# sysctl -a | grep rmem

看看數值是否是自己設定的數值相符合。