Laravel 会随机尝试访问一个不存在的符号链接
Laravel would randomly try to access a non existent symlink
首先,请允许我解释一下我的部署是如何工作的:
- 获取最新代码并放入临时目录
- 获取纪元格式的当前时间戳并存储在变量中
- 使用时间戳名称创建一个新目录,并将最新代码移至该目录
- 创建指向
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 的评论。将 supervisorctl restart all
替换为 php artisan queue:restart
似乎可以阻止错误的发生。
首先,请允许我解释一下我的部署是如何工作的:
- 获取最新代码并放入临时目录
- 获取纪元格式的当前时间戳并存储在变量中
- 使用时间戳名称创建一个新目录,并将最新代码移至该目录
- 创建指向
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 的评论。将 supervisorctl restart all
替换为 php artisan queue:restart
似乎可以阻止错误的发生。