在CubieTruck下解決 Postfix SSL 無法寄信問題

最近在這台 CubieTruck (Ubuntu 14.04 LTS)上架了收發信的套件 Postfix / Dovecot,並到 StartSSL 申請免費的憑證用 SSL 協議,用 Outlook 收信件沒有太大問題,但是寄信大部分時間都寄不出去(只有幾次可以勉強寄出去,但是要試過很多次才行)。查看 syslog 都會看到一大堆問題。

postfix/smtpd[xxx]: disconnect from some ip address
postfix/smtpd[xxx]: connect from some ip address
postfix/smtpd[xxx]: disconnect from some ip address
postfix/smtpd[xxx]: connect from some ip address
...
...

似乎是連線出現問題,斷了!可是我直接用 telnet 連結到 smtps port 卻都沒有發生問題,也把防火牆,防毒軟體關閉了也沒有用,只能請教 Google 大神了,才發現這方面的問題好像大家都碰到不少,但缺乏一個解決方案,經過我多次測試來,似乎解決了問題。

先到 postfix 配置目錄下編輯 /etc/postfix/master.cf 檔案

# nano /etc/postfix/master.cf

然後找到

#    -o smtpd_tls_wrappermode=yes

找到這行,把 ‘#‘移除掉,然後重啟 postfix 服務。

# service postfix restart

現在用 Microsoft Outlook 寄信似乎順暢多了,沒有問題再發生了。

在CubieTruck下限制特定使用者才能執行 su

之前使用 Slackware Linux Distribution時,可以限定某些使用者方可執行 su,轉變成 root。到了 Ubuntu,怎麼預設值是任意使用者都可以執行 su 轉換成 root,這看起來有點危險。所以我要在 Ubuntu 修改一下讓只有某些特定使用者才能執行 su。

首先,我發現到 Ubuntu 連 wheel 這個族群都沒有了,所以得在 /etc/group 下複製一個 wheel 族群。

# nano /etc/group

然後在第一行 root 下,添加一行一樣group id=0的 wheel 使用者族群,讓它看起來像是

root:x:0:root
wheel:x:0:root

然後存檔,這個檔案之後我們還要再改改。然後到 /etc/pam.d 目錄下找到 su 這個檔案,然後編輯它。

# nano /etc/pam.d/su

然後找到下面這一行

# auth       required   pam_wheel.so deny group=nosu

把它改成為

auth required pam_wheel.so group=wheel

存檔後不需要重啟機器或是任何服務,然後回到剛剛的 /etc/group 檔案裡面,把你要的特定人士加到 wheel 這個群族裡面,看起來像是

wheel:x:0:root,user1,user2

存檔後,只有user1user2才能通過su密碼認證,其他使用者即便密碼正確,也無法轉換成 root。

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 上安裝 GeoIP 取得 IP 位址地理位置

每天看 log,都會看到一堆 IP 位址想要來入侵 CubieTruck 小系統,但都不知道這些 IP 位址到底是位於何方?所以只能安裝 GeoIP 套件來反查其地理位置。首先來安裝套件

# apt-get install geoip-bin

然後就可以輸入 ip 位置反查

# geoiplookup 61.174.51.215
GeoIP Country Edition: CN, China

這樣就可以大約查出他的位置是從中國來的(果然不出所料),但如果要更深入一點知道在中國哪裡,那你得下載更完整的資料庫,

GeoIP下載位置

下載完解壓縮之後你可以得到一個約18MB大小的 GeoLiteCity.dat 的資料庫,先把它放在自己的家目錄裡面(或是放在 /usr/share/GeoIP 目錄也行 )。之後用這個資料庫再來反查

# geoiplookup -f ~/GeoLiteCity.dat 61.174.51.215
GeoIP City Edition, Rev 1: CN, 02, Zhejiang, Huzhou, N/A, 30.870300, 120.093300, 0, 0

你就可以更正確知道這個 61.174.51.215 IP位址是從中國浙江省湖州市來的,經緯度是在 30.870300, 120.093300附近。

如何取消 Ubuntu 的 check-new-release

每天接近中午的時候,我這台 CubieTruck 都會背景自動執行 check-new-release。你一定很好奇,既然是背景,你怎麼會知道呢?實在是太耗效能了,所以才會察覺,二來這台 Server 也不可能利用這種方式去升級,升級是一件大事情,我怎麼可能背景自動去更新呢?所以二話不說,就把這個功能給取消掉了吧!

#apt-get remove ubuntu-release-upgrader-core

來移除套件,但事實上會移除兩個套件的,選擇 Yes 就是了,但是即便如此,還是會有殘留的套件在系統裡面,保險起見,再執行一次

#apt-get autoremove

可以再多移除兩三個無用且相關的套件。

幫 Dovecot 手動加上 Logrotate

安裝了收信套件 dovecot,記錄檔案在 /var/log/dovecot.log,但卻發現這個記錄檔案異常的大,原來 LogRotate 沒有把這個檔案做處理,所以任由它增大下去,所以只好手動幫 dovecot 寫一個 Logrotate 的腳本。

先到 /etc/logrotate.d 目錄底下

# cd /etc/logrotate.d
# touch dovecot
# nano dovecot

然後編輯這個檔案,寫上

/var/log/dovecot*.log {
  weekly
  missingok
  copytruncate
  rotate 7
  compress
  notifempty
  sharedscripts
  postrotate
  if [ -f /var/run/dovecot/master.pid ]; then \
    /etc/init.d/dovecot reload > /dev/null 2>&1 || true ; \
  fi;
  endscript
}

存檔,這樣系統就可以自動每週幫 /var/log/dovecot.log Logrotate 一次了。如果要測試一次,可以手動讓 logrotate 執行一次

# logrotate -vf /etc/logrotate.conf

這樣就可以知道這個腳本是否有正確運行。

/proc/sys/net目錄解說

所有的TCP/IP的參數都位於/proc/sys/net虛擬目錄下(請注意,對/proc/sys/net目錄下內容的修改都是臨時的,任何修改在系統重啟後都會丟失)。

參數(路徑) 描述 默認值 優化值
/proc/sys/net/core/rmem_default 默認的TCP資料接收窗口大小(位元組)。 229376 256960
/proc/sys/net/core/rmem_max 最大的TCP資料接收窗口(位元組)。 131071 513920
/proc/sys/net/core/wmem_default 默認的TCP資料發送窗口大小(位元組)。 229376 256960
/proc/sys/net/core/wmem_max 最大的TCP資料發送窗口(位元組)。 131071 513920
/proc/sys/net/core/netdev_max_backlog 在每個網路接口接收資料包的速率比核心處理這些包的速率快時,允許送到隊列的資料包的最大數目。 1000 2000
/proc/sys/net/core/somaxconn 定義了系統中每一個通訊埠最大的監聽隊列的長度,這是個全局的參數。 128 2048
/proc/sys/net/core/optmem_max 表示每個套接字所允許的最大緩衝區的大小。 20480 81920
/proc/sys/net/ipv4/tcp_mem 確定TCP緩衝區應該如何反映記憶體使用,每個值的單位都是記憶體頁(通常是4KB)。第一個值是記憶體使用的下限;第二個值是記憶體壓力模式開始對緩衝區使用應用壓力的上限;第三個值是記憶體使用的上限。在這個層次上可以將封包丟棄,從而減少對記憶體的使用。對於較大的BDP可以增大這些值(注意,其單位是記憶體頁而不是位元組)。 94011 125351 188022 131072 262144 524288
/proc/sys/net/ipv4/tcp_rmem 為自動調優定義socket使用的記憶體。第一個值是為socket接收緩衝區分配的最少位元組數;第二個值是默認值(該值會被rmem_default覆蓋),緩衝區在系統負載不重的情況下可以增長到這個值;第三個值是接收緩衝區空間的最大位元組數(該值會被rmem_max覆蓋)。 4096 87380 4011232 8760 256960 4088000
/proc/sys/net/ipv4/tcp_wmem 為自動調優定義socket使用的記憶體。第一個值是為socket發送緩衝區分配的最少位元組數;第二個值是默認值(該值會被wmem_default覆蓋),緩衝區在系統負載不重的情況下可以增長到這個值;第三個值是發送緩衝區空間的最大位元組數(該值會被wmem_max覆蓋)。 4096 16384 4011232 8760 256960 4088000
/proc/sys/net/ipv4/tcp_keepalive_time TCP發送keepalive探測消息的間隔時間(秒),用於確認TCP連接是否有效。 7200 1800
/proc/sys/net/ipv4/tcp_keepalive_intvl 探測消息未獲得響應時,重發該消息的間隔時間(秒)。 75 30
/proc/sys/net/ipv4/tcp_keepalive_probes 在認定TCP連接失效之前,最多發送多少個keepalive探測消息。 9 3
/proc/sys/net/ipv4/tcp_sack 啟用有選擇的回應(1表示啟用),通過有選擇地回應亂序接收到的封包來提高性能,讓發送者只發送丟失的封包段,(對於廣域網通信來說)這個選項應該啟用,但是會增加對CPU的佔用。 1 1
/proc/sys/net/ipv4/tcp_fack 啟用轉發回應,可以進行有選擇回應(SACK)從而減少擁塞情況的發生,這個選項也應該啟用。 1 1
/proc/sys/net/ipv4/tcp_timestamps TCP時間戳(會在TCP包頭增加12個位元組),以一種比重發超時更精確的方法(參考RFC 1323)來啟用對RTT 的計算,為實現更好的性能應該啟用這個選項。 1 1
/proc/sys/net/ipv4/tcp_window_scaling 啟用RFC 1323定義的window scaling,要支持超過64KB的TCP窗口,必須啟用該值(1表示啟用),TCP窗口最大至1GB,TCP連接雙方都啟用時才生效。 1 1
/proc/sys/net/ipv4/tcp_syncookies 表示是否打開TCP同步標籤(syncookie),核心必須打開了CONFIG_SYN_COOKIES項進行編譯,同步標籤可以防止一個套接字在有過多試圖連接到達時引起過載。 1 1
/proc/sys/net/ipv4/tcp_tw_reuse 表示是否允許將處於TIME_WAIT狀態的socket(TIME_WAIT的通訊埠)用於新的TCP連接 。 0 1
/proc/sys/net/ipv4/tcp_tw_recycle 能夠更快地回收TIME_WAIT套接字。 0 1
/proc/sys/net/ipv4/tcp_fin_timeout 對於本端斷開的socket連接,TCP保持在FIN_WAIT_2狀態的時間(秒)。對方可能會斷開連接或一直不結束連接或不可預料的行程死亡。 60 30
/proc/sys/net/ipv4/ip_local_port_range 表示TCP/UDP協議允許使用的本地通訊埠號 32768 61000 1024 65000
/proc/sys/net/ipv4/tcp_max_syn_backlog 對於還未獲得對方確認的連接請求,可保存在隊列中的最大數目。如果伺服器經常出現過載,可以嘗試增加這個數字。 2048 2048
/proc/sys/net/ipv4/tcp_low_latency 允許TCP/IP緩衝區適應在高吞吐量情況下低延時的情況,這個選項應該禁用。 0
/proc/sys/net/ipv4/tcp_westwood 啟用發送者端的擁塞控制算法,它可以維護對吞吐量的評估,並試圖對頻寬的整體利用情況進行優化,對於WAN 通信來說應該啟用這個選項。 0
/proc/sys/net/ipv4/tcp_bic 為快速長距離網路啟用Binary Increase Congestion,這樣可以更好地利用以GB速度進行操作的鏈接,對於WAN通信應該啟用這個選項。 1

在 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 人服務應該是沒有什麼問題才是。