作爲一名php愛好者,最近在部署項目時想嘗試下用git自動部署的方案。以往用手動發包更新的方式實在太落伍了。
藉着git的熱度,本人發現git提供webhook的方式可以在服務器上直接拉取代碼實現更新,決定一試。
首先編寫一個簡單webhook.php的文件放在網站的根目錄用來被git網站請求。代碼如下:
$cmd = "cd /usr/share/path && git pull && echo 'success' "; //關鍵命令 /usr/share/path爲項目倉庫目錄
echo shell_exec('php -v') ."<br>"; //用來測試exec命令是否有權限執行
echo shell_exec('whoami') ."<br>"; //用來查看當前執行者得用戶名稱
var_dump(shell_exec($cmd)); //返回成功還是null
可以被git訪問的地址假設爲http://www.aaa.com/webhook.php
然後用ssh使用root賬號登錄服務器,在網站目錄下執行cli 命令php webhook.php
成功完成了git的代碼拉去更新,此root賬號已配置過git公鑰。
接着用瀏覽器方式訪問網站地址 /webhook.php文件,這時var_dump返回結果爲null,很明顯沒有執行成功,執行exec結果:
- 判斷php.ini中是否禁用了exec 等命令,這裏沒有禁用exec,因此忽略這條
- 網站環境使用centos7 nginx+php-fpm +php.7.2 的配置,使用
ps aux | grep php
查看php-fpm的用戶爲apache。在php-fpm 下www.conf中發現 指定的group 和user 都爲 apache
因此編輯 vim etc/sudoer
這個文件。目的是給apache用戶的最大的執行權限
#Allow root to run any commands anywhere
root ALL=(ALL) ALL
apache ALL=(ALL) ALL //找到這行 後添加apache用戶
完成了上述檢查後 本人再次用瀏覽器訪問網站地址 /webhook.php文件,仍然返回null。 驚奇到懷疑人生。
於是乎本人去掉了命令中的 git pull 這行,然後執行程序,發現成功返回了信息。 因此判斷 是apache用戶沒有git權限導致,拉取失敗。
由於apache用戶是系統爲進程創建的用戶 無法直接登錄, 所以無法直接使用apache登錄並創建ssh密鑰,切換apache賬號時會提示 This accountis currently not available.
因此本人改變思路,將root下.ssh目錄複製到本地,此目錄下密鑰之前已配置成功,然後查看 /etc/passwd 文件 ,發現了這行 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
也就是說apache的用默認路徑是/usr/share/httpd目錄, 所以把本地.ssh文件上傳到該目錄下使該apache用戶也有權限訪問git。最後使用瀏覽器訪問webhook.php,提示成功!大功告成
另外值得一提: 網站項目中.git 目錄下的FETCH_HEAD 文件 需要給apache用戶讀寫權限,否則也會因爲權限不足而報錯。
本文原創於www.7php.cn