基本上我已经按照此链接中的步骤操作:https://docs.gitlab.com/ee/ci/examples/laravel_with_gitlab_and_envoy/
我使用 apache 服务器而不是 NGINX,这是唯一的区别。
因此,有一个特使文件将执行以下操作:
envoy 文件的代码与:https://docs.gitlab.com/ee/ci/examples/laravel_with_gitlab_and_envoy/#full-script 除了 git url 更改和根目录更改之外。
所以设置是这样的:example.com(虚拟网址)指向我的应用程序目录,即 /var/www/html/deployer-home/current/public
这里
current
是一个符号链接,它将指向/var/www/html/deployer-home/releases/1
,如果我上传新版本,符号链接将更改为/var/www/html/deployer-home/releases/2
如果我愿意,在服务器中
ls -l
然后符号链接显示/var/www/html/deployer-home/releases/2
,但example.com仍然指向/var/www/html/deployer-home/releases/1
我已经尝试过
service apache2 restart
,但它的域名指向仍然没有更新。仅当我在服务器中执行reboot
时,它才会更新。
那么如何解决这个问题呢?我不想每次发布都重新启动服务器。
我假设您正在使用 FPM 运行 PHP。尝试使用以下命令重新启动 FPM 服务:
service php7.4-fpm restart
(如果需要,请更新正确的版本)
为什么?
曾经,PHP 作为 Apache 模块 (mod-php) 运行,但现在它在单独的服务中运行。如果您想要应用一些 PHP 配置更改,或者希望您的 PHP 进程使用新的文件系统信息启动,那么重新启动 Apache 是不够的(甚至不是必需的)。
您可以正常重启 Apache v1.x 或 v2.x httpd 守护进程
您需要向 Apache 服务器发送 USR1 信号:
此(USR1)信号使父进程建议子进程 在当前请求后退出(或者如果他们 不提供任何东西)。父进程重新读取其配置文件并 重新打开其日志文件。当每个孩子死去时,父母就会取代它 带有新一代配置的孩子,其中 立即开始处理新请求。
您可以按如下方式运行配置文件语法测试:
apachectl configtest
apachectl -t
以 root 用户身份键入以下命令:
apachectl -k graceful
或
apache2ctl -k graceful
使用 Systemd 时无需重新启动 Apache 即可重新加载 HTTPD 配置文件:
# CentOS/RHEL/Fedora Linux
sudo systemctl reload httpd
# Debian/Ubuntu Linux
sudo systemctl reload apache2
您是否尝试过在使用取消链接创建第二个符号链接之前删除第一个符号链接?
unlink /var/www/html/deployer-home/releases/1
您可以创建 .htacess 文件
<IfModule mod_rewrite.c>
RewriteEngine On
Options +FollowSymLinks
Options SymLinksIfOwnerMatch
</IfModule>
我真的认为这种使用符号链接的做法很糟糕。原因是,当您更改符号链接时,很可能存在超出开始但尚未完成的请求。这些请求的工作方式会根据发生的情况而变化,但通常它们会出现某种损坏
更好的方法是简单地更新您的网络服务器配置以指向新的文档根目录,然后优雅地重新加载/重新启动网络服务器。这将允许当前运行的任何请求正常完成,并且任何新请求都将从新文档根提供服务。这实际上是鱼与熊掌兼得——让两个文档根都有效。在很短的时间内,所有请求都将从新文档根中得到满足,并且您不太可能遇到任何奇怪的错误。
符号链接很棒,我经常使用它们,但是使用它们来切换 Webroot 而不仅仅是更新 Web 服务器配置并不是一个好的用例。
注意 - 我倾向于进行网络服务器配置的方式是有一个非常小的包含文件,仅包含一行。该文件可以通过脚本/自动化轻松操作,然后重新加载网络服务器配置。