Letsencrypt 開放申請免費 SSL 憑證

Letsencrypt

很高興在今年 12/03 Letsencrypt 宣布進入 public beta 階段,開放免費 SSL 提供給開發者或正式網站使用,在這之前屬於封測階段,必須透過申請的方式才可以拿到 SSL 憑證。在知道 Letsencrypt 之前,我都是使用免費的 StartSSL,這家申請的分式比較複雜,你可以在網路上找到許多申請教學,但是就是按部就班操作,就可以拿到一年份的 SSL 憑證,也就是一年申請一次啦,但是 Letsencrypt 申請的方式可以直接透過 command line 快速產生相對應的憑證,支援的 Plugin 也非常多 (像是 Apache, Nginx),詳細的操作方式可以參考線上文件。這邊就不多說了,只要安裝好 Letsencrypt 指令,就可以無痛拿到各網站憑證,在 Github 上面你可以找到許多別人寫好的 Plugin,隨便挑一個來使用吧。

Continue reading “Letsencrypt 開放申請免費 SSL 憑證”

Nginx + phpMyAdmin 搭配 SSL 設定

mysql_logo

phpMyAdmin 是一套用來管理 MySQL 的 Web 介面,如果要讓 phpMyAdmin 強制走 https 的話,可以透過兩種方式,一種是直接設定 phpMyAdmin,另外一種方式是透過 Apache rewriteNginx 設定,底下來分別說明。 Continue reading “Nginx + phpMyAdmin 搭配 SSL 設定”

[筆記] 解決 apache mod_fcgid: HTTP request length 136000 (so far) exceeds MaxRequestLen (131072)

logo-Ubuntu
上次寫了一篇 Ubuntu 10.10 (Maverick) 架設 Nginx + PHP FastCGI,不過在 PHP 上傳檔案部份發現了問題,打開 /var/log/apache2/error.log 發現底下錯誤訊息:
mod_fcgid: HTTP request length 136000 (so far) exceeds MaxRequestLen (131072)
上網找了一下是 fcgid.conf 設定錯誤,解決方式非常簡單,只要打開 /etc/apache2/mods-available/fcgid.conf,將底下內容 Continue reading “[筆記] 解決 apache mod_fcgid: HTTP request length 136000 (so far) exceeds MaxRequestLen (131072)”

如何使用 Apache Module mod_mime

apache_software_foundation_logo_3074
Apache 可以透過 mod_mime 模組且根據使用者定義的副檔名來 response data 給 Client 端,此功能可以應用在前台搭配 Template Library,例如 Mustache Logic-less templates,透過此 Apache 模組 可以在 html 檔案將定義好全部 Template,一次讀取進來,底下舉個例子:

我們希望 apache 能夠讀取 assets/templates/test1.mustache,並且將檔案內容放到 script 裡面,這時候就必須在 apache httpd.conf 定義 text/x-mustache-template

    AddType text/x-mustache-template .mustache
    AddOutputFilter INCLUDES .mustache

Continue reading “如何使用 Apache Module mod_mime”

Ubuntu (Debian) 架設 apache mpm worker mod_fcgid 筆記

最近想架設 RedmineUbuntu 伺服器上面,架設之前要先搞定 apache 搭配 mpm worker 及 mod_fcgi module,安裝步驟其實不難,就搭配懶人指令 apt 就可以了。

安裝 apache mpm worker

由於怕安裝過程會叫你把 apache2-mpm-worker 移除,改裝 apache2-mpm-prefork,所以安裝順序上面有些變化,請參考底下:
# 先安裝
$ apt-get install apache2.2-bin apache2.2-common apache2-mpm-worker libapache2-mod-fcgid php5-cli php5-cgi php5-common
#後安裝
$ apt-get install apache2 php5 php5-gd php5-curl
至於 PHP 5 套件就看你需要什麼就裝什麼吧,搜尋一下 php5-* 看看,apache 裝好預設看不到 PHP 網頁,也就是認不得 php type,請在 apache config 檔案加入底下 Continue reading “Ubuntu (Debian) 架設 apache mpm worker mod_fcgid 筆記”

Html5 模板架構(Boilerplate)

HTML5 Boilerplate - A rock-solid default for HTML5 awesome._1282574693481 今年在 COSCUP 大會上最主流的議題就是 Html5,今天看到一個網站 HTML5 Boilerplate,這網站提一個全新 html 5 模板,自從離開 Dreamweaver 樣板軟體,利用 Pspad 手動撰寫 html,此網站就發揮非常大的用處,提供全新 html,CSS 以及 javascript,支援了底下很多功能:
  • 跨瀏覽器 (IE6…)
  • 支援多種 html5 Tag
  • Compress 和 cache html 檔案
  • CSS IE6 , IE7 Hack
  • IE6 Png Fix (連這個都幫忙解決了)
  • 支援 CDN jQuery,避免在 local 端沒讀取到檔案
你還可以根據自己需要的功能做添加或者是減少,CSS reset、跨瀏覽器 CSS、robots.txt、Apache .htaccess cache 壓縮也有支援,如果不需要的功能,也可以參考看看,對於初學者也是非常好的學習例子。

Apache 取得透過 Reverse Proxy (Varnish) 的 Client 真正 IP (mod_rpaf)

feather 之前介紹 [FreeBSD]high performance caching reverse proxy: Varnish (安裝架設篇) 來當 Web 前端 Reverse Proxy,也有 load balance 的功能,不過碰到這樣的環境,後端 Apache Server 只會抓到 Reverse Proxy IP 來當作 log 紀錄,而無法正確取得 Client 端 IP,Varnish 官網 FAQ 有提到 log 檔案得的解決方法,不過在程式方面,要大量的修改,假設今天 Apache 跑10個 Virtual Host ,不就要去改10個網站程式,背後或許是一些大型 open source 的 Project,改起來相當不容易,也很費工夫。Darkhero 提供了 reverse proxy add forward module for Apache (mod_rpaf) 模組,只要裝上這模組,Apache 就不必動到其它設定就可以正確紀錄 log 檔案,且程式都不必修改,就可以得到正確 IP 了。 FreeBSD Ports 安裝方式:
cd /usr/ports/www/mod_rpaf2/
make install clean
修改 httpd.conf (FreeBSD: /usr/local/etc/apache22/httpd.conf)
LoadModule rpaf_module        libexec/apache22/mod_rpaf.so
將上面 unmask,最後面加上:
RPAFenable On
RPAFsethostname On
RPAFproxy_ips xxx.xxx.xxx.xxx 127.0.0.1
RPAFheader X-Forwarded-For

[FreeBSD]high performance caching reverse proxy: Varnish (安裝架設篇)

varnish-logo-red-64 在上禮拜跟 DarkHero 兄聊到 How To Build a Scalable Web Site (3/6) 的上課講義,互相討論了 MySQL Load balance 以及 http reverse proxy 的方式,以前自己有用 HAProxy 當作 Web 平衡負載,順便紀錄了 HAProxy FreeBSD 安裝方式,這次要來介紹今天重點:Varnish Cache Server,在近幾年流行的 Caching 機制,大家會想到 Squid,只要您設定良好的 Squid 參數,它一定運作的非常穩定,然而它的核心依然是 forward proxy,要架設成 Reverse Proxy 還必需要設定一些參數才可以達到,是有一定的困難性,然而 Varnish Cache Server 底層就是高效能 caching reverse proxy,也因為 Squid 是 1980 年發展出來的,程式架構過於老舊,可以參考 ArchitectNotes 瞭解這部份詳情。也許您會問到 Varnish 可以架設成 forward proxy 嗎?答案是可以的,但是您也許不會這麼做,因為它需要 DNS 技術,以及需要一個非常大且複雜的 Varnish VCL(Varnish Configuration Language) file。 1. 今天要介紹如何在 FreeBSD 系統安裝,在介紹之前,系統必須先安裝好 apache,這樣才可以正確啟動,利用 ports 安裝:
cd /usr/ports/www/varnish/
make install clean
2. 修改 /etc/rc.conf
# varnishd
varnishd_enable="YES"
varnishd_listen=":80"
varnishd_admin=":81"
varnishd_backend=":5566"
varnishd_config="/usr/local/etc/varnish/default.vcl"
上面設定意思是說 Varnish listen on port 80,傳送 traffic 到後端 5566 port,管理連接埠是 81,也可以使用指令方式:
varnishd -a :80 -b localhost:8080 -T localhost:6082
Varnishd listen on port 80,and forwarding traffic to a web server listen on localhost port 8080. It also turns on the management interface on port 6082.
3. 修改 default.vcl (Varnish Configuration Language) VCL 檔案告訴 Varnishd 正確的處理每個 request processing,包含在接受到 request 之前所處理的行為 vcl_recv(),另外還有 vcl_hit()、vcl_miss() 等…,都是用來處理 cache 如果存在或者是不存在時的情境 request。FreeBSD 預設放在 /usr/local/etc/varnish/default.vcl。打開此檔案,您會看到:
backend default {
   .host = "127.0.0.1";
   .port = "80";
}
您只要把 host = “127.0.0.1” 改成你後端要連接的 ip 或者是 host,這樣 Varnish 會 forward traffic 到您的 web server。接下來只要啟動 apache 跟 Varnish 就算是初步架設完成。
/usr/local/etc/rc.d/apache22 restart
/usr/local/etc/rc.d/varnishd restart
Varnish_01 大家可以看到 61.*.*.* 連到本機 80 port,接下來 Varnish 在開啟隨機 57475 port 連接到 Web Server 5566 port。 Q:如何讓 apache 紀錄正確的 Client IP 到 log 檔案呢? 1. 打開 Vcl config 檔案,寫入 Varnish configuration:
sub vcl_recv {
  # Add a unique header containing the client address
  remove req.http.X-Forwarded-For;
  set    req.http.X-Forwarded-For = client.ip;
  # [...]
}
2. 開啟 apache httpd.conf 加入此行:
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" varnishcombined
Varnish_02 Q:如何讓 PHP 程式紀錄正確的 Client IP? 可以參考底下程式碼就可以完全抓到 Proxy 後面真正使用者IP,否則您的 Web 只會抓到 Reverse Proxy 的 IP Address。
function getIP() {
  if (validip($_SERVER["HTTP_CLIENT_IP"])) {
    return $_SERVER["HTTP_CLIENT_IP"];
  }
  foreach(explode(",",$_SERVER["HTTP_X_FORWARDED_FOR"]) as $ip) {
    if (validip(trim($ip))) {return $ip;}
  }
  if (validip($_SERVER["HTTP_X_FORWARDED"])) 
  {
    return $_SERVER["HTTP_X_FORWARDED"];
  }
  else if (validip($_SERVER["HTTP_FORWARDED_FOR"])) 
  {
    return $_SERVER["HTTP_FORWARDED_FOR"];
  } 
  else if (validip($_SERVER["HTTP_FORWARDED"])) 
  {
    return $_SERVER["HTTP_FORWARDED"];
  } 
  else if (validip($_SERVER["HTTP_X_FORWARDED"])) 
  {
    return $_SERVER["HTTP_X_FORWARDED"];
  } 
  else 
  {
    return $_SERVER["REMOTE_ADDR"];
  }
}

function validip($ip) {
  if (!empty($ip) && ip2long($ip)!=-1) {
    $reserved_ips = array (
      array('10.0.0.0','10.255.255.255'),
      array('127.0.0.0','127.255.255.255'),
      array('169.254.0.0','169.254.255.255'),
      array('172.16.0.0','172.31.255.255'),
      array('192.168.0.0','192.168.255.255'),
    );
    foreach ($reserved_ips as $r) {
      $min = ip2long($r[0]);
      $max = ip2long($r[1]);
      if ((ip2long($ip) >= $min) && (ip2long($ip) <= $max)) return false;
    }
    return true;
  } 
  else 
  {
    return false;
  }
}[/code]
Q:rotate Varnish log file every day?
打開 /etc/newsyslog.conf,加入底下兩行
/var/log/varnish.log        640     7   *   @T00    JB  /var/run/varnishlog.pid
/var/log/varnishncsa.log    640     7   *   @T00    JB  /var/run/varnishncsa.pid
每天12點進行 log 備份,使用 gzip 壓縮 log 檔案。