我正在运行 Trisquel 8(基于 Ubuntu)的桌面计算机上运行 Apache Web 服务器。我想让本地网络上的其他机器/设备可以访问服务器,但我不知道如何实现。
当我尝试使用 Apache 服务器的本地 IP 地址从另一台设备进行连接时,我在浏览器中收到错误消息,例如:在 Mac 上的 Firefox 中,我收到“无法连接”。 Firefox 无法建立与本地主机服务器的连接。'。如果我尝试在 Android 手机上使用 DuckDuckGo 浏览器进行连接,则会收到“网页不可用”的消息。网页位于http://本地主机/无法加载,因为:net::ERR_CONNECTION_REFUSED'。
nmap
建议使用查看哪些端口打开的答案之一,它返回以下结果:
$ nmap [LOCAL IP ADDRESS]
Starting Nmap 7.01 ( https://nmap.org ) at 2019-10-12 09:25 EDT
Nmap scan report for [LOCAL IP ADDRESS]
Host is up (0.00013s latency).
Not shown: 998 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 0.09 seconds
因此,它表明端口 80 对 http 开放。也许还值得一提的是,我可以从本地网络上的另一台机器 ping 通该机器,并且如 nmap 输出所示,我有另一个为 ssh 打开的端口。我已经通过 ssh 连接到这台机器几个月了,效果很好。为此,我刚刚安装了 ssh-server,它几乎开箱即用。
那么,考虑到 ssh 工作没有问题,这是否意味着 Apache2 设置(相对于 iptables/防火墙)有问题?
iptables的内容:
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:http ctstate NEW,ESTABLISHED
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
apache2.conf 的内容:
# This is the main Apache server configuration file. It contains the
# configuration directives that give the server its instructions.
# See http://httpd.apache.org/docs/2.4/ for detailed information about
# the directives and /usr/share/doc/apache2/README.Debian about Debian specific
# hints.
#
#
# Summary of how the Apache 2 configuration works in Debian:
# The Apache 2 web server configuration in Debian is quite different to
# upstream's suggested way to configure the web server. This is because Debian's
# default Apache2 installation attempts to make adding and removing modules,
# virtual hosts, and extra configuration directives as flexible as possible, in
# order to make automating the changes and administering the server as easy as
# possible.
# It is split into several files forming the configuration hierarchy outlined
# below, all located in the /etc/apache2/ directory:
#
# /etc/apache2/
# |-- apache2.conf
# | `-- ports.conf
# |-- mods-enabled
# | |-- *.load
# | `-- *.conf
# |-- conf-enabled
# | `-- *.conf
# `-- sites-enabled
# `-- *.conf
#
#
# * apache2.conf is the main configuration file (this file). It puts the pieces
# together by including all remaining configuration files when starting up the
# web server.
#
# * ports.conf is always included from the main configuration file. It is
# supposed to determine listening ports for incoming connections which can be
# customized anytime.
#
# * Configuration files in the mods-enabled/, conf-enabled/ and sites-enabled/
# directories contain particular configuration snippets which manage modules,
# global configuration fragments, or virtual host configurations,
# respectively.
#
# They are activated by symlinking available configuration files from their
# respective *-available/ counterparts. These should be managed by using our
# helpers a2enmod/a2dismod, a2ensite/a2dissite and a2enconf/a2disconf. See
# their respective man pages for detailed information.
#
# * The binary is called apache2. Due to the use of environment variables, in
# the default configuration, apache2 needs to be started/stopped with
# /etc/init.d/apache2 or apache2ctl. Calling /usr/bin/apache2 directly will not
# work with the default configuration.
# Global configuration
#
#
# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
#
# NOTE! If you intend to place this on an NFS (or otherwise network)
# mounted filesystem then please read the Mutex documentation (available
# at <URL:http://httpd.apache.org/docs/2.4/mod/core.html#mutex>);
# you will save yourself a lot of trouble.
#
# Do NOT add a slash at the end of the directory path.
#
#ServerRoot "/etc/apache2"
#
# The accept serialization lock file MUST BE STORED ON A LOCAL DISK.
#
Mutex file:${APACHE_LOCK_DIR} default
#
# PidFile: The file in which the server should record its process
# identification number when it starts.
# This needs to be set in /etc/apache2/envvars
#
PidFile ${APACHE_PID_FILE}
#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 300
#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On
#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100
#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 5
# These need to be set in /etc/apache2/envvars
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
#
# HostnameLookups: Log the names of clients or just their IP addresses
# e.g., www.apache.org (on) or 204.62.129.132 (off).
# The default is off because it'd be overall better for the net if people
# had to knowingly turn this feature on, since enabling it means that
# each client request will result in AT LEAST one lookup request to the
# nameserver.
#
HostnameLookups Off
# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here. If you *do* define an error logfile for a <VirtualHost>
# container, that host's errors will be logged there and not here.
#
ErrorLog ${APACHE_LOG_DIR}/error.log
#
# LogLevel: Control the severity of messages logged to the error_log.
# Available values: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the log level for particular modules, e.g.
# "LogLevel info ssl:warn"
#
LogLevel warn
# Include module configuration:
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
# Include list of ports to listen on
Include ports.conf
# Sets the default security model of the Apache2 HTTPD server. It does
# not allow access to the root filesystem outside of /usr/share and /var/www.
# The former is used by web applications packaged in Debian,
# the latter may be used for local directories served by the web server. If
# your system is serving content from a sub-directory in /srv you must allow
# access here, or in any related virtual host.
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
# Require local
# Require ip 192.168.1
Require all granted
</Directory>
#<Directory /srv/>
# Options Indexes FollowSymLinks
# AllowOverride None
# Require all granted
#</Directory>
# AccessFileName: The name of the file to look for in each directory
# for additional configuration directives. See also the AllowOverride
# directive.
#
AccessFileName .htaccess
#
# The following lines prevent .htaccess and .htpasswd files from being
# viewed by Web clients.
#
<FilesMatch "^\.ht">
Require all denied
</FilesMatch>
#
# The following directives define some format nicknames for use with
# a CustomLog directive.
#
# These deviate from the Common Log Format definitions in that they use %O
# (the actual bytes sent including headers) instead of %b (the size of the
# requested file), because the latter makes it impossible to detect partial
# requests.
#
# Note that the use of %{X-Forwarded-For}i instead of %h is not recommended.
# Use mod_remoteip instead.
#
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
# Include of directories ignores editors' and dpkg's backup files,
# see README.Debian for details.
# Include generic snippets of statements
IncludeOptional conf-enabled/*.conf
# Include the virtual host configurations:
IncludeOptional sites-enabled/*.conf
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
我需要AllowOverride All
下面的文件,/var/www
因为我正在尝试运行 Wordpress 的实例,并且它需要能够写入 Apache 服务器。
Apache2 肯定正在运行,因为我可以从本地计算机上的浏览器使用“localhost”访问 Web 内容。另外,systemctl status apache2
显示它正在运行:
~$ systemctl status apache2
● apache2.service - LSB: Apache2 web server
Loaded: loaded (/etc/init.d/apache2; bad; vendor preset: enabled)
Drop-In: /lib/systemd/system/apache2.service.d
└─apache2-systemd.conf
Active: active (running) since Thu 2019-10-10 20:01:44 EDT; 5min ago
Docs: man:systemd-sysv-generator(8)
Process: 1562 ExecStart=/etc/init.d/apache2 start (code=exited, status=0/SUCCESS)
CGroup: /system.slice/apache2.service
├─1621 /usr/sbin/apache2 -k start
├─1624 /usr/sbin/apache2 -k start
├─1625 /usr/sbin/apache2 -k start
├─1626 /usr/sbin/apache2 -k start
├─1627 /usr/sbin/apache2 -k start
├─1628 /usr/sbin/apache2 -k start
└─2102 /usr/sbin/apache2 -k start
Oct 10 20:01:42 lee-Desktop systemd[1]: Starting LSB: Apache2 web server...
Oct 10 20:01:42 lee-Desktop apache2[1562]: * Starting Apache httpd web server apache2
Oct 10 20:01:43 lee-Desktop apache2[1562]: AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Oct 10 20:01:44 lee-Desktop apache2[1562]: *
Oct 10 20:01:44 lee-Desktop systemd[1]: Started LSB: Apache2 web server.
正如评论中所建议的,我尝试过netstat --inet -a | grep apache2
,但没有返回任何结果。显然,如果 apache2 正在运行,这是不寻常的,因为它应该在端口 80 上侦听。我运行netstat -plunt | grep :80
并得到以下输出:
$ sudo netstat -plunt | grep :80
tcp6 0 0 :::80 :::* LISTEN 1557/apache2
这是否意味着 Apache 正在监听,但没有听到任何声音?
就同样请求的虚拟主机配置而言,唯一的文件/etc/apache2/sites-enabled/
是 000-default.conf,其内容是:
<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
我也尝试过运行tail -f /var/log/apache2/*.log
,但是当我尝试从远程计算机连接时,没有任何内容打印到日志中。
那么,如何排除阻止连接的原因呢?是否有任何地方的日志可以帮助我了解连接被拒绝的原因以及原因?
我尝试了雅各布在他的回答中提出的建议,但不幸的是它没有解决问题。任何其他建议或指导将不胜感激!
答案1
当我尝试从另一台设备连接时,使用本地IP地址Apache 服务器的
- 请发布在服务器上以 root 身份运行的
ip addr
(或) 命令的输出ifconfig
- 请指出具体是哪个本地IP地址您尝试从以下位置连接其他设备当时。
- 请注明每个设备的 LAN IP 地址其他设备您在连接时使用。
原因如下,另见后记有关路由器和服务器配置的其他遥不可及的可能性。
我确实在浏览器中输入了apache服务器的本地IP,但由于某种原因,在尝试连接并给出错误后,它显示
http://localhost/
在地址栏中。
这闻起来真的很腥,它说本地IP地址你用来连接的方法是非常非常错误的。
- 另一种解释:请求成功通过,但导致了无意义的 HTTP 重定向——请跳过阅读后记3号。
如果说本地IP地址有问题的是非常类似于127.0.0.1
或 的内容::1
,地址本身可能是问题的根本原因。因为这不是“真实”IP 地址...
IPv4 地址
127.0.0.1
或缩写 IPv6 地址::1
方法这个设备,并且主机名localhost
始终在本地定义为该地址的同义词。当您尝试从服务器本身以外的任何设备连接到此地址时,您正在指示它连接到端口 80本身(不是服务器机器的80端口)。
自从你的其他设备本身没有运行 HTTP 服务器,连接尝试肯定会以 TCP
RST
失败结束,即“连接被拒绝“您的浏览器出现错误。
补救措施:您必须使用正确的方法局域网IP地址从其他机器连接时:当然不是localhost
,不是127.0.0.1
,并且不是::1
......
ifconfig
以 root 身份运行命令在服务器上,并查找未命名的块lo
。IP 地址将是一个名为 的字段inet addr:
。- 如果服务器通过以下方式连接到本地网络金属丝,要使用的块将被命名,
eth
后跟数字,例如eth0
。 - 如果服务器连接到本地网络无线地,要使用的块将被命名,
wlan
后跟数字,例如wlan0
。 - 您使用的块必须还包含
RUNNING
状态(显示 LAN 连接已启用且可用)。 - 有问题的地址应该是这样的192.168.xx、10.xxx 或范围从 172.16.xx 到 172.31.xx。
- 如果服务器通过以下方式连接到本地网络金属丝,要使用的块将被命名,
尝试启动浏览器在服务器上,然后在地址栏中输入您在步骤 1 中找到的 IP 地址,然后按Enter。
- 如果您的网页显示正确,请继续执行下一步。
- 在另一个设备,确保它们连接到同一 LAN (不是蜂窝互联网)。
- 启动浏览器另一个设备,然后输入您在步骤 1 中找到的 IP 地址,按“Go”。
- 您的网页应该正确显示。
后记
如果您使用的 IP 地址正确,则可能还有其他不太明显的原因导致此问题,例如:
您的家庭路由器可能配置有“虚拟 LAN”或端口隔离— 这会将每个 LAN 端口和每个无线 LAN 设备隔离在自己的小网络中。每个设备都受到限制并且无法互相连接(并且只允许直接访问互联网)。
- 在此配置中,理论上可以在每个虚拟 LAN 中,每个设备都已分配同一个 IP 地址。因此,当您在另一台设备中输入“服务器的 IP 地址”时,结果“巧合”地与设备自己的 LAN IP 地址相同——指示它连接到本身它不运行 HTTP 服务器 — 导致“连接被拒绝“ 错误。
- 如果是这种情况,请禁用路由器上的端口隔离和虚拟 LAN 选项。
您的家庭路由器可能包含三层交换机功能并配置访问控制列表(即防火墙)以拒绝到任何专用 LAN IP 地址的任何“传入连接”,无论流量来源如何。
因此,当您的设备尝试连接到服务器时,路由器(或更确切地说,交换机)会拦截并使用 TCP 进行回复,
RST
从而导致“连接被拒绝“ 错误。- 如果是这种情况,请更改路由器的访问控制列表,使其仅适用于源自 Internet/PPPoE 的流量;或为本地 IP 地址范围提供适当的例外。
您的服务器上可能有某些东西会产生 HTTP 301/302 重定向到
http://localhost/
.这可以解释为什么你的其他设备localhost
即使您输入真实的 LAN IP 地址,也会显示在地址栏中。即,第一个请求顺利;但由于服务器或服务器端脚本上发生了一些错误配置/误解,客户端被重定向到
http://localhost/
,这是一个不正确的地址,原因已在答案的主要部分中列出......最终结果是“连接被拒绝“第二个请求中出现错误,并且
http://localhost/
位于地址栏中。不要用浏览器调试这个,因为 HTTP 301 重定向已被缓存。使用GNU
wget
或类似的工具来发出请求其他设备,并仔细查看其输出。如果您看到重定向状态出现在“连接被拒绝“错误——那么这不是网络问题,而是服务器问题。如果发生这种情况,您将需要找出导致服务器产生重定向的原因并修复它。
如果您从其他地方获得此 Web 根目录,它可能包含一个配置,当发现客户端使用非规范主机名访问它时,该配置会产生重定向。 (这很常见,就像当你去www.stackexchange.com,它会产生一个 HTTP 301 重定向到stackexchange.com)
如果您的 Web 应用程序认为其规范主机名是公正的
localhost
,那么它会无意中产生到 的有问题的重定向http://localhost/
。在这种情况下,请特别检查您
.htaccess
和应用程序的配置;然后禁用所述重定向。
答案2
首先,检查 httpd 是否正在运行sudo systemctl status httpd
。在我们不小心添加重复规则之前,让我们检查一下 iptables 规则:iptables -L
为了确保我们接受所有传入的 http,让我们在表中添加一个 ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
如果这不能解决问题,请务必检查 中找到的 apache 设置/etc/apache2/apache2.conf
。我们应该在conf文件的底部有一个基本的安全模型。例如,这是在我的中找到的
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
在 ports.conf 中,确保我们正在所有设备上侦听端口 80(目前直到我们完成设置为止)Listen *:80
如果这些都没有引起问题,请检查 apache2 是否也在运行
答案3
当我尝试使用 Apache 服务器的本地 IP 地址从另一台设备进行连接时,我在浏览器中收到错误消息,例如:在 Mac 上的 Firefox 中,我收到“无法连接”。 Firefox 无法与服务器建立连接本地主机.'.如果我尝试在 Android 手机上使用 DuckDuckGo 浏览器进行连接,则会收到“网页不可用”的消息。网页位于http://本地主机/ 无法加载,因为:net::ERR_CONNECTION_REFUSED'。
如果你使用本地主机作为其他计算机的主机名,它们尝试连接到自己...在其他计算机上,您必须使用服务器的实际地址。所以
- 在您的服务器上执行以下操作:
ip address show
这将列出您的所有网络接口和地址(inet
如下所示的行inet 192.168.0.44/24 brd 192.168.0.255 scope global dynamic enp0s31f6
:)。忽略该lo
接口(即地址 127.0.0.1 处的接口),并使用enp*
或wlp*
。这些地址可能以以下开头192.168...
inet
使用Mac/或 Android 上的线路中的地址:http://192.168.0.44/
直接使用地址有两个不方便的地方:
- 它可能会改变(尽管通常,只要地址比计算机多,计算机就会被重新分配相同的地址)
- 这并不是真正的助记符。
在 Mac 上,您可以通过在文件中添加服务器名称和地址/etc/hosts
(或 OSX 上的任何等效项)来解决问题#2。这在 Android 上可能不可行。
对于#1,如果您非常幸运,您的所有设备都支持 NETBIOS 名称解析,并且您可以使用它们的 NETBIOS 名称(通常是它们的主机名)。
答案4
我曾经遇到过同样的问题,我认为您正在使用虚拟机设置本地网络服务器。如果您正在这样做,请检查您的网络服务器的防火墙配置。
如果您能够从同一台计算机访问 Apache 服务器,并且在从远程计算机访问该服务器时出现错误,那么请允许 apache 在防火墙中在网络服务器中。
运行下面提到的命令(它在 CentOS-7 上有效)
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload
让我们知道您是否仍然面临同样的问题。