請教前輩在 compile PHP 時的一些觀念

edited 十月 2013 in 伺服器環境
如題,
我簡單列出將 PHP 以 APACHE 的靜態模組來安裝的過程:
1. cd apache_1.3.x
2. ./configure
3. cd php-4.x.y
4. ./configure --with-mysql --with-apache=../apache_1.3.x
5. make
6. make install
7. d apache_1.3.x
8. ./configure --prefix=/www --activate-module=src/modules/php4/libphp4.a
9. make
(you should now have an httpd binary which you can copy to your Apache bin
dir if it is your first install then you need to "make install" as well)
第 9 步的描述提到 -- 將所產生的 httpd binary file 複製到 APACHE 安裝位置的
bin 目錄中.
若非首次安裝 APACHE ,可不用執行 make install 了.

├128┤ Q1:
請問,為何若非首次安裝 APACHE,就無須作 make install 呢?




關於將 PHP 以 APACHE 的動態共享物件(DSO)安裝的 --with-apxs ,其提到:
Note: Make sure you specify the installed version of apxs when
using --with-apxs=/path/to/apxs. You must NOT use the apxs version
that is in the apache sources but the one that is actually
installed on your system.

├128┤ Q2:
我不大懂其要我於安裝 PHP 時在作 --with-apxs 前須注意什麼事?




關於 httpd.conf 中的 user 及 group 設定,
PHP 的安裝文件中有一處寫到:
Note: Apache's default httpd.conf currently ships with a section
that looks like this:

User nobody
Group "#-1"

Unless you change that to "Group nogroup" or something like that
("Group daemon" is also very common) PHP will not be able to open
files.

├128┤ Q3:
其中的 Group "#-1" 是否可換成任意一個群組呢?
這裡的使用者與群組設定為何會與 PHP 有關呢?

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=633

評論

  • edited 六月 2005
    請問,為何若非首次安裝 APACHE,就無須作 make install 呢?
    這是 suggestion,而不是 rule。

    既然是自己編譯,就必須要自己維護軟體。而維護軟體的方法非常多,每個人的習慣也不同。不同的作業系統如 Linux, FreeBSD,或是不同的套件如 Debian, Fedora, Slackware,也有不同的預設選項與管理方式。因此,決定如何管理自己編譯的軟體之前,要先熟悉既有作業系統的運作細節。

    Apache 編譯後 make install,會將原有的一些檔案覆蓋掉。這其中,可能包括某些設定檔。如果沒有一套機制,備份原先的設定檔,直接 make install,是很不妥的。換句話說,如果有做好備份的工作,設置有完善的移除機制,編譯後直接 make install,並無不可。
    Note: Make sure you specify the installed version of apxs when
    using --with-apxs=/path/to/apxs. You must NOT use the apxs version
    that is in the apache sources but the one that is actually
    installed on your system.
    這意思是說,使用 "--with-apxs" 選項的時候,所指定的 apxs,必須是先前已經安裝(即 make install 之後)的 apxs,而不是編譯後,尚停留在 Apache source directory 底下的 apxs。

    換句話說,編譯並安裝 Apache 後,會有兩個 apxs,一個是編譯好的,停留在 Apache source directory 底下的 apxs。另一個是 make install 之後,安裝到指定位置的 apxs。而 "--with-apxs" 選項,要指定後者。

    譬如說,make install 之後,我的 apxs 位於

    /usr/local/apache/bin/apxs

    所以,"./configure" 的時候,我要指定

    --with-apxs=/usr/local/apache/bin/apxs
    其中的 Group "#-1" 是否可換成任意一個群組呢?
    這裡的使用者與群組設定為何會與 PHP 有關呢?
    這裡的群組,基本上,只要具備三個條件即可。

    第一個是,Apache 執行時所使用的身分(在這兒是 nobody)在系統裡頭是存在的。
    第二個是,設定的 User(在這兒是 nobody) 屬於這個群組。
    第三個是,這個 Group(譬如說 nobody)必須在系統當中(/etc/groups),是存在的。

    至於說 User 該設哪一個,Group 該設哪一個,取決於該作業系統的設定,或是套件的設定,或是 Apache 編譯安裝者自己的考量,沒有一定的答案。但是,基本上,只要符合上述三個條件,應該都可以正常執行。
  • edited 六月 2005
    ├151┤ 太謝謝你了,總算有人知道我要的是什麼,好感動!!

    Q1.
    --with-apxs,的 "with" 該怎麼形容其意義較貼切,是呼叫的意思嗎,還是有更好的詮釋?

    例如執行:
    cd php-4.x.y
    ./configure --with-mysql --with-pear --with-iconv
    若要如此編譯 php,
    是否這些程式,如: mysql , pear..都得先裝好才行呢?


    Q2.
    關於" make install ",文件所提及的: 未免於覆蓋的問題,建議在初次安裝編譯時使用即可 -- 這觀念是否適用於所有程式如: apache , php , mysql...??
    若是,那我如何得知 make 產生的所有(一大堆)檔案要安置於何處呢?

    在[如何以非 root 啟動 MySQL server]那偏,您有提過 "編譯安裝備忘錄",
    請問是以人工手動方式記下,還是有什麼程式指令可使用呢?...(抱歉我還很菜)
    若是,通常須紀錄的訊息有哪些重點?


    Q3.
    ---
    httpd.conf 中看到的所有藉由 LoadModule 進來的都是當初以 DSO 方式安裝的,對嗎?


    Q4.
    ---
    至於說 User 該設哪一個,Group 該設哪一個,取決於該作業系統的設定,或是套件的設定,或是 Apache 編譯安裝者自己的考量
    可以麻煩您說說考量時該思考的方向...,嗯,我沒有要答案,如此問只是想吸收一些該具備的觀念,know how...感激不盡!
  • edited 六月 2005
    Q1.
    --with-apxs,的 "with" 該怎麼形容其意義較貼切,是呼叫的意思嗎,還是有更好的詮釋?
    例如執行:
    cd php-4.x.y
    ./configure --with-mysql --with-pear --with-iconv
    若要如此編譯 php,
    是否這些程式,如: mysql , pear..都得先裝好才行呢?
    怎麼詮釋我是不太清楚,那不過是一個參數,提供給 "./configure" 做參考。也就是說,"./configure" 會優先考慮,但是未必會照著做。這其實就是 "./configure" 的目的,在編譯之前,先確認系統環境與選項的優先次序。

    當然,執行前,諸如 MySQL, Pear, iconv 這些環境條件都必須事先具備。如果不具備,但是指定該選項,通常,"./configure" 會有警告訊息,之後,依照它預設的選項去偵測系統編譯環境。

    有時候也會因此而停止執行 "./configure" 的動作。這全取決於 shell script 本身是怎麼寫的。
    關於" make install ",文件所提及的: 未免於覆蓋的問題,建議在初次安裝編譯時使用即可 -- 這觀念是否適用於所有程式如: apache , php , mysql...??
    若是,那我如何得知 make 產生的所有(一大堆)檔案要安置於何處呢?
    這是重點。

    基本上,沒有標準答案。

    這就是為什麼,面對一個不熟悉的軟體,編譯安裝之前,務必先看 README 或 INSTALL。因為,所有的注意事項與解答,幾乎都在裡頭。

    如何得知 "make install" 之後,做了哪些動作,方法很多。

    有人研究 Makefile 本身,有人另外開一個虛擬目錄試著安裝看看,有人使用 system call 來協助找尋系統新增的檔案,有人採用 "find" 這個指令來搜尋,有人直接採用系統的套件管理機制。

    至於說哪種方式比較好,比較有效率,要看是在哪一種作業系統底下,管理軟體的目的是什麼,來決定。

    我在 Linux 底下,是使用 installwatch 這個程式來協助管理。在 FreeBSD, NetBSD, OpenBSD 底下,是以自己寫的一個 shell script,以 "find" 做搜尋,來做套件管理。當然,有時候,必須配合系統設定,採用既有的套件管理機制。
    在[如何以非 root 啟動 MySQL server]那偏,您有提過 "編譯安裝備忘錄",
    請問是以人工手動方式記下,還是有什麼程式指令可使用呢?
    是以人工的方式,將編譯安裝 MySQL 需要注意的事項,拷貝到一個文字檔做備忘。並且,記錄當時的編譯選項,以及編譯安裝後的執行結果,以作為日後的參考。

    您的問題,我就是直接參考手邊的記錄備忘檔。

    有些軟體;譬如 MySQL;需要注意的地方太多,不同的作業系統、不同的編譯器、不同的使用目的,有不同的考量與參數選項。如果我的編譯安裝環境是 Linux,就無須考量 Windows, Solaris, HP-UX 底下的編譯需求。將說明文件當中,有關 Linux 的部分,擷取下來,有助於下次編譯時,快速找到自己需要的資訊,而不需要整份文件,從頭到尾再看一遍。
    httpd.conf 中看到的所有藉由 LoadModule 進來的都是當初以 DSO 方式安裝的,對嗎?
    對。
    可以麻煩您說說考量時該思考的方向...
    這沒有固定的答案。

    因為,原始程式碼只是原始程式碼,編譯安裝者要做什麼,只有他自己最清楚。如果要說建議,大概就是,解開 tar ball 之後,務必先看 README 或 INSTALL。

    從應用軟體到作業系統,我大多都是自己編譯維護。但是,電腦不是我的本科,程度只是普普通通而已。我的絕招只有一個,就是「先看 README」。 :-P
  • edited 六月 2005
    THANKS A LOT!!

    ├004┤ 於 -- "with" 該怎麼形容其意義較貼切?"
    由於在編譯 APACHE 時好像很少看到有使用 --with 開頭的參數,而編譯 PHP 則常常可見,所以我才會這樣問...
    (因為不大想強記,感覺在 LINUX 領域中有太多東西需要用記/背的...)



    installwatch 是否類似 Checkinstall(免人工追蹤的移除工具)...哪個較好用?

    這是關於其網站上的一段話:

    After you ./configure; make your program, CheckInstall will run make install
    (or whatever you tell it to run) and keep track of every file modified by
    this installation, using the excelent installwatch utility written by Pancrazio
    'Ezio' de Mauro ([email protected]).

    When make install is done, CheckInstall will create a Slackware,
    RPM or Debian compatible package and install it with Slackware's
    installpkg, "rpm -i" or Debian's "dpkg -i" as appropriate, so you
    can view it's contents with pkgtool ("rpm -ql" for RPM users or
    "dpkg -l" for Debian) or remove it with removepkg ("rpm -e"|"dpkg -r").


    -> 我整理如下:(不知道對不對啦..#$%^&)
    若執行過./configure 與 make 後,可直接執行 Checkinstall ,
    執行後會做 make install 並且依選項作一個 -- 例如: Redhat-like系列用的.rpm,
    然後會自動做 rpm -i ,總之, checkinstall 只是把本來 make install 會複製的檔案做成 rpm,所以最後等於還是用
    rpm 在管理.

    ├128┤ 嗯,幾個問題請教一下有用過的人:

    [1].
    那我日後若要移除用 Checkinstall 安裝的 tarball 程式時,
    要執行的 rpm -e "名稱" 的名稱該是什麼呢?

    [2].
    還有,以後若需重新編譯時,是否如首次安裝一樣在做完make後,
    直接執行Checkinstall即可...
    (當然啦,一些自己改過的設定檔要先備份!)

    [3].
    Checkinstall本身需安裝嗎...還是放在任何位置執行皆可?



    知以任意身份(權限越低越安全)啟動 APACHE , MySQL 是 OK 的.
    ..,然 MySQL 還須對資料庫的相關檔案再作 access mode 的變更,舉例如下:

    chown -R user_name /path/to/mysql/datadir
    ├128┤ -> APACHE 有類似的要求嗎?
Sign In or Register to comment.