Laravel会随机尝试访问一个不存在的符号链接



首先,请允许我解释我的部署是如何工作的:

  1. 获取最新代码并放入临时目录
  2. 获取epoch格式的当前时间戳并存储在变量中
  3. 使用时间戳的名称创建一个新目录,并将最新代码移动到该目录中
  4. 创建指向vendorstorage目录的符号链接。同时为.env创建符号链接
  5. 进入时间戳目录,运行一些Composer和Laravel命令
  6. 将时间戳符号链接到名为current的目录,Nginx将访问该目录
  7. 设置正确的所有权和权限
  8. 重新启动PHP-FPM和Supervisor
  9. 删除旧版本

偶尔我会遇到这样的错误:

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似乎可以阻止错误的发生。

最新更新