概述
我正在尝试在我的家用计算机上运行 Windows Linux 子系统 (WSL) 的 Windows 11 计算机上设置 Apache Web 服务器。使用 WSL shell 中
ip a
为 eth0 返回的 IP 地址(例如 172.26.xx.xx),我可以从同一台计算机访问我的简单网页。但是,我无法从同一网络中的另一台计算机访问该页面。
详情
我的 ports.conf 文件位于
/etc/apache2
,除了一些注释之外,还包含以下内容:
Listen 80
<IfModule ssl_module>
Listen 443
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
</IfModule>
删除注释,我的 apache2.conf 文件位于
/etc/apache2
,包含
DefaultRuntimeDir ${APACHE_RUN_DIR}
PidFile ${APACHE_PID_FILE}
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
HostnameLookups Off
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
Include ports.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>
AccessFileName .htaccess
<FilesMatch "^\.ht">
Require all denied
</FilesMatch>
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
IncludeOptional conf-enabled/*.conf
IncludeOptional sites-enabled/*.conf
我的 000-default.conf 文件位于 /etc/apache2/sites-available,包含
<VirtualHost *:80>
ServerName www.example.com
ServerAlias example.com
ServerAdmin [email protected]
DocumentRoot /var/www/html
<Directory /var/www/html>
AllowOverride All
Options All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
值得一提的是,我确实有一个注册域名,我用它来代替上面的 example.com。 (因为我在没有静态 IP 地址的家庭路由器后面,所以我使用 ddclient 与我的提供商设置了动态 DNS。这似乎有效,因为我的网络通过 https://whatismyipaddress 显示了相同的 IP 地址.com/ 以及我的 DNS 注册商管理页面中自动填充的字段。但是,除非我完全误解了事情,否则这是无关紧要的,因为我无法从另一台计算机访问我的页面,即使是在同一网络内。)
我尝试过的老实说,不多。在我看来,Apache 服务器的配置非常简单,对于来自同一台计算机的连接,它会立即运行。我唯一能想到的是
端口转发问题。在 WSL shell 上运行
sudo ufw status verbose
返回
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443 ALLOW IN Anywhere
80,443/tcp (Apache Full) ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)
80/tcp (v6) ALLOW IN Anywhere (v6)
443 (v6) ALLOW IN Anywhere (v6)
80,443/tcp (Apache Full (v6)) ALLOW IN Anywhere (v6)
我觉得不错。按照here
的说明,我运行 netsh interface portproxy
将 Windows 计算机上的端口 80 和 443 映射到 WSL 上的端口 80 和 443。脚本中的关键命令是
netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr"
和
netsh interface portproxy add v4tov4 listenport=$port listenaddress=$addr connectport=$port connectaddress=$remoteport
其中
$remoteport
与
ip a
返回的 IP 地址 172.26.xx.xx 匹配,并且 $addr
保留为 0.0.0.0.我还在 Windows Defender 防火墙中创建了入站规则,按照 https://www.nextofwindows.com/allow-server-running-inside-wsl-to-be-accessible-outside-windows-10- 中的说明进行操作host,但我相信这些在 WSL2 中已被上面的说明取代。这两种潜在的解决方案都已在从本地网络访问在 WSL(Linux 的 Windows 子系统)上运行的 Web 服务器进行了讨论,但问题中的任何一个或任何其他建议都不适合我。
我不知道这个端口转发是否真的有必要,或者如何诊断它是否做了它应该做的事情。无论如何,我在 Windows 的特权 Powershell 会话中运行了netstat -aobn | findstr :80
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 5720
TCP 10.0.0.229:56431 10.0.0.249:8009 ESTABLISHED 11868
TCP 10.5.0.2:54444 192.229.211.108:80 CLOSE_WAIT 22772
TCP [::1]:80 [::]:0 LISTENING 9280
还有Get-NetTCPConnection | where localport -eq 80
,它返回了,为了紧凑而进行了编辑,
LocalAddress LocalPort RemoteAddress RemotePort State AppliedSetting OwningProcess
------------ --------- ------------- ---------- ----- -------------- -------------
::1 80 :: 0 Listen 9280
0.0.0.0 80 0.0.0.0 0 Listen 5720
有人在那里看到什么有趣的东西吗?调查日志。
在/var/logs/apache2/error.log中有很多组就像
[Sun Oct 15 18:37:05.433219 2023] [mpm_event:notice] [pid 19762:tid 139729704814464] AH00493: SIGUSR1 received. Doing graceful restart
[Sun Oct 15 18:37:05.441983 2023] [mpm_event:notice] [pid 19762:tid 139729704814464] AH00489: Apache/2.4.52 (Ubuntu) configured -- resuming normal operations
[Sun Oct 15 18:37:05.441995 2023] [core:notice] [pid 19762:tid 139729704814464] AH00094: Command line: '/usr/sbin/apache2'
没有别的,但这些与我在更改后按顺序运行
sudo a2dissite 000-default.conf
、sudo systemctl reload apache2
、
sudo a2ensite 000-default.conf
和
sudo systemctl reload apache2
的多次匹配。
以下是其他配置参数,在不太可能的情况下它很重要:
运行 11 版本 23H2 内部版本 25967.1010 的桌面。
我最初的问题可能与在 WSL 中运行服务器有关。证明这一点的证据是,在专用 Linux 机器上运行服务器时我没有遇到任何问题。我已经放弃了原来的方法并采用了这种新方法。