小白折騰伺服器(四):佇列 supervisor 與定時任務 crontab

aen233發表於2019-01-07

主要學習:《L06教程 電商進階》 8.6. 佇列與定時任務
雲伺服器:阿里雲 centos7

環境

之前用docker-compose搭了雲伺服器上的一套Lnmp環境,用deployer部署,基礎應用可以跑了,可是要折騰佇列的時候,試著想用deplyer配置Supervisor,發現delpoyer不能用在docker的容器中。
比如我之前的環境是nginx、php-fpm、mysql、redis在不同的容器中,而部署程式碼是部署在主機(用主機中的php),而程式碼執行都應該是在php-fpm那個容器中,執行 php artisan horizon:terminate 這句也應該是在容器中,然而deployer只能是ssh連到主機。。。連不到容器。。。藍後,就不會了。。。。
去github找,好像遇到同樣的問題也還掛著- -連結在此,How to deploy a project in laradock ?Make way for host-containers: Task-iterations and command-template functionality
要麼是放棄deployer、要麼是放棄docker、要麼是用k8s,我就一臺伺服器,也是初學,k8s我機器配置目測也跑不起來,於是就把nginx+php直接搭在雲伺服器上,mysql+redis依舊用docker。php是之前就在伺服器上,現在搭nginx。

nginx

yum install nginx
訪問伺服器外網ip(localhost),就能看到nginx歡迎頁了
然後配專案位置,刪掉原本的nginx.conf,複製一份nginx.conf.default的預設配置
將路徑指向我的iu專案

rm -rf nginx.conf
cp nginx.conf.default nginx.conf
vim nginx.conf

開啟nginx服務
systemctl start nginx
service php-fpm start
修改配置檔案後 service php-fpm reload
報錯了好幾回,最後發現是拷貝nginx配置檔案沒拷好,查埠如果是因為埠占用,就殺掉程式

// 檢視一下埠程式
# netstat -ntpl
# netstat -tunlp

引數解釋

  • -t (tcp) 僅顯示tcp相關選項
  •  -u (udp)僅顯示udp相關選項
  •  -n 拒絕顯示別名,能顯示數字的全部轉化為數字
  •  -l 僅列出在Listen(監聽)的服務狀態
  •  -p 顯示建立相關連結的程式名

php-fpm

這會兒還沒phpfpm模組
yum -y install php72w-fpm

開啟php-fpm服務
systemctl start nginx
service php-fpm start
到這裡瀏覽器訪問,才能看到專案歡迎頁。然後是 mysql 和 redis,配置的檔案連結地址都是之前用docker-compose時候配好的,這裡就不改了。adminer是線上資料庫管理頁面,我自已本地用SequelPro已經連線上了,就先不弄了。
(域名配置下可以正常訪問,就正常了那麼一秒,就要備案balabala.....嫌麻煩,算了吧
專案歡迎頁:http://120.27.8.8/welcome
phpinfo頁面:http://120.27.8.8/info
專案文件頁面:http://120.27.8.8/doc/index (文件是markdowm,只加了架子.....
專案日誌頁面:http://120.27.8.8/ (僅開發環境)

mysql

docker run -d -p 3306:3306 -v /root/aen233-dnmp/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
測試mysql:http://120.27.8.8/db
測試db頁面就是很簡單的讀取user表的第一條資料

redis

docker run -d -p 6379:6379 -v /root/aen233-dnmp/redis:/data redis:alpine
測試redis:http://120.27.8.8/redis
測試redis頁面就是很簡單的set和get
環境就這樣了

報錯與解決

1.mysql的問題,主要參考:付傑問答:大家有沒有用 mysql的json型別...

商品表本地測試都ok,到了雲伺服器上報SQLSTATE[HY000]: General error: 2036,搜了半天,將php_mysql擴充套件改成php_mysqlnd擴充套件,沒用。最後將伺服器上資料庫中商品表的json型別改成text型別,好了。

mysql的json型別是5.7的新特性,建議做程式開發不要用最高版本的配置去開發專案,最高版本並不代表就是最好的!或許是mysql5.7 新特性目前在linux下還不相容;

2.redis的問題,主要參考:筆記:解決redis連線錯誤:MISCONF Redis
某次部署完之後,horizon沒法啟動,查報錯是:

MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.

究其原因是因為強制把redis快照關閉了導致不能持久化的問題,在網上查了一些相關解決方案,通過stop-writes-on-bgsave-error值設定為no即可避免這種問題。

有兩種修改方法,一種是通過redis命令列修改,另一種是直接修改redis.conf配置檔案
命令列修改方式示例:
127.0.0.1:6379> config set stop-writes-on-bgsave-error no
修改redis.conf檔案:
vi開啟redis-server配置的redis.conf檔案,然後使用快捷匹配模式:/stop-writes-on-bgsave-error定位到stop-writes-on-bgsave-error字串所在位置,接著把後面的yes設定為no即可。

我用的命令列修改方式,
docker exec -it 0d redis-cli 0d是我的redis容器
127.0.0.1:6379> config set stop-writes-on-bgsave-error no

佇列

程式碼-新建話題時生成優化SEO的slug

把L教程幾本都翻過,好像第一次講佇列是《L02 實戰進階——6.8.SEO 友好的 URL》
建立相關表,topics、categories,然後照著6.9使用佇列,實現了一遍

horizon

composer require laravel/horizon
php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"
php artisan horizon

伺服器配置Supervisor

環境是centos7,與L6教程的ubuntu稍微有些不一致
主要參考:Centos7 中使用Supervisor守護程式
1.安裝supervisor
yum install Supervisor

2.啟動服務
supervisord -c /etc/supervisord.conf
3.編輯配置檔案
cd /etc/supervisord.d
在/etc/supervisord.d目錄下建立一個iu.ini檔案並編輯如下

[program:iu-horizon]
process_name=%(program_name)s
command=php /var/www/html/iu-deployer/current/artisan horizon
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/var/www/html/iu-deployer/current/storage/logs/worker.log
  • program:iu-horizon 代表這個配置的名稱是 iu-horizon;
  • process_name= 代表這個程式在 Supervisor 內部的命名;
  • command= 代表要執行的命令;
  • autostart=true 代表這個程式跟隨 Supervisor,只要 Supervisor 啟動了,就啟動這個程式;
  • autorestart=true 代表要求 Supervisor 監聽程式狀態,假如異常退出就再次啟動;
  • redirect_stderr=true 代表輸出錯誤資訊;
  • stdout_logfile= 代表將程式的輸出儲存到日誌檔案中。

還是偷懶,全部都是root使用者。
4.過載配置檔案
執行命令使用新的配置檔案執行supervisor服務
supervisorctl reload

調整deployer指令碼

本地deploy.php中新增程式碼

desc('Restart Horizon');
task('horizon:restart', function() {
    run('{{bin/php}} {{release_path}}/artisan horizon:terminate');
});

// 在 deploy:symlink 任務之後執行 horizon:restart 任務
after('deploy:symlink', 'horizon:restart');
  • {{bin/php}} 是 Deployer 內建的變數,是 PHP 程式的絕對路徑。
  • deploy:symlink 任務是將 current 連結到最新的程式碼目錄。

    日誌檢視

    開發環境horizon頁面:http://120.27.8.8/horizon/dashboard
    開發環境佇列日誌: http://120.27.8.8/?file=worker.log
    都可以看到佇列正常執行了
    佇列日誌
    在worker.log中也可以看到redis掛了,佇列也就掛了

報錯與解決

  1. deploy部署時報錯

    Problem 1
      - Installation request for laravel/horizon v2.0.0 -> satisfiable by laravel/horizon[v2.0.0].
      - laravel/horizon v2.0.0 requires ext-posix * -> the requested PHP extension posix is missing from your system.

    解決:yum -y install php72w-posix(伺服器)
    如果phppfm使用docker容器,dockerFile 加一句 RUN docker-php-ext-install posix

  2. Laravel Horizon啟動時報錯 undefined function Laravel\Horizon\Console\pcntl_asyn_signals
    解決:使用horizon需要pcntl擴充套件,安裝一下就好了

定時任務

程式碼-眾籌結束邏輯

把L教程幾本都翻過,好像第一次講定時任務是《L06 電商進階——4.8. 眾籌結束邏輯》
建立相關表,shop_crowdfunding_products,修改相關表shop_products,
商品的相關表是之前《L05 Laravel 教程 - 電商實戰 ( Laravel 5.5 ) 》5.1. 商品的資料結構設計 時自己也做了一遍,(我看課程是挑著看,看了就實踐,不用課程環境,學習分析問題的思考模式、解決問題的方法與小技巧),當時是多維度 SKU 應該有所討論?這篇很感興趣,也是這篇去試著用mysql json的思維。
我現在的程式碼只有最簡單的時間到了根據金額修改狀態(成功/失敗),還沒有失敗後退款的邏輯,就最簡單的定時任務咯

伺服器配置定時任務crontab

主要參考: CentOS Crontab(定時任務)
1.安裝crontab:
yum install crontabs
說明:
啟動服務:service crond start
關閉服務:service crond stop
重啟服務:service crond restart
重新載入配置:service crond reload
檢視crontab服務狀態:service crond status
加入開機自動啟動:chkconfig crond on
2.編輯命令

   1)、在命令列輸入: crontab -e 然後新增相應的任務,wq存檔退出

   2)、直接編輯/etc/crontab 檔案,即vi /etc/crontab,新增相應的任務

編輯內容為:


* * * * * php /var/www/html/iu-deployer/current/artisan schedule:run >> /var/www/html/iu-deployer/current/storage/logs/cron.log 2>&1
  • 前面的 5 個 * 代表這個定時任務每分鐘執行一次,
  • 後面的則是這個定時任務要執行的命令,
  • 同時我們使用 Linux 的管道 >> 將定時任務的輸出追加到 cron.log 檔案末尾,
  • 2 > &1 代表將錯誤輸出也重定向到普通輸出,即也輸出到 cron.log 檔案。

3.檢視命令: crontab -l

日誌檢視

開發環境定時任務日誌:http://120.27.8.8/?file=cron.log
定時任務日誌


更新一波圖片~~~

相關文章