首先,请允许我解释我的部署是如何工作的:
- 获取最新代码并放入临时目录
- 获取epoch格式的当前时间戳并存储在变量中
- 使用时间戳的名称创建一个新目录,并将最新代码移动到该目录中
- 创建指向
vendor
和storage
目录的符号链接。同时为.env
创建符号链接 - 进入时间戳目录,运行一些Composer和Laravel命令
- 将时间戳符号链接到名为current的目录,Nginx将访问该目录
- 设置正确的所有权和权限
- 重新启动PHP-FPM和Supervisor
- 删除旧版本
偶尔我会遇到这样的错误:
The stream or file "/usr/share/nginx/html/sample_directory/releases/1617243734/storage/logs/laravel-2021-04-07.log" could not be opened in append mode: failed to open stream: Permission denied
其中1617243734
是不再存在的旧时间戳目录。
有人知道这个问题的原因吗?
以下是部署文件:
#!/bin/sh
########################################
# Get current timestamp in epoch format
########################################
timestamp=$(date +%s)
##############################################################################
# Create new directory based on timestamp and move code into timestamp folder
##############################################################################
mkdir /usr/share/nginx/html/sample_directory/releases/$timestamp
mv /usr/share/nginx/html/sample_directory/temp/* /usr/share/nginx/html/sample_directory/releases/$timestamp/
mv /usr/share/nginx/html/sample_directory/temp/.editorconfig /usr/share/nginx/html/sample_directory/releases/$timestamp/
mv /usr/share/nginx/html/sample_directory/temp/.git /usr/share/nginx/html/sample_directory/releases/$timestamp/
mv /usr/share/nginx/html/sample_directory/temp/.gitattributes /usr/share/nginx/html/sample_directory/releases/$timestamp/
mv /usr/share/nginx/html/sample_directory/temp/.idea /usr/share/nginx/html/sample_directory/releases/$timestamp/
mv /usr/share/nginx/html/sample_directory/temp/.styleci.yml /usr/share/nginx/html/sample_directory/releases/$timestamp/
mv /usr/share/nginx/html/sample_directory/temp/.gitignore /usr/share/nginx/html/sample_directory/releases/$timestamp/
#############################################################################
# Create symlinks to vendor & storage directories. Also symlink to .env file
#############################################################################
rm -rf /usr/share/nginx/html/sample_directory/releases/$timestamp/storage
ln -s /usr/share/nginx/html/sample_directory/shared/storage /usr/share/nginx/html/sample_directory/releases/$timestamp/
ln -s /usr/share/nginx/html/sample_directory/shared/vendor /usr/share/nginx/html/sample_directory/releases/$timestamp/
ln -s /usr/share/nginx/html/sample_directory/shared/.env /usr/share/nginx/html/sample_directory/releases/$timestamp/
#####################################
# Run composer install
#####################################
cd /usr/share/nginx/html/sample_directory/releases/$timestamp
composer install
##############################
# Run needed Laravel commands
##############################
php artisan migrate
php artisan config:cache
composer dump-autoload
php artisan config:cache
############################################
# Symlink current to the new release directory
############################################
rm -r /usr/share/nginx/html/sample_directory/current
ln -sv /usr/share/nginx/html/sample_directory/releases/$timestamp /usr/share/nginx/html/sample_directory/current
##################################
# Change permission and ownership
##################################
chown -R nginx:nginx /usr/share/nginx/html/sample_directory
find /usr/share/nginx/html/sample_directory -type d -exec chmod 775 {} ;
find /usr/share/nginx/html/sample_directory -type f -exec chmod 664 {} ;
##############
# Restart FPM
##############
systemctl restart php-fpm
####################
# Restart supervisor
####################
supervisorctl restart all
############################
# Keep only current release
############################
cd /usr/share/nginx/html/sample_directory/releases
ls -1t | tail -n +2 | xargs rm -rf
感谢@N69S的评论。用php artisan queue:restart
代替supervisorctl restart all
似乎可以阻止错误的发生。