以前編譯apache的時候
都是google搜索到的直接拿來用
這次自己編譯mod_rewrite和ssl遇到了問題
又不知道問題出在哪裡
一個是mod_rewrite模塊沒有起作用
一個是以ssl啟動apache的時候報告如下錯誤:
apachectl startssl
Syntax error on line 246 of /usr/local/apache2/conf/httpd.conf:
Cannot load /usr/local/apache2/modules/mod_ssl.so into server: /usr/local/apache2/modules/mod_ssl.so: undefined symbol: X509_free
後來經過查找
明白了問題出在哪裡
當時我是這麼編譯apache的
./configure
--prefix=/usr/local/apache2
--enable-so
--enable-mods-shared=most
--enable-rewrite
--enable-speling
--enable-forward
--enable-ssl
--with-ssl=/usr/local/openssl
而問題就出在–enable-so
現在知道了–enable-so的意思是說
讓apache 核心裝載DSO,但是不實際編譯任何動態模塊
–enable-ModuleName的意思是說 編譯并包含模塊ModuleName
而 –enable-ModuleName=shared 的意思是說將這個模塊編譯成動態的.
明白了這幾個選項的意思,感覺就水落石出了
根據上面的總結
我應該去掉–enable-so這行
如何希望動態編譯模塊
比如:–enable-rewrite應該替換為: –enable-rewrite=shared
最後,我將要編譯的應該為:
./configure
--prefix=/usr/local/apache2
--enable-mods-shared=most
--enable-rewrite
--enable-speling
--enable-forward
--enable-ssl
--with-ssl=/usr/local/openssl
上面中 –enable-mods-shared=most的意思是說 動態的編譯進來大多數的模塊
而 –enable-mods-shared=all是指動態的編譯所有的模塊
如果把-shared去掉,就是靜態的編譯了…
綜上所述
總結出了我個人對apache的動態與靜態編譯的理解
好比有兩個人a和m
a代表apache,m代表module
要想讓a使用m的東西
一個方法是把m的東西都放到a那裡去,a使用的時候就是現成的了
就是所謂的靜態編譯
還有一個方法,
就是告訴a, m的住址,當a要使用m的東西的時候,a去找m,然後使用
不過,這種方法要注意的一個問題就是:m必須要有實際的住址,
否則a會找不到m而產生錯誤的,我此文開始提到的 apachectl startssl產生
的錯誤就是這個原因,應該再編譯好ssl才可以的.
這種方法也就是apache 的動態(DSO)編譯了
2009年9月26日 星期六
[轉貼]apache動態編譯/靜態編譯問題
出處: apache動態編譯/靜態編譯問題 - 城市胡同
2009年9月18日 星期五
[轉貼]在Blogger中插入程式碼
1.將程式碼丟到HTML Encoder轉換
2.修改Blogger的CSS: [版面配置] → [修改HTML] → 勾選[展開小裝置範本], 插入這一段
3.將轉換過的程式碼包起來, 未來就可以快樂的貼程式碼了
出處: 在Blogger文章中插入程式碼
2.修改Blogger的CSS: [版面配置] → [修改HTML] → 勾選[展開小裝置範本], 插入這一段
.post pre {
background: #F0F0F0 url(http://your.domain.address/blogger-code.gif) repeat-y scroll left top;
border: 1px solid #CCCCCC;
color: #333333;
display: block;
font-family: Courier New;
font-size: 10pt;
line-height: 120%;
margin: 5px 0 0 20px;
max-height: 200px;
overflow: auto;
padding: 10px 10px 10px 21px;
width: 90%;
}3.將轉換過的程式碼包起來, 未來就可以快樂的貼程式碼了
<pre>you code here</pre>
出處: 在Blogger文章中插入程式碼
2009年6月28日 星期日
如何在Windows上建置mobile device的模擬環境
由於瀏覽器的支援度與螢幕的大小等問題, 常常我們以電腦上的瀏覽器和以行動裝置上的瀏覽器觀看網站, 所看到的結果會有所不同, 因此我們會需要另外建置一適合行動裝置所瀏覽的網站, 這時就需要建置行動裝置的模擬環境了...
建置Windows Mobile 6與設定網路共用
建置Android
建置Windows Mobile 6與設定網路共用
Download and install Microsoft ActiveSync相關圖文可參考這篇
Download and install the Microsoft Device Emulator 3
Download and install the Windows Mobile 6 Professional Images
Start -> Programs -> Windows Mobile 6 SDK -> Tools -> Device Emulator Manager->Right Click the Entry and select "Cradle"
In ActiveSync panel, check the Allow connections to one of the following box, then select DMA from the dropdown list and click OK
建置Android
Download and install Android SDK相關圖文可參考這篇
Download and install Eclipse(若只需使用Android的瀏覽器則不需安裝)
2009年6月9日 星期二
Split Function in SQL Server 2005
有鑒於事情應該正常分工的政策下(其實是覺得資料庫使用率偏低@@), 在有欄位需要以類似split的函式取出所要的部份需求, 撰寫一函式與相關的SQL語法如下:
1. SQL Server 2005->Object Explorer->Databases->New Query
2. Create split function
參考Split Function in Sql Server
1. SQL Server 2005->Object Explorer->Databases->New Query
2. Create split function
IF OBJECT_ID (N'dbo.split', N'IF') IS NOT NULL3. Using nested queries with split function
DROP FUNCTION dbo.split
GO
CREATE FUNCTION dbo.split(@String VARCHAR(8000), @Delimiter CHAR(1))
RETURNS @temptable TABLE (items VARCHAR(8000))
AS
BEGIN
DECLARE @idx INT
DECLARE @slice VARCHAR(8000)
SELECT @idx = 1
IF LEN(@String)<1 idx =" CHARINDEX(@Delimiter,@String)" slice =" LEFT(@String,@idx" slice =" @String">0)
INSERT INTO @temptable(Items) VALUES(@slice)
SET @String = RIGHT(@String,len(@String) - @idx)
IF LEN(@String) = 0 BREAK
END
RETURN
SELECT DISTINCT FIELD1_NAME FROM TABLE1_NAME WHERE FIELD2_NAME = (
SELECT TOP (1) items FROM
dbo.split(
(SELECT FIELD3_NAME
FROM TABLE2_NAME
WHERE (FIELD4_NAME = 'FIELD4_VALUE')), ':')
)
參考Split Function in Sql Server
2009年6月8日 星期一
FreeTDS的加密傳輸(Secure Connection)
最近遇到的鐵板是使用FreeTDS連接SQL Server會出現模稜兩可的Msg 20017錯誤訊息,
使用TDSDUMP看錯誤訊息後發現在傳輸建立初期就已經被中斷,
在來回比對之後才發現遇到了有加密(Force Encryption)的SQL Serve,
需以--with-openssl=/src/openssl --with-gnutls的設定重新安裝FreeTDS, 並且在FreeTDS的設定檔中加上 encryption = required或request的參數,
看似美好, 但重新安裝後仍遇到一樣的錯誤訊息, 再度以TDSDUMP檢查後發現訊息有所不同了, 是在送出表頭前出錯的...
原來因為一開始安裝機器時不想裝進一些亂七八糟的東西, 所以只選了確定要的套件, 因此少裝了某些加密模組, 最後還是只好拿出光碟片乖乖的把base的東西補齊,
終於可以快快樂樂的以FreeTDS進行加密傳輸了...
Msg 20017, Level 9, State -1, Server OpenClient, Line -1
Unexpected EOF from the server
使用TDSDUMP看錯誤訊息後發現在傳輸建立初期就已經被中斷,
util.c:334:tdserror(0x997e0a8, 0x997ea50, 20017, 0)
util.c:368:tdserror: client library returned TDS_INT_CANCEL(2)
在來回比對之後才發現遇到了有加密(Force Encryption)的SQL Serve,
需以--with-openssl=/src/openssl --with-gnutls的設定重新安裝FreeTDS, 並且在FreeTDS的設定檔中加上 encryption = required或request的參數,
看似美好, 但重新安裝後仍遇到一樣的錯誤訊息, 再度以TDSDUMP檢查後發現訊息有所不同了, 是在送出表頭前出錯的...
net.c:779:Sending packet
0000 12 01 00 34 00 00 00 00-00 00 15 00 06 01 00 1b |...4.... ........|
0010 00 01 02 00 1c 00 0c 03-00 28 00 04 ff 08 00 01 |........ .(......|
0020 55 00 00 00 4d 53 53 51-4c 53 65 72 76 65 72 00 |U...MSSQ LServer.|
0030 f2 31 00 00 - |.1..|
原來因為一開始安裝機器時不想裝進一些亂七八糟的東西, 所以只選了確定要的套件, 因此少裝了某些加密模組, 最後還是只好拿出光碟片乖乖的把base的東西補齊,
終於可以快快樂樂的以FreeTDS進行加密傳輸了...
2009年5月19日 星期二
在Linux環境下以PHP連結SQL Server
若在Windows環境下安裝PHP, 通常可以很輕鬆的連結SQL Server, 但在Linux環境下就需要額外安裝FreeTDS, 詳細安裝步驟可以參考這篇與這篇, 我也順便再記錄一次操作步驟吧...
1) 安裝FreeTDS:
在存取SQL Server 2005時, 若遇到欄位型態為uniqueidentifier, PHP無法直接取得其欄位值, 需在SQL查詢以SELECT CONVERT(VARCHAR(36), field_name) AS 'field_name'轉換型態才可使用, 而要新增uniqueidentifier類型的欄位時, 須以SQL Server內建之NewID()函式產生唯一的GUID
1) 安裝FreeTDS:
- 先下載FreeTDS的source,
- 編譯參數: --prefix=/usr/local/freetds --enable-msdblib
- 完成安裝後, 修改/etc/ld.so.conf, 加入/usr/local/freetds/lib; 以ldconfig重新載入函式
[foo]3) 測試連線
host = your.mssql.server.ip
port = 1433
client charset = UTF-8 # 以UTF-8編碼方式連線
tds version = 8.0
#tds version: 4.2 (適用 MS SQL Server 6.x); 7.0 (適用 7.x); 8.0 (適用 2000/2005)
- # /usr/local/freetds/bin/tsql -S foo -U sa
- 1> use my_db
- 2> select * from my_table
- 3> go
- 新增編譯參數: --with-mssql=/usr/local/freetds
在存取SQL Server 2005時, 若遇到欄位型態為uniqueidentifier, PHP無法直接取得其欄位值, 需在SQL查詢以SELECT CONVERT(VARCHAR(36), field_name) AS 'field_name'轉換型態才可使用, 而要新增uniqueidentifier類型的欄位時, 須以SQL Server內建之NewID()函式產生唯一的GUID
2009年5月12日 星期二
在Linux環境安裝Subversion
最近由於工作需要, 必須在Linux下安裝版本控制系統, 經過比較之後, 雖然Subversion(SVN)在commit的速度不如Git, 而且branch的管理也較差, 但用順手後也就習慣了, 在此紀錄一下安裝過程...
在Linux環境下先抓取Apache和SVN的source後編譯, 由於習慣使用webdav的方式透過http更新, 因此在Apache編譯前要先設定
根據Apache2.0x的預設安裝路徑, 繼續SVN的編譯
在安裝SVN的過程中有時會出現'configure: error: Subversion requires SQLite'的錯誤訊息, 這時就須先下載sqlite-amalgamation, 解開壓縮檔後將sqlite3.c複製到subversion-x.x.x/sqlite-amalgamation的目錄下再行安裝,
安裝完成後開始建立Repository, 注意不要建立在web server文件下的目錄,
有時也會遇到'txn-current-lock': Permission denied的問題, 就必須修改權限給Apache的使用群組(可見httpd.conf)
修改httpd.conf設定,
加上Apache基本認證
確認是否成功, 重新啟動Apache
開啟瀏覽器輸入以下網址
如果在登入帳號密碼後看到下列訊息, 表示成功安裝以webdav存取的的svn server
進一步的設定可參考Subversion系統, Subversion FAQ與Version Control with Subversion, 而在Window環境下安裝可參考這裡
在Linux環境下先抓取Apache和SVN的source後編譯, 由於習慣使用webdav的方式透過http更新, 因此在Apache編譯前要先設定
# ./configure --enable-dav --enable-so --enable-maintainer-mode
根據Apache2.0x的預設安裝路徑, 繼續SVN的編譯
# ./configure --with-apxs=/usr/local/apache2/bin/apxs --with-apr=/usr/local/apr/bin/
在安裝SVN的過程中有時會出現'configure: error: Subversion requires SQLite'的錯誤訊息, 這時就須先下載sqlite-amalgamation, 解開壓縮檔後將sqlite3.c複製到subversion-x.x.x/sqlite-amalgamation的目錄下再行安裝,
安裝完成後開始建立Repository, 注意不要建立在web server文件下的目錄,
# svnadmin create /var/svn
有時也會遇到'txn-current-lock': Permission denied的問題, 就必須修改權限給Apache的使用群組(可見httpd.conf)
# chown -R daemon:daemon /var/svn
修改httpd.conf設定,
# vim /usr/local/apache2/conf/httpd.conf
[add]
<location /myprj>
Dav svn
SVNPath /var/svn/myprj
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile /usr/local/apache2/conf/auth-file
Require valid-user
<//Location>
[/add]
加上Apache基本認證
# /usr/local/apache2/bin/htpasswd -c /usr/local/apache2/conf/auth-file USERNAME
確認是否成功, 重新啟動Apache
# /usr/local/apache2/bin/apachectl restart
開啟瀏覽器輸入以下網址
http://127.0.0.1/myprj
如果在登入帳號密碼後看到下列訊息, 表示成功安裝以webdav存取的的svn server
myprj - Revision 0: /
進一步的設定可參考Subversion系統, Subversion FAQ與Version Control with Subversion, 而在Window環境下安裝可參考這裡
訂閱:
文章 (Atom)
