概述
我正尝试在家用计算机上运行Windows Subsystem for 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/apache 2/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。这似乎是工作,只要相同的IP地址显示为我的网络由https://whatismyipaddress.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和443Map到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。
我还按照https://www.nextofwindows.com/allow-server-running-inside-wsl-to-be-accessible-outside-windows-10-host的说明在Windows Defender防火墙中创建了一个入站规则,但我相信这些规则在WSL 2中被上面的说明所取代。这两种可能的解决方案都在Access a web server which is running on WSL (Windows Subsystem for Linux) from the local network上讨论过,但问题中的任何一个或任何其他建议都不适合我。
我不知道这个端口转发是否真的有必要,或者如何诊断它是否做了它应该做的事情。在任何情况下,我都在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/apache 2/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版本23 H2构建版本25967.1010的桌面。
- WSL版本2.0.3.0
- Ubuntu 22.04.03,内核版本5.15.123.1-microsoft-standard-WSL 2
- ApacheApache/2.4.52(Ubuntu)
我的问题是我如何诊断问题,因为这对我来说是一次学习经历,但当然也欢迎直接的解决方案。
1条答案
按热度按时间5jvtdoz21#
我最初的问题可能与在WSL中运行服务器有关。证据是,在专用的Linux机器上运行服务器时,我没有遇到任何问题。我放弃了原来的方法,转而采用这种新方法。