阿里雲服務器:oneinstack一鍵PHP環境
一、搭建碼雲好倉庫 (略過)
教程:https://blog.csdn.net/haibo0668/article/details/90403673
二、服務器搭建Git oneinstack已經安裝好GIT,版本是:1.8.3
查看git版本
git --version
2.1 在服務器上生成公鑰 (就像在你自己電腦生成公鑰一樣子)
生成公鑰的目的,是爲了更安全更方便的SSH拉取方式,同時讓git命令語句更簡潔。
部署公鑰允許以只讀的方式訪問倉庫,SSH主要用於倉庫在生產服務器的部署上,免去HTTP方式每次操作都要輸入密碼和普通SSH方式擔心不小心修改倉庫代碼的麻煩。
部署公鑰配置後的機器,只支持clone與pull等只讀操作。如果您想要對倉庫進行寫操作,請 添加個人公鑰
2.1.0 生成公鑰
sudo -u www ssh-keygen -t rsa -C "[email protected]"
注意:www表示有權限執行PHP的用戶
2.1.1 如何查看服務器上執行PHP的用戶(www)
xshell下執行 "ps aux|grep php-fpm"
ps aux | grep php-fpm
去找你php-fpm的配置文件,看圖
查看這個文件,查看用戶和組名稱
郵箱可以不同於碼雲帳號,默認三次回車即可生成 ssh key
sudo -u www ssh-keygen -t rsa -C "[email protected]"
說明:你也可以不輸入文件名,使用默認文件名(推薦),那麼就會生成 id_rsa 和 id_rsa.pub 兩個祕鑰文件。
接着又會提示你輸入兩次密碼(該密碼是你push文件的時候要輸入的密碼,而不是github管理者的密碼),
當然,你也可以不輸入密碼,直接按回車。那麼push的時候就不需要輸入密碼,直接提交到github上了,
2.1.2 出現錯誤:無法創建目錄“/home/www/.ssh”
Generating public/private rsa key pair.
Enter file in which to save the key (/home/www/.ssh/id_rsa):
Could not create directory '/home/www/.ssh': Permission denied
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Passphrases do not match. Try again.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
open /home/www/.ssh/id_rsa failed: No such file or directory.
Saving the key failed: /home/www/.ssh/id_rsa.
2.1.3 使用命令查看用戶的家目錄位置
位置:www:x:1001:1001::/home/www:/bin/bash
2.1.4 解決無法創建目錄“/home/www/.ssh”
用FTP軟件查看/home文件夾裏邊,什麼東西都沒有,空白一片
所以需要創建WWW文件夾
[root@ixxxxxxxxxxZ ~]# cd /home
[root@ixxxxxxxxxxZ home]# ls
[root@ixxxxxxxxxxZ home]# ls -l
total 0
[root@ixxxxxxxxxxZ home]# mkdir www
[root@ixxxxxxxxxxZ home]# ls -l
total 4
drwxr-xr-x 2 root root 4096 Aug 2 15:51 www
[root@ixxxxxxxxxxZ home]# sudo chown www.www /home/www/
我花了大約1小時就完成了這件事,最後得到了解決方案。這是由於許可問題。你必須爲你的'hadoop用戶'使用chown。
1.首先製作hadoop目錄。
cd / home
mkdir hadoop
然後檢查'ls -l'。它給出的結果如下:
drwxr-xr-x 2 hadoop hadoop 4096 8月22日22:17 hadoop
2. sudo chown hadoop.hadoop / home / hadoop /
3.然後運行關鍵生成器的剩餘命令。
再生成公鑰一次
sudo -u www ssh-keygen -t rsa -C "[email protected]"
生成成功
2.1.5 修改剛剛生成的公鑰
記下生成公鑰的目錄:
Your identification has been saved in /home/www/.ssh/id_rsa.
Your public key has been saved in /home/www/.ssh/id_rsa.pub.
2.1.6 查看公鑰
cat /home/www/.ssh/id_rsa.pub
說明:
cat 查看
/home/www/.ssh/id_rsa.pub 剛剛上面生成公鑰的完整路徑
2.1.7 把公鑰填入到碼雲上
2.1.8 驗證公鑰是否生效,是否可以鏈接碼雲了
sudo -u www ssh -T [email protected]
四、初始化 (我們需要先在服務器上clone一次,以後都可以實現自動部署了)
Clone克隆代碼
4.1 初始化方法一:初次使用,先克隆一次代碼到網站目錄(推薦這個)
一定要先進入網站根目錄(比如正面webhook文件夾)
sudo -u www git clone 碼雲倉庫SSH地址 /網站根目錄
sudo -u www git clone [email protected]:xxxx/cms.git /data/wwwroot/default/webhook
4.2 初始化方法二:初次使用,先克隆一次代碼到網站目錄
# 進入需要自動部署的目錄xxx (就是服務器上放代碼的地方)
cd xxx
# 初始化
git init
# 添加遠程倉庫
git remote add origin GIT倉庫地址
git報錯:'fatal:remote origin already exists'怎麼處理?
4.2.1、先刪除
1 |
|
4.2.2、再次執行添加就可以了。
git報錯:fatal: remote origin already exists.
遠程來源已經存在
成功
五、碼雲WebHook通知服務器拉取代碼webhook.php
注意:
自動更新到阿里雲服務器代碼
5.1 更新語句一:把遠程和服務器同名分支更新,由本地當前分支決定,默認是把遠程master分支更新到阿里服務器的master分支中
echo shell_exec("cd {$savePath} && git pull {$gitPath} 2>&1");
例子:如果本地(阿里雲服務器)上,默認當前分支是master,那麼就把碼雲的master分支代碼更新過來
5.2 更新語句二 初始化後自動更新代碼纔有用
echo shell_exec("cd $savePath && git checkout -f && git pull $branch 2>&1");
git命令:https://blog.csdn.net/haibo0668/article/details/99690269
代碼一:從碼雲自動更新到服務器一個文件夾
//用於Gitee碼雲通過WebHooks實現自動同步代碼部署
public function webhook()
{
// 先做一下測試
// 測試ls是否能用
// $output = shell_exec('ls -lart');
// echo "<pre>$output</pre>";
// echo shell_exec("ls -a");
error_reporting(1);
//git webhook 自動部署腳本
//項目存放物理路徑,第一次clone時,必須保證該目錄爲空
$savePath = "/data/wwwroot/default/cms.fn321.cn/application/2020";//更新鋒牛代碼
//$savePath = "/data/wwwroot/default/cms.fn321.cn/application";//更新鋒牛代碼
//$savePath8 = "/data/wwwroot/default/www.4008338788.com/application";//更衆聯牛代碼
// $gitPath = "https://gitee.com/fn321/cms.git";//代碼倉庫
$gitPath = "[email protected]:fn321/cms.git";//代碼倉庫 一定要使用ssh方式不然每次都得輸入密碼
$branch = "refs/heads/develop";//同步那個分支
//密碼
$password = 'fn321@20190801/com';
//獲取請求參數
$request = file_get_contents('php://input');
if (empty($request)) {
die('request is empty');
}
//echo $request;
//驗證密碼是否正確
$content = json_decode($request, true);
if ($content['password'] != md5($password)) {
header("HTTP/1.1 403 Forbidden");
die('非法提交');
}
//運行代碼 拉取碼雲最代碼到阿里服務器上
//說明:
//1.shell_exec()即PHP用於執行系統命令的函數,
//2.cd $dir:進入上面設置的項目倉庫文件夾中,
//3.git checkout -f 撤銷本地的修改,
//4.git pull origin master 從碼雲的項目倉庫master分支拉取最新代碼,注意origin爲遠程倉庫的別名,要與 git remote add 遠程倉庫,
//5.別名 倉庫地址 中的遠程倉庫別名保持一致
// echo shell_exec("cd {$savePath} && git checkout -f && git pull {$branch} 2>&1"); //更新鋒牛代碼
//echo shell_exec("cd {$savePath8} && git checkout -f && git pull {$branch} 2>&1"); //更衆聯牛代碼
echo shell_exec("cd {$savePath} && git pull {$gitPath} {$branch} 2>&1");//只能拉取遠程碼雲master分支到阿里雲服務器上,其它分支不會拉取
die('done ' . date('Y-m-d H:i:s', time()));
}
代碼二:從碼雲自動同時候更新到幾個服務器文件夾中
例子:同時更新到服務器2020和2021文件中
//用於Gitee碼雲通過WebHooks實現自動同步代碼部署
public function webhook()
{
// 先做一下測試
// 測試ls是否能用
// $output = shell_exec('ls -lart');
// echo "<pre>$output</pre>";
// echo shell_exec("ls -a");
error_reporting(1);
//git webhook 自動部署腳本
//項目存放物理路徑,第一次clone時,必須保證該目錄爲空
$savePath = "/data/wwwroot/default/xxxx.cn/application/2020";
$savePath1 = "/data/wwwroot/default/xxxxx.cn/application/2021";
// $gitPath = "https://gitee.com/fn321/cms.git";//代碼倉庫
$gitPath = "[email protected]:fn321/cms.git";//代碼倉庫 一定要使用ssh方式不然每次都得輸入密碼
$branch = "refs/heads/develop";//同步那個分支
//密碼
$password = '190801com';
//獲取請求參數
$request = file_get_contents('php://input');
if (empty($request)) {
die('request is empty');
}
//echo $request;
//驗證密碼是否正確
$content = json_decode($request, true);
if ($content['password'] != $password) {
header("HTTP/1.1 403 Forbidden");
die('非法提交');
}
//運行代碼 拉取碼雲最代碼到阿里服務器上
//說明: 1.shell_exec()即PHP用於執行系統命令的函數,
//2.cd $dir:進入上面設置的項目倉庫文件夾中,
//3.git checkout -f 撤銷本地的修改,
//4.git pull origin master 從碼雲的項目倉庫master分支拉取最新代碼,注意origin爲遠程倉庫的別名,要與 git remote add 遠程倉庫,
//5.別名 倉庫地址 中的遠程倉庫別名保持一致
echo shell_exec("cd {$savePath} && git pull {$gitPath} {$branch} 2>&1");//只能拉取遠程碼雲master分支到阿里雲服務器上,其它分支不會拉取
echo shell_exec("cd {$savePath1} && git pull {$gitPath} {$branch} 2>&1");//只能拉取遠程碼雲master分支到阿里雲服務器上,其它分支不會拉取
die('done ' . date('Y-m-d H:i:s', time()));
}
注意:2020和2021兩個文件夾裏邊都上傳一樣子的.GIT文件纔行,就是說要創建一個倉庫,但是這個倉庫同時存在兩個文件夾中
同一個.GIT
關鍵函數:shell_exec
webhooks用到的php代碼中使用了 shell_exec 函數,一般配置php會禁止這個函數,需要打開 shell_exec 函數;
參考:解決PHP調用exec或shell_exec的問題 https://blog.csdn.net/Qiang1370373713/article/details/84539990
注意:開放shell_exec這個php函數是非常危險的,因此切記不要在生產環境開放這個函數,更加不能用root權限去執行php。
建議將以下代碼放到一個單獨配置的測試用網站環境,除log日誌文件以外,此環境下所有文件禁止www用戶的寫入和修改。
5.1 開啓 shell_exec 函數;
- 找到
php.ini
文件 (我自己的路徑:/usr/local/php/etc) - 查詢
disable_function
- 刪除
shell_exec,
- 保存
- 重啓PHP
-
重啓php 隨便一個 service php-fpm restart service nginx reload
5.2 測試服務器shell_exec函數是否開啓
在https://cms.xxxx.cn/webhook.php代碼中寫
// 先做一下測試
// 測試ls是否能用
$output = shell_exec('ls -lart');
echo "<pre>$output</pre>";
結果:
這個一定要勾上
5.3 測試拉碼雲代碼
5.3.1 錯誤:error: cannot open .git/FETCH_HEAD: Permission denied(無法打開。git/fetch_head:權限被拒絕)
一種情況是:權限的問題
二種情況是:在服務器放在放代碼那個文件夾中沒有初始化git沒有成功,找不到.git文件夾(相當在本地服務器上建立倉庫)
查看.git是否存在
進行到服務器放代碼那個文件夾(本例放到2020文件夾中,路徑:/default/cms.xxxx.cn/application/2020)
把初始化的倉庫.git文件夾用戶名和用戶組修改爲www www
修改:
方法一:如果你服務器是oneinstack配置的,使用官方說明:https://oneinstack.com/docs/lnmpstack-image-guide/
網站根目錄權限遵循:
文件644, 文件夾755 ,權限用戶和用戶組www
如出現文件權限問題時,請執行下面3條命令:
chown -R www.www /data/wwwroot/
find /data/wwwroot/ -type d -exec chmod 755 {} \;
find /data/wwwroot/ -type f -exec chmod 644 {} \;
結果:
方法二:環境自己配置
# 這裏以www用戶爲例
# 假設/wwwroot/web爲網站根目錄
sudo chown -R www:www /wwwroot/web
5.3.2 錯誤:Host key verification failed.
Host key verification failed.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
解決方法:如果遇到 Host Key Verification Failed,就執行:
sudo -u www ssh-keyscan -t rsa gitee.com >> /home/www/.ssh/known_hosts
sudo -u www ssh-keyscan -t rsa 120.55.226.24 >> /home/www/.ssh/known_hosts
六 成功
From gitee.com:fnxxxxx/cms
* branch HEAD -> FETCH_HEAD
done 2019-08-03 11:42:51
表明成功,已經從碼雲中拉到最新代碼到你自己服務器指定的位置上
七、實踐例子(前提是公鑰已經生成)
7.1 在服務上創建application文件夾 手動在服務器創建(裏邊不能上傳內容,保留空白)
7.2 給權限
chown -R www.www /data/wwwroot/
find /data/wwwroot/ -type d -exec chmod 755 {} \;
find /data/wwwroot/ -type f -exec chmod 644 {} \;
7.3 進入application文件夾(一定要先進入這個文件夾)
cd /data/wwwroot/default/cms.xxx.cn/application
7.4 創建.GIT本地倉庫(就是服務器上創建git庫) 同時初始化了庫,同時還更新了一次代碼
sudo -u www git clone [email protected]:xxx/cms.git /data/wwwroot/default/cms.xxxx.cn/application
格式:sudo -u www git clone 自己GIT網址 服務器倉庫文件夾地址(絕對地址)
7.5 切換本地分支(阿里服務器倉庫)
情況一(默認情況):如果你從碼雲master分支更新到阿里服務器master分支 就可以直接用了
情況二:如果你從碼雲develop分支更新到阿里服務器develop分支
git branch
git checkout -b develop
7.6 更新權限,避免新創建的文件和更新沒有修改權限
chown -R www.www /data/wwwroot/
find /data/wwwroot/ -type d -exec chmod 755 {} \;
find /data/wwwroot/ -type f -exec chmod 644 {} \;
7.7 如果創建不成功,只能刪除阿里服務器的.GIT庫再7.1開始再來一次
rm -rf .git
八、實踐例子二 全新阿里服務器(公鑰按前面的步驟生成)
8.1 在服務上創建application文件夾 手動在服務器創建(裏邊不能上傳內容,保留空白)
8.2 要初始化GIT,增加用戶名和郵箱
git init
git config user.name "xxx"
git config user.email "[email protected]"
特別出現錯誤
From gitee.com:xxxxx/cms
* branch xxxx -> FETCH_HEAD
*** Please tell me who you are.
Run
git config --global user.email "[email protected]"
git config --global user.name "Your Name"
to set your account's default identity.
Omit --global to set the identity only in this repository.
一定要要用上面代碼初始化GIT
8.3 切換阿里服務器的分支,要切換服務器分支與自己碼雲要同步一樣子分支名稱,
如果沒有創建,阿里服務器默認是master分支,也會默認同步碼雲master 分支
//查看分支
git branch
//創始400xxx並切換到400xxx分支
git checkout -b 400xxx
8.4 第一次拉代碼
sudo -u www git clone [email protected]:xxx/cms.git /data/wwwroot/default/www.xxx.com/application
教程參考:https://blog.csdn.net/haibo0668/article/details/102982414
參考:
https://blog.csdn.net/u012830303/article/details/82255431
https://blog.csdn.net/Qiang1370373713/article/details/87889009
https://blog.csdn.net/zmzwll1314/article/details/77678293