我使用的是 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
稍高一些的值,例如180
或300
。
您可以按照以下方式进行操作:
SSH 进入服务器
/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
。在该
[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
保存文件(Esc,,,):WQ
此时,您可以重新启动服务器,看看 Apache 是否继续超时。请注意,这并不能解决问题的关键,即启动所需的时间延长,但它应该能让 Apache 在所有 init 进程完成后启动。
奖金修复
为了消除这些AH00558: apache2: Could not reliably determine the server's fully qualified domain name
消息,您可以为系统设置默认值。这不会以任何方式影响 Web 服务器的性能:
通过 SSH 连接到服务器(如果尚未连接)
/etc/apache2/apache2.conf
使用以下命令打开文件sudo
:sudo vi /etc/apache2/apache2.conf
在文件的最底部,添加此行(按I插入/编辑):
ServerName 127.0.0.1
保存文件(Esc,,,):WQ
测试 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
。