如何避免超时并让 Apache2 在系统启动时启动?

如何避免超时并让 Apache2 在系统启动时启动?

我使用的是 Ubuntu 18.04,默认安装了 Apache,在其中配置了一个虚拟目录。我想将 Apache 作为服务运行,在系统重启时自动启动。我注意到系统重启时 Apache 没有运行,然后注意到这个

$ sudo /etc/init.d/apache2 start
[sudo] password for davea: 
[....] Starting apache2 (via systemctl): apache2.serviceJob for apache2.service failed because a timeout was exceeded.
See "systemctl status apache2.service" and "journalctl -xe" for details.
 failed!
davea

我不确定这意味着什么所以我尝试获取上面推荐的状态......

$ sudo systemctl status apache2.service
● apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
  Drop-In: /lib/systemd/system/apache2.service.d
           └─apache2-systemd.conf
   Active: failed (Result: timeout) since Mon 2021-01-18 19:00:16 UTC; 4min 33s ago
  Process: 800 ExecStart=/usr/sbin/apachectl start (code=killed, signal=TERM)

Jan 18 18:58:47 prod systemd[1]: Starting The Apache HTTP Server...
Jan 18 18:58:47 prod apachectl[800]: Invoking 'systemctl start apache2'.
Jan 18 18:58:47 prod apachectl[800]: Use 'systemctl status apache2' for more info.
Jan 18 19:00:16 prod systemd[1]: apache2.service: Start operation timed out. Terminating.
Jan 18 19:00:16 prod systemd[1]: apache2.service: Failed with result 'timeout'.
Jan 18 19:00:16 prod systemd[1]: Failed to start The Apache HTTP Server.

我仍然不清楚我还需要做什么。我能够使用以下命令重新启动 Apache,没有任何问题

$ sudo apachectl restart
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 2607:f298:5:101d:f816:3eff:feac:4c03. Set the 'ServerName' directive globally to suppress this message

不确定为什么会出现警告或者我是否应该担心它,但我在下面的配置文件中定义了“ServerName”

/etc/apache2/sites-available/000-default-le-ssl.conf

我还需要做什么才能让 Apache 在系统启动时作为服务运行?

编辑:回应评论,这是重新启动后立即的 configtest 和 journalctl 输出...

$ sudo apachectl configtest
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 2607:f298:5:101d:f816:3eff:feac:4c03. Set the 'ServerName' directive globally to suppress this message
Syntax OK

$ sudo journalctl -xe
-- 
-- Unit UNIT has finished starting up.
-- 
-- The start-up result is RESULT.
Jan 22 01:36:35 prod systemd[1]: Started User Manager for UID 1001.
-- Subject: Unit [email protected] has finished start-up
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
-- 
-- Unit [email protected] has finished starting up.
-- 
-- The start-up result is RESULT.
Jan 22 01:36:35 prod systemd[1028]: Reached target Default.
-- Subject: Unit UNIT has finished start-up
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
-- 
-- Unit UNIT has finished starting up.
-- 
-- The start-up result is RESULT.
Jan 22 01:36:35 prod systemd[1028]: Startup finished in 219ms.
-- Subject: User manager start-up is now complete
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
-- 
-- The user manager instance for user 1001 has been started. All services queued
-- for starting have been started. Note that other services might still be starting
-- up or be started at any later time.
-- 
-- Startup of the manager took 219137 microseconds.
Jan 22 01:36:55 prod systemd-timesyncd[565]: Synchronized to time server [2001:67c:1560:8003::c8]:123 (ntp.ubuntu.com).
Jan 22 01:37:03 prod sudo[1172]: davea : TTY=pts/0 ; PWD=/home/davea ; USER=root ; COMMAND=/bin/journalctl -xe
Jan 22 01:37:03 prod sudo[1172]: pam_unix(sudo:session): session opened for user root by davea(uid=0)

编辑2:尝试建议的答案后,/lib/systemd/system/apache2.service 的内容...

[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
EnvironmentFile=/etc/environment
ExecStart=/usr/sbin/apachectl start
ExecStop=/usr/sbin/apachectl stop
ExecReload=/usr/sbin/apachectl graceful
PrivateTmp=true
Restart=on-abort
TimeoutStartSec=300

[Install]
WantedBy=multi-user.target

重新启动仍然无法启动 Apache。但是,当我手动运行“sudo apachectl restart”时,Apache 就可以启动了。

答案1

Apache 服务通常有 90 秒的启动时间。如果在启动期间无法启动,systemd则会终止该进程并将其报告为超时。在大多数情况下,Apache 可以在不到一秒的时间内启动(并重新启动),但如果有另一个进程需要更多时间,它可能会卡在启动期间的依赖关系之后。我偶尔看到这种情况,当网络接口启动时间比平时长一点时,或者当系统正在等待 NTP 服务器的响应以同步内部时钟时。

减少此错误发生频率的最简单方法之一是将服务超时值从 增加到90稍高一些的值,例如180300

您可以按照以下方式进行操作:

  1. SSH 进入服务器

  2. /lib/systemd/system/apache2.service使用以下命令打开文件sudo

    sudo vi /lib/systemd/system/apache2.service
    

    笔记:如果您没有文件 /lib/systemd/system/apache2.service那么配置文件将位于 /lib/systemd/system/apache2.service.d/apache2-systemd.conf

  3. 在该[Service]部分中,添加此行(按I插入/编辑):

    TimeoutStartSec=300
    

    您可以随意将该值设置TimeoutStartSec为您觉得合适的值,但请将其保持在 90 以上。否则,启动时超时将继续。

    完成后,你应该看到类似这样的内容:

    [Service]
    Type=forking
    Environment=APACHE_STARTED_BY_SYSTEMD=true
    ExecStart=/usr/sbin/apachectl start
    ExecStop=/usr/sbin/apachectl stop
    ExecReload=/usr/sbin/apachectl graceful
    PrivateTmp=true
    Restart=on-abort
    TimeoutStartSec=300
    
  4. 保存文件(Esc,,,):WQ

此时,您可以重新启动服务器,看看 Apache 是否继续超时。请注意,这并不能解决问题的关键,即启动所需的时间延长,但它应该能让 Apache 在所有 init 进程完成后启动。

奖金修复

为了消除这些AH00558: apache2: Could not reliably determine the server's fully qualified domain name消息,您可以为系统设置默认值。这不会以任何方式影响 Web 服务器的性能:

  1. 通过 SSH 连接到服务器(如果尚未连接)

  2. /etc/apache2/apache2.conf使用以下命令打开文件sudo

    sudo vi /etc/apache2/apache2.conf
    
  3. 在文件的最底部,添加此行(按I插入/编辑):

    ServerName 127.0.0.1
    
  4. 保存文件(Esc,,,):WQ

  5. 测试 Apache 配置文件是否有错误:

    sudo apachectl configtest
    

    您应该看到:

    Syntax OK
    

现在,您可以重新启动 Apache,sudo service apache2 restart或者,如果您在更新值后执行此操作TimeoutStartSec,则可以重新启动服务器。

答案2

启用服务启动运行:

sudo systemctl enable <serviceName>

答案3

我们的姊妹网站上也提出了类似的问题Unix 和 Linux

在这个答案中,解决方案是改变文件/etc/systemd/system.conf和两行:

#DefaultTimeoutStartSec=90s
#DefaultTimeoutStopSec=90s

在我的计算机上是 90 秒,但在链接的答案上是 15 秒,太短了。如果你说 15 秒,那么将其更改为:

DefaultTimeoutStartSec=90s
DefaultTimeoutStopSec=90s

注意删除#该行,将其从注释变为命令。

还请注意,您的journalctl -xe似乎没有与 apache2 相关的错误?您可能需要按Page Up几次。或者,您可以尝试使用journalctl -b-0和 使用 Page Down

答案4

这个问题很简单,但又至关重要。

有一个执行环境变量你的缺失systemdapache2 单元文件又名“apache2 服务文件”,即。/lib/systemd/system/apache2.service

这个变量是$APACHE_STARTED_BY_SYSTEMD。必须设置它,它位于[Service]AKA 部分下systemd.exec或者执行环境配置

该变量可以像这样设置:

Environment=APACHE_STARTED_BY_SYSTEMD=true

此变量是 Apache 在以下情况下正确启动和运行所必需的:Apache 自 2.4.42 版及更高版本起与 systemd 集成。 它提供systemd具有处理和报告流程的/usr/sbin/apachectl能力apache2

相关内容