聚會時間公告: 因應COSCUP 2011, Kalug 8月份休會一次

十二月 8, 2013

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» Jenkins + Apache User Auth

jenkins_logo

上個月寫過一篇如何設定 Nginx + Jenkins 文章,可以參考: Jenkins + Nginx User Auth,這次筆記 Jenkins + Apache 設定方式

安裝 Jenkins

在 Ubuntu 環境,可以直接參考 Installing Jenkins on Ubuntu

$ wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
$ sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'
$ sudo apt-get update
$ sudo apt-get install jenkins

設定 Apache

如果您是需要用一個特定 domain 也就是 jenkein.example.com,沒有 sub folder,你可以透過底下設定

啟用 Apache proxy 模組

$ a2enmod proxy
$ a2enmod proxy_http

Apache virtual host 部份加入底下設定

ProxyRequests Off
<Proxy *>
    Order deny,allow
    Allow from all
</Proxy>
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080

設定到這邊,重新啟動 Apache 即可,如果你是使用 sub folder 的方式,有就是透過 www.example.com/jenkins 方式瀏覽,請換成底下設定

ProxyRequests Off
<Proxy *>
    Order deny,allow
    Allow from all
</Proxy>
ProxyPreserveHost On
ProxyPass /jenkins http://127.0.0.1:8080/jenkins

但是你會發現 css, js, image 都讀取錯誤。這時候請修改 /etc/default/jenkins 將 JENKINS_ARGS 加入 –prefix 設定

JENKINS_ARGS="--prefix=$PREFIX --httpListenAddress=127.0.0.1 --webroot=/var/cache/jenkins/war --httpPort=$HTTP_PORT --ajp13Port=$AJP_PORT"

重新啟動 Jenkins 及 Apache 即可。最後透過 htpasswd 將 jenkins web 目錄鎖起來

<Location /jenkins/>
    AuthType basic
    AuthName "jenkins"
    AuthUserFile "/etc/apache2/conf/.htpasswd"
    Require valid-user
</Location>

六月 8, 2013

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» Nginx + phpMyAdmin 搭配 SSL 設定

mysql_logomysql_logo

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

1. phpMyAdmin 設定

直接設定 config.inc.php,加入底下設定

$cfg['ForceSSL'] = true;

2. Nginx 或 Apache 設定

打開 Apache mod_rewrite 功能,將設定寫入 .htaccess

RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^/directory(.*)$ https://%{HTTP_HOST}/directory$1 [L,R]

或是使用 Nginx 設定,將 80 port 轉到 https,設定 443 port 的 SSL 憑證。

server {
  listen 80;
  server_name xxx.xxx.xxx.xxx;
  rewrite ^ https://$server_name$request_uri? permanent;
}

server {
  # listen 80 default_server deferred; # for Linux
  # listen 80 default_server accept_filter=httpready; # for FreeBSD
  #listen 80;

  listen 443 ssl spdy;
  ssl on;
  ssl_certificate /etc/nginx/conf/api.ovoq.tv/server.crt;
  ssl_certificate_key /etc/nginx/conf/api.ovoq.tv/ssl.key;
  ssl_protocols       SSLv3 TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers         HIGH:!aNULL:!MD5;
  ssl_session_cache shared:SSL:10m;
  ssl_session_timeout 5m;

  # The host name to respond to
  server_name xxx.xxx.xxx.xxx;
}

上面 Nginx 設定完成後,會發現登入 phpMyAdmin 後,網址被轉成

http://xxx.xxx.xxx.xx:443

馬上看到網頁噴

the plain http request was sent to https port

看到這訊息,是 Nginx 產生的,error code 是 497,其實將此 error 導向正確的地方就可以了,在 Nginx 設定檔加入

error_page 497 https://$host$request_uri;

就可以解決此問題了。

Ref:
The plain HTTP request was sent to HTTPS port
Forcing SSL with phpMyAdmin

十月 8, 2012

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» PHP MVC Framework 搭配 Nginx + PHP-FPM 設定檔

Laravel PHP Framework

相信大家都知道 Nginx 搭配 PHP-FPM 用起來效能還不錯,這次來筆記如何設定 Nginx 去除 PHP MVC Framework 討厭的 index.php 字串,不管是 LaravelCodeIgniter 教學文件都是在 Apache 設定 .htaccess 來達成 Cleaner URL,Apache 最大好處支援 .htaccess,但是 Nginx 也有強大的效能,此篇紀錄如何設定 Nginx 達成 mod_rewrite 效果。

首先來看看 apache .htaccess 是如何設定:

<IfModule mod_rewrite.c>
     RewriteEngine on

     RewriteCond %{REQUEST_FILENAME} !-f
     RewriteCond %{REQUEST_FILENAME} !-d

     RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>

上面的意思就是代表如果該 URL 是不存在的檔案或者是目錄就全部導向 index.php,如果在 Ubuntu 底下可能會產生 Loop,請把 .htaccess 改成底下

Options +FollowSymLinks
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule . index.php [L]

接著 Nginx 是如何設定呢?打開虛擬主機設定檔 /etc/nginx/sites-available/xxxx,將底下設定寫入

server {
    listen       80;
    server_name  laravel.wuboy.twbbs.org;
    root         /usr/home/git/laravel/public;

    access_log /var/log/nginx/laravel_access.log;
    error_log /var/log/nginx/laravel_error.log;

    location / {
        index  index.php index.html index.htm;
    }

    if ($request_uri ~* index/?$)
    {
        rewrite ^/(.*)/index/?$ /$1 permanent;
    }

    # removes trailing slashes (prevents SEO duplicate content issues)
    if (!-d $request_filename)
    {
        rewrite ^/(.+)/$ /$1 permanent;
    }

    # removes access to "system" folder, also allows a "System.php" controller
    if ($request_uri ~* ^/system)
    {
        rewrite ^/(.*)$ /index.php?/$1 last;
        break;
    }

    # unless the request is for a valid file (image, js, css, etc.), send to bootstrap
    if (!-e $request_filename)
    {
        rewrite ^/(.*)$ /index.php?/$1 last;
        break;
    }

    # catch all
    error_page 404 /index.php;

    # use fastcgi for all php files
    location ~ \.php$
    {
        fastcgi_pass unix:/tmp/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include /usr/local/etc/nginx/fastcgi_params;
        fastcgi_param HTTPS off;
    }

    # deny access to apache .htaccess files
    location ~ /\.ht
    {
        deny all;
    }
}

基本上按照上面的設定,你就可以成功移除 index.php 字眼,底下來解釋此設定檔

if ($request_uri ~* index/?$)
{
    rewrite ^/(.*)/index/?$ /$1 permanent;
}

此設定會將 /controller/index 轉成 /controller,因為每一個 Controller 預設的 method 就是 index,所以我想也不用特別顯示在 URL 上面。permanent 所代表就是 301 轉向。

if (!-d $request_filename)
{
    rewrite ^/(.+)/$ /$1 permanent;
}

此設定會將 URL 最後的 Slash 給拿掉,防止 SEO 取得重複資訊。

if ($request_uri ~* ^/system)
{
    rewrite ^/(.*)$ /index.php?/$1 last;
    break;
}

此設定是禁止存取 system 目錄,此目錄是 CodeIgniter 核心目錄,那 Laravel 沒有此問題,因為你的虛擬主機一定會指向 public 目錄,所以也無法存取上層 Laravel 核心目錄

if (!-e $request_filename)
{
    rewrite ^/(.*)$ /index.php?/$1 last;
    break;
}

此設定來到 URL 最後判斷,如果 URL 連結並非是實體檔案,則全部導向 /index.php?/$1,也就完成了 Cleaner URL 動作,最下面設定了 PHP-FPM Socket Server,這邊就不多說了,設定檔給大家參考,如果有任何問題請留言。

Related View

六月 30, 2012

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» [筆記] 解決 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,將底下內容

<IfModule mod_fcgid.c>
  AddHandler    fcgid-script .fcgi
  FcgidConnectTimeout 20
</IfModule>

取代成

<IfModule mod_fcgid.c>
  AddHandler    fcgid-script .fcgi
  FcgidConnectTimeout 20
  # to get around upload errors when uploading images increase the MaxRequestLen size to 15MB
  MaxRequestLen 15728640
</IfModule>

如果檔案上傳時間不夠,又會出現底下錯誤

mod_fcgid: read data timeout in 40 seconds
Premature end of script headers: index.php

所以我們將設定檔再改成底下就可以了

<IfModule mod_fcgid.c>
  AddHandler    fcgid-script .fcgi

  # fix for:   mod_fcgid: read data timeout in 40 seconds
  IdleTimeout 3600
  DefaultMinClassProcessCount 100
  FcgidConnectTimeout 120
  IPCCommTimeout 400

  # to get around upload errors when uploading images increase the MaxRequestLen size to 15MB
  MaxRequestLen 15728640
</IfModule>

最後附上個人 fcgid.conf 設定檔給大家參考

<IfModule mod_fcgid.c>
  AddHandler    fcgid-script .fcgi .php
  FcgidConnectTimeout 20
  FcgidIPCDir /var/lib/apache2/fcgid/sock
  IdleTimeout 3600
  ProcessLifeTime 7200
  MaxProcessCount 1000
  DefaultMinClassProcessCount 3
  DefaultMaxClassProcessCount 100
  IPCConnectTimeout 8
  IPCCommTimeout 360
  BusyTimeout 300
  FcgidWrapper /usr/bin/php5-cgi .php
  MaxRequestLen 15728640
</IfModule>

參考網站:
[fix] mod_fcgid: HTTP request length xyz (so far) exceeds MaxRequestLen (131072)

Related View

五月 10, 2012

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» 如何使用 Apache Module mod_mime

apache_software_foundation_logo_3074

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

<script type="text/x-mustache-template" data-id="me">
  <!--#include file="assets/templates/test1.mustache" -->
</script>

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

<IfModule mime_module>
    AddType text/x-mustache-template .mustache
    AddOutputFilter INCLUDES .mustache
</IfModule>


接著必須設定網站根目錄可以輸出 include file

<Directory "C:/xampp/htdocs">
    Options All
    AllowOverride All
    SetOutputFilter INCLUDES
    Order allow,deny
    Allow from all
</Directory>

上面例子是 xampp httpd.conf 檔,設定完成後重新啟動 apache,大家就可以發現,原本的 js 就會變成

<script type="text/x-mustache-template" data-id="me">
  Hi, {{first_name}} {{last_name}} 使用者
</script>

這有個缺點就是,之後在轉移機器,就要在重新設定 Apache,為了省掉這個步驟,推薦大家使用 RequireJs 模組: Text plugin

Related View

三月 17, 2011

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» 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 檔案加入底下

修改 /etc/apache2/apache2.conf

# php
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

啟動 fcgid 之前,要先設定 /etc/apache2/mods-available/fcgid.conf,可以參考官網設定方式,在自己微調

<IfModule mod_fcgid.c>
  AddHandler    fcgid-script .php .fcgi
  FcgidIPCDir /var/lib/apache2/fcgid/sock
  IdleTimeout 3600
  ProcessLifeTime 7200
  MaxProcessCount 1000
  DefaultMinClassProcessCount 3
  DefaultMaxClassProcessCount 100
  IPCConnectTimeout 8
  IPCCommTimeout 360
  BusyTimeout 300
  FcgidWrapper /usr/bin/php5-cgi .php
</IfModule>

修改 php.ini (/etc/php5/cgi/php.ini 跟 etc/php5/cli/php.ini)

cgi.fix_pathinfo=1

接下來 enable apache 的 module,利用 a2enmod 指令

a2enmod rewrite
a2enmod include
a2enmod suexec
a2enmod fcgid
# 重新啟動 apache
service apache2 restart

設定 Apache Virtual Host

我們可以參考 /etc/apache2/sites-available/default 預設範例來建立其他 Virtual Host,由於跑 mod_fcgid,所以在 Options 部份請務必加上 ExecCGI

<VirtualHost *>
    ServerName blog.wu-boy.com
    ServerAdmin nobody@blog.wu-boy.com

    DocumentRoot /XXXXXX
    DirectoryIndex index.php

    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/Blog/>
        Options FollowSymLinks ExecCGI
        # Remove ExecCGI if you do not need php
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>
    ErrorLog /var/log/apache2/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog /var/log/apache2/other_vhosts_access.log combined
</VirtualHost>

把此設定檔儲存到 /etc/apache2/sites-available/Blog,接下來用 a2ensite 指令來 enable

# Usage: a2ensite [Virtual Host]
a2ensite Blog

會發現在 /etc/apache2/sites-enabled/ 資料夾裡面多出 Blog 這 Virtual Host,重新啟動 apache2 就完成了。

參考網站:

[Ububtu note.] 關於 Ubuntu, apache, php5, mod_fcgid 與 VirtualBox 筆記
HOWTO: Using php5 with apache2-mpm-worker
Hosting multiple websites with Apache2(利用 a2ensite 新增 Virtual Host)

Related View

八月 23, 2010

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» Html5 模板架構(Boilerplate)

今年在 COSCUP 大會上最主流的議題就是 Html5,今天看到一個網站 HTML5 Boilerplate,這網站提一個全新 html 5 模板,自從離開 Dreamweaver 樣板軟體,利用 Pspad 手動撰寫 html,此網站就發揮非常大的用處,提供全新 html,CSS 以及 javascript,支援了底下很多功能: ...詳全文(共366字)

六月 23, 2010

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» [FreeBSD] update apache -> 2.2.15, PHP -> 5.3.2, and MySQL downgrade to 5.1.9

昨天升級了 FreeBSD 的 Apache, PHP, and MySQL,遇到很多地雷阿,最多的就是 PHP 的部份,因為本來自己使用 5.2.11 版本,但是在 commit port 的時候發生去裝 5.3.2 版本,所以就直接砍掉全部重練,先是遇到 MySQL 問題,原先在 database/mysql60-server 已經被 FreeBSD 移除,任何關於 mysql60 的相關 port 都被 remove 掉了,只好 downgrade 到 mysql 5.1.48 版本,移除同時順手把 apache PHP 相關都拿掉了。

移除 apache mysql php 相關 ports

-rf 依序找尋相關 Mysql ports 移除

pkg_deinstall -rf mysql60-server

接下來安裝 MySQL 5.1.48 Server and Client,可以找到在 databases/mysql51-server and databases/mysql51-client,直接安裝即可

cd /usr/ports/databases/mysql51-server && make install

安裝 Apache 2.2.15

cd /usr/ports/www/apache22 && make WITH_MPM=worker install

安裝 PHP 5.3.2,FreeBSD 把 5.2.X 跟 5.3.X 分開不同資料夾 lang/php5, lang/php52,extension 也是分成兩個,所以要安裝 5.2 版本也是可以的

cd /usr/ports/lang/php5 && make install
cd /usr/ports/lang/php5-extensions/ && make install

以上安裝好,就是苦難的開始,首先 MySQL 從原本的 6.0.9 降到 5.1.48,造成所有資料庫無法讀取,也沒辦法正確啟動 MySQL,馬上噴出底下問題:

090205 11:14:24 mysqld_safe Starting mysqld daemon with databases from /var/db/mysql
/usr/local/libexec/mysqld: Unknown collation ‘#46′ in table ‘plugin’ definition
090205 11:14:24 [ERROR] Can’t open the mysql.plugin table. Please run mysql_upgrade to create it.
090205 11:14:24 InnoDB: Started; log sequence number 0 46429
090205 11:14:24 [ERROR] Fatal error: Can’t open and lock privilege tables: Unknown collation ‘#46′ in table ‘host’ definition

為啥會出現紅色那段字,就是因為字元集不同,MySQL 6 有支援 utf8mb4,但是 5.1.48 版本沒有,所以才會造成無法啟動,解決方法呢?就是把 /var/db/mysql/mysql 砍掉,在重新啟動就可以了,當然您的資料庫也是無法使用,再去其他電腦裝上 MySQL 6.0.9 之後,把 /var/db/mysql/ 底下的資料庫 Copy 過去一份,利用 mysqldump 把全部資料庫 dump 下來,再 restore 回去原來的系統,大致上就可以了。

對於把 PHP 升級到 5.3 的時候,心裡就在想會遇到很多雷,果然是如此,很多 opensource 都尚未支援到 php 5.3,也因此很多函數都無法支援,ereg_ 系列都必須換成 preg_register_globals 的移除,也不能使用 HTTP_GET or HTTP_POST,把 register_long_arrays 拿掉,參考: http://php.net/manual/en/ini.core.phpCodeIgniter V 1.7.2 開始支援 PHP 5.3.0 版本,這樣大致上所有專案都可以順利啟動,底下是在 Wordpress 遇到的問題:

Warning: strtotime() [function.strtotime]: It is not safe to rely on the system’s timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected ‘Europe/Helsinki’ for ‘EEST/3.0/DST’ instead in /path/to/my/www/wp-includes/functions.php on line 35

這在 Wordpress 官網也是有提出此問題,解決方式有兩種,一種是在 wp-config.php 加上 date_default_timezone_set(’UTC‘); 或者是 date_default_timezone_set(’Asia/Taipei‘);,另一種是修改 php.ini,修改

; Defines the default timezone used by the date functions
date.timezone = Asia/Taipei

這樣大致上修補完成,其他程式的修改這裡就不補充了,底下是 PHP 網站所支援的 time zone,可以參考看看其他時區

Reference:
Php 5.3.0 & WP 2.8 (It is not safe to rely on the system’s timezone)
Description of core php.ini directives
現在寫 PHP6-compatible 的一些技巧
List of Supported Timezones

Related View

三月 25, 2010

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» 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

Related View

三月 20, 2010

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» [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;
  }
}

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 檔案。

Related View

五月 6, 2009

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» [網站] 好站連結(一)


FreeBSD

Linux

MySQL

Python

CSS

Apache

PHP

jQuery

javascript

WWW

html

Related View

A Feedjack powered Planet
A Django site.