阻止其他应用程序绑定到端口 80 和 443

Boy*_*oyd 16 linux ubuntu nginx port apache-2.2

上周我接到了一个害怕的客户的电话,因为他认为他的网站被黑了。当我查看他的网站时,我看到了apache2默认页面。那天晚上,我的服务器 ( Ubuntu 16.04 LTS) 已升级并重新启动。通常,当出现问题时,我会在夜间收到警报。这次没有,因为监控系统检查的是HTTP状态码200,apache2默认页面自带状态码200。

发生的事情是在启动期间apache2绑定到端口 80 和 443 比我实际的网络服务器 nginx 更快。我自己没有安装apache2。通过aptitude why apache2我发现php7.0包需要它。

简单地删除是apache2行不通的,因为显然 php7.0 需要它。是否有可能创建一个限制,以便只允许 nginx 绑定到端口 80 和 443?

其他解决方案也非常受欢迎。

Ger*_*der 29

您无法阻止端口被错误的服务绑定。在您的情况下,只需从自动启动中删除 apache 就可以了。

对于 16.04 及更新版本:

sudo systemctl disable apache2
Run Code Online (Sandbox Code Playgroud)

对于较旧的 Ubuntu 版本:

sudo update-rc.d apache2 disable
Run Code Online (Sandbox Code Playgroud)

  • @Boyd:你为什么“不知不觉地”盲目安装软件包?为什么在客户使用的实时服务器上,您甚至没有阅读正在安装哪些软件包和依赖项?为什么在执行之前不在镜像服务器上测试所有内容?这些是_基本操作原则_,将解决您的所有问题。 (12认同)
  • @BoundaryImposition 想要防止软件绑定到端口并不意味着我只是盲目地安装软件包。但我们也是人,也会犯错误。不幸的是,我们无法先在虚拟服务器上测试每个操作,但在这种情况下,它不会立即显示问题,因为 apache2 是在问题出现前一周安装的(系统甚至在此期间重新启动,没有任何问题) )。虽然无法测试每一次升级,但我们仍然每周升级。我们更喜欢最新的安全补丁而不是有限的(通过监控)停机风险。 (6认同)
  • @Boyd:_“很遗憾,我们无法先在虚拟服务器上测试每个操作”_ 为什么不呢?您的客户是否知道您跳过了此过程? (3认同)
  • 我会这样做,但我希望我可以在未来的情况下保护自己,在这种情况下,绑定到端口 80 和 443 的另一个包作为另一个包的依赖项在不知不觉中安装在我的系统上。 (2认同)
  • 由于这是 16.04,还有:`systemctl disable apache2` (2认同)

mur*_*uru 27

如果您真的没有使用apache2,并且需要它的是 PHP 7.0,那么看起来您已经libapache2-mod-php7.0安装了。没有 Apache,该软件包将毫无用处。由于您使用的是 nginx,因此您可能还拥有php7.0-fpmphp7.0-cgi安装了nginx,其中任何一个都足以满足php7.0的依赖项要求:

$ apt-cache depends php7.0
php7.0
 |Depends: php7.0-fpm
 |Depends: libapache2-mod-php7.0
  Depends: php7.0-cgi
  Depends: php7.0-common
  Conflicts: <php5>
Run Code Online (Sandbox Code Playgroud)

如果您确实安装了其中任何一个php7.0-{fpm,cgi},则可以继续卸载 Apache。

  • 我今天确实了解到,在我的情况下,我最好只安装 `php7.0-fpm` 而不是 `php7.0` 包。Ondřej Surý 也建议这样做 https://github.com/oerdnj/deb.sury.org/wiki/PPA-migration-to-ppa:ondrej-php#why-does-installing-php71-also-install-libapache2 -mod-php71 (6认同)
  • 这是真正问题的真正解决方案:如何在不安装 Apache 的情况下在 Ubuntu 上安装 nginx 和 PHP。 (5认同)