WSL宿主机可直接访问WSL服务,但是客户端访问WSL服务需要进行相应的配置。
静态网页服务,可通过设置端口转发规则,实现客户端访问WSL服务。
动态网页服务,最好通过代理服务器,实现客户端访问WSL服务。
前提条件:
1、windows10系统安装好WSL,并设置好用户信息
2、准备并启动WSL服务
(1)在WSL的某个文件夹下,创建index.html文件,文件内容如下:
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<h1>点个赞再走</h1>
<p>这么好的文章还不点赞</p>
<h2>一键三连关注一下</h2>
<p>不点赞不许白嫖</p>
</body>
</html>
(2)在WSL中输入以下命令,查看WSL的IP
ip addr | grep eth0
(3)在WSL中输入以下命令,来启动index.html服务(如果python不行,可以试试python3)
python -m http.server 8080
WSL宿主机访问WSL服务
在WSL宿主机的浏览器输入172.19.83.223:8080(WSL的IP:WSL服务的端口),看到下图所示内容,即实现了宿主机访问WSL的服务
此时WSL中的反馈如下图:
客户端访问WSL服务
方法1、设置端口转发规则
1、添加防火墙的入站规则(防火墙关闭的情况下可忽略)
【Windows设置】-【更新和安全】-【Windows安全中心】
【打开Windows安全中心】-【防火墙和网络保护】
【高级设置】-【入站规则】
点击右边的【新建规则】,选择【端口】,然后点击【下一页】
规则选择【TCP】,端口选择【特定本地端口】,并输入对外的空闲端口(这里输入80端口),然后点击【下一页】
允许连接,继续点击【下一页】
规则全选,可自行选择,继续点击【下一页】
输入名称、描述后,点击【完成】。然后可以在入站规则中找到新建的规则
2、在WSL宿主机(服务器端)设置端口转发规则(端口不能被占用)
(1)用管理员身份在命令提示符中输入添加端口转换规则的命令:
添加端口转换规则:
netsh interface portproxy add v4tov4 listenport=80 listenaddress=0.0.0.0 connectport=8080 connectaddress=172.19.83.223
删除端口转换规则:
netsh interface portproxy delete v4tov4 listenport=80 listenaddress=0.0.0.0
查看端口转换规则:
netsh interface portproxy show all
备注:
listenport:监控的Windows端口
connectport:WSL服务的端口
connectaddress:WSL的IP
(2)输入查看端口转发规则的命令,查看端口转发规则是否设置成功
3、在客户端输入172.21.59.55:80(服务器的IP:服务器的端口),看到下图所示内容,即实现了客户端访问服务器WSL的服务
备注:在服务器端设置了端口转发规则后,服务器的浏览器访问,也可输入172.21.59.55:80(服务器的IP:服务器的端口)访问WSL的服务,如下图
方法2、配置nginx代理服务器
Nginx相关地址:
源码:https://trac.nginx.org/nginx/browser
官网:http://www.nginx.org/
Nginx的基本命令:
nginx -t 检查配置文件是否有语法错误
nginx -s reload 热加载,重新加载配置文件
nginx -s stop 快速关闭
nginx -s quit 等待工作进程处理完成后关闭
配置nginx代理服务器:
1、通过官网进去,点击右侧的【download】,进入下载页,选择版本进行下载
2、将下载好的nginx压缩包,解压到某个目录下
3、按路径找到nginx.conf文件:解压文件夹/nginx-1.27.2/conf/nginx.conf
4、配置nginx.conf文件(nginx配置详情见后面)
主要配置server块的server全局块和location块内容
## 配置反向代理的参数
server {
listen 80; # 监听服务器端口
server_name xx_domain
# 对 "/ierp/" 启用反向代理
location ^~ /ierp/{
proxy_buffering off;
proxy_pass http://172.19.83.223:8080/ierp/; # 路由转发URL
proxy_set_header Host $host:8080; # 传递域名
proxy_set_header X-Real-IP $remote_addr; # 传递ip
proxy_set_header X-Scheme $scheme; # 传递协议
# 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 5M; # 允许客户端请求的最大单文件字节数
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
5、管理员身份启动nginx.exe
6、启动WSL服务
7、客户端浏览器输入172.21.59.55:80,即可访问WSL服务
nginx配置详解
nginx配置文件组成 | |||
全局块 | 主要设置影响nginx服务器整体运行的配置指令。 通常包括: ①配置运行Nginx服务器的用户(组) ②允许生成的worker process数 ③Nginx进程PID存放路径 ④日志的存放路径和类型 ⑤配置文件引入等 | ||
events块 | 涉及的指令主要影响Nginx服务器与用户的网络连接。 常用到的设置: ①是否开启对多worker process下的网络连接进行序列化 ②是否允许同时接收多个网络连接 ③选取哪种事件驱动模型处理连接请求 ④每个worker process可以同时支持的最大连接数等 这一部分的指令对Nginx服务器的性能影响较大,在实际配置中应该根据实际情况灵活调整。 | ||
http块 | http全局块 | 配置的指令包括: 文件引入、MIME-Type定义、日志自定义、是否使用sendfile传输文件、连接超时时间、单连接请求数上限等。 | |
多个sever块 | server全局块 | 最常见的两个配置项是 本虚拟主机的监听配置和本虚拟主机的名称或IP配置 | |
多个location块 |
nginx.conf文件内容:
# 全局块
#user nobody; # 将user指令注释掉,或配置成nobody,代表所有用户都可以运行
worker_processes 1; # 工作进程的数量
#error_log logs/error.log; # 指定错误日志的路径
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid; # 指定pid文件的路径
# events块
events {
worker_connections 1024; # 每个工作进程的最大连接数
}
# http块
http {
# http全局块
include mime.types; # include指令,用于包含其他的配置文件
default_type application/octet-stream;# 配置默认类型
# 日志格式
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main; # 日志输出目录
sendfile on; # 开启sendfile方式传输文件
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65; # 链接超时时间,自动断开
#gzip on;
# server块 —— 虚拟主机
server {
# server全局块
listen 80; # 监听来自所有IP,请求80端口的请求
server_name localhost; # 浏览器访问域名
#charset koi8-r;
#access_log logs/host.access.log main;
# location块 —— 路由
location / {
root html; # 访问根目录
index index.html index.htm; # 入口文件
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
# location块 —— 路由
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ { #
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
全局块
# 指定可以运行nginx服务的用户和用户组,只能在全局块配置
# user [user] [group]
# 将user指令注释掉,或者配置成nobody的话所有用户都可以运行
# user nobody nobody;
# user指令在Windows上不生效,如果你制定具体用户和用户组会报小面警告
# nginx: [warn] "user" is not supported, ignored in D:\software\nginx-1.18.0/conf/nginx.conf:2
# 指定工作线程数,可以制定具体的进程数,也可使用自动模式,这个指令只能在全局块配置
# worker_processes number | auto;
# 列子:指定4个工作线程,这种情况下会生成一个master进程和4个worker进程
# worker_processes 4;
# 指定pid文件存放的路径,这个指令只能在全局块配置
# pid logs/nginx.pid;
# 指定错误日志的路径和日志级别,此指令可以在全局块、http块、server块以及location块中配置。
# 其中debug级别的日志需要编译时使用--with-debug开启debug开关
# error_log [path] [debug | info | notice | warn | error | crit | alert | emerg]
# error_log logs/error.log notice;
# error_log logs/error.log info;
events块
# 当某一时刻只有一个网络连接到来时,多个睡眠进程会被同时叫醒,但只有一个进程可获得连接。如果每次唤醒的进程数目太多,会影响一部分系统性能。在Nginx服务器的多进程下,就有可能出现这样的问题。
# 开启的时候,将会对多个Nginx进程接收连接进行序列化,防止多个进程对连接的争抢
# 默认是开启状态,只能在events块中进行配置
# accept_mutex on | off;
# 如果multi_accept被禁止了,nginx一个工作进程只能同时接受一个新的连接。否则,一个工作进程可以同时接受所有的新连接。
# 如果nginx使用kqueue连接方法,那么这条指令会被忽略,因为这个方法会报告在等待被接受的新连接的数量。
# 默认是off状态,只能在event块配置
# multi_accept on | off;
# 指定使用哪种网络IO模型,method可选择的内容有:select、poll、kqueue、epoll、rtsig、/dev/poll以及eventport,一般操作系统不是支持上面所有模型的。
# 只能在events块中进行配置
# use method
# use epoll
# 设置允许每一个worker process同时开启的最大连接数,当每个工作进程接受的连接数超过这个值时将不再接收连接
# 当所有的工作进程都接收满时,连接进入logback,logback满后连接被拒绝
# 只能在events块中进行配置
# 注意:这个值不能超过超过系统支持打开的最大文件数,也不能超过单个进程支持打开的最大文件数,具体可以参考这篇文章:https://cloud.tencent.com/developer/article/1114773
# worker_connections 1024;
http块
# 常用的浏览器中,可以显示的内容有HTML、XML、GIF及Flash等种类繁多的文本、媒体等资源,浏览器为区分这些资源,需要使用MIME Type。换言之,MIME Type是网络资源的媒体类型。Nginx服务器作为Web服务器,必须能够识别前端请求的资源类型。
# include指令,用于包含其他的配置文件,可以放在配置文件的任何地方,但是要注意你包含进来的配置文件一定符合配置规范,比如说你include进来的配置是worker_processes指令的配置,而你将这个指令包含到了http块中,着肯定是不行的,上面已经介绍过worker_processes指令只能在全局块中。
# 下面的指令将mime.types包含进来,mime.types和ngin.cfg同级目录,不同级的话需要指定具体路径
# include mime.types;
# 配置默认类型,如果不加此指令,默认值为text/plain。
# 此指令还可以在http块、server块或者location块中进行配置。
# default_type application/octet-stream;
# access_log配置,此指令可以在http块、server块或者location块中进行设置
# 在全局块中,我们介绍过errer_log指令,其用于配置Nginx进程运行时的日志存放和级别,此处所指的日志与常规的不同,它是指记录Nginx服务器提供服务过程应答前端请求的日志
# access_log path [format [buffer=size]]
# 如果你要关闭access_log,你可以使用下面的命令
# access_log off;
# log_format指令,用于定义日志格式,此指令只能在http块中进行配置
# log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
# 定义了上面的日志格式后,可以以下面的形式使用日志
# access_log logs/access.log main;
# 开启关闭sendfile方式传输文件,可以在http块、server块或者location块中进行配置
# sendfile on | off;
# 设置sendfile最大数据量,此指令可以在http块、server块或location块中配置
# sendfile_max_chunk size;
# 其中,size值如果大于0,Nginx进程的每个worker process每次调用sendfile()传输的数据量最大不能超过这个值(这里是128k,所以每次不能超过128k);如果设置为0,则无限制。默认值为0。
# sendfile_max_chunk 128k;
# 配置连接超时时间,此指令可以在http块、server块或location块中配置。
# 与用户建立会话连接后,Nginx服务器可以保持这些连接打开一段时间
# timeout,服务器端对连接的保持时间。默认值为75s;header_timeout,可选项,在应答报文头部的Keep-Alive域设置超时时间:“Keep-Alive:timeout= header_timeout”。报文中的这个指令可以被Mozilla或者Konqueror识别。
# keepalive_timeout timeout [header_timeout]
# 下面配置的含义是,在服务器端保持连接的时间设置为120 s,发给用户端的应答报文头部中Keep-Alive域的超时时间设置为100 s。
# keepalive_timeout 120s 100s
# 配置单连接请求数上限,此指令可以在http块、server块或location块中配置。
# Nginx服务器端和用户端建立会话连接后,用户端通过此连接发送请求。指令keepalive_requests用于限制用户通过某一连接向Nginx服务器发送请求的次数。默认是100
# keepalive_requests number;
server块
每一个http块都可以包含多个server块,而每个server块就相当于一台虚拟主机,它内部可有多台主机联合提供服务,一起对外提供在逻辑上关系密切的一组服务(或网站)。
1、listen指令
listen指令的配置非常灵活,可以单独制定ip,单独指定端口或者同时指定ip和端口。
listen 127.0.0.1:8000; #只监听来自127.0.0.1这个IP,请求8000端口的请求
listen 127.0.0.1; #只监听来自127.0.0.1这个IP,请求80端口的请求(不指定端口,默认80)
listen 8000; #监听来自所有IP,请求8000端口的请求
listen *:8000; #和上面效果一样
listen localhost:8000; #和第一种效果一致
2、server_name指令
用于配置虚拟主机的名称。每台虚拟主机可以有一个名称,也可以有多个名称,名称之间用空格隔开。每个名字就是一个域名,由两段或者三段组成,之间由点号“.”隔开。
server_name myserver.com www.myserver.com
此虚拟主机的名称设置为myserver.com或www. myserver.com。
3、location块
location块的主要作用是,基于Nginx服务器接收到的请求字符串(例如, server_name/uri-string),对除虚拟主机名称(也可以是IP别名)之外的字符串(“/uri-string”部分)进行匹配,对特定的请求进行处理。
location的语法结构为:
location [ = | ~ | ~* | ^~ ] uri { ... }
其中,uri变量是待匹配的请求字符串,可以是不含正则表达的字符串,如/myserver.php等;也可以是包含有正则表达的字符串,如 .php$(表示以.php结尾的URL)等。为方便后续叙述,此处约定,不含正则表达的uri称为“标准uri”,使用正则表达式的uri称为“正则uri”。
方括号里的部分,是可选项,用来改变请求字符串与 uri 的匹配方式。
在不添加方框内的内容时,Nginx服务器匹配location的搜索方法:
(1)用location块中的标准uri和请求字符串进行匹配,记录匹配度最高的location块。
(2)用location块中的正则uri和请求字符串匹配,当正则uri匹配成功,则结束搜索,并使用这个location块处理此请求;如果正则匹配全部失败,则使用记录的匹配度最高的标准uri的location块处理此请求。
了解了Nginx服务器匹配location的搜索方法后,就可以解释可选项中各个标识的含义了:
-
“=”,用于标准uri前,要求请求字符串与uri严格匹配。如果已经匹配成功,就停止继续向下搜索并立即处理此请求。
-
“^~”,用于标准uri前,要求Nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。
-
“~”,用于表示uri包含正则表达式,并且区分大小写。
-
“~
*
”,用于表示uri包含正则表达式,并且不区分大小写。注意如果uri包含正则表达式,就必须要使用“~”或者“~*”标识。
4、root指令
这个指令用于设置请求寻找资源的跟目录,此指令可以在http块、server块或者location块中配置。由于使用Nginx服务器多数情况下要配置多个location块对不同的请求分别做出处理,因此该指令通常在location块中进行设置。
root path
path变量中可以包含Nginx服务器预设的大多数变量,只有documentroot和documentroot和realpath_root不可以使用。
说明:本文摘抄于参考博客内容,对其中知识的应用和记录,详细知识参考原博客文章。
参考文献: