All in one(七)Nginx反向代理基础设置
上一篇我们解决了公网访问到我们预设的作为内网入口的lxc容器的问题,这一篇我们开始解决如果在这个容器上部署Nginx实现以他为转发接入口访问局域网内的其他服务。
Nginx是一个高性能的HTTP和反向代理服务器,由俄罗斯程序员Igor Sysoev在2002年开发。我们主要要用到的就是三个功能,http反向代理、SSL加密以及部分服务需要的TCP/UDP反向代理。
我们使用Nginx要实现的基本功能就是我们访问Nginx这台容器的某个端口,然后他转发到相应局域网内另一台设备的某个端口上的服务,后续也通过这种途径返回数据。其中在http块下还可以根据不同的域名在相同的端口转发到不同的服务上,以及通过upstream之类的命令实现一个端口对多个设备的相同后台服务实现均衡负载之类的功能,以下只是一个示意,并不是说严格要求一一对应。
图片一、安装Nginx
在我们上一篇部署的Ubantu22.04上使用apt安装的Nginx版本是1.18.0,现在最新的版本应该是1.26.1,但是官网下载需要我们自己编译并选择要安装的组件,个人觉得比较麻烦而且因为不是公开网站所以就将就直接用1.18.0就好了。需要注意的是Nginx自己编译的和apt安装的配置文件目录不太一样,自己编译的我记得配置文件是在/usr/local/nginx/conf这个目录下。然后添加开机自动启动需要自己去新建服务配置文件,个人觉得太麻烦了所以就直接apt安装。由于我们要用到HTTPS模块和stream模块,懒得一个个去选,直接安装full版本。
apt install nginx-full
安装完成之后我们确认一下安装是否成功,可以在shell中使用nginx -v查看nginx版本。然后使用systemctl命令启动和开机自动运行Nginx服务
systemctl start nginx
systemctl enable nginx
启动服务之后我们可以网页直接访问这台lxc容器的局域网IP看是否出现Nginx的标志,局域网的80端口还是没有问题的,但你用公网IP在外面访问多半就看不见了。
图片二、配置Nginx
这里成功之后接下来就是配置nginx.conf文件了,nginx的配置文件有几个块组成,每个块都是大括号括起来的,块里面又有下一级的块,大概来说可能会是这么一个结构,不一定每个地方都要用上。
图片我们大概需要写的就是http块里面的server块以及stream块了。
我们用apt安装的配置文件默认是在/etc/nginx这个目录内的,使用WinSCP打开这个目录,然后双击打开nginx.conf文件。我们可以看到默认的里面已经写好了http块的大部分内容,没啥必要去修改,如果有要改的必要可以把相关内容去问AI并要他解释被注释掉的部分是什么意思就行。当然从配置文件的规范性上来看我们应该去默认配置文件第60行和第61行中提及的两个路径去写我们的server块,但是本来就没几个服务,没这个必要不是。
下面是server块的一个一般结构,端口号可以从1-65535当中来选,但是80和443我们家宽的公网是被默认关闭了的,其他的可能8080之类的也被关了,另外我们的ssh服务也是占用了一个端口,不过还是有很多可以选的,而且作为公网上开放的端口越生僻越好,不容易被扫。#所在的注释行都可以删了,只是告诉你下面的几行是什么意思。我们还是建议在公网上使用ssl加密,一方面为了你通信的安全,另一方面万一dns被劫持了也能发现不是。这里没有再次声明ssl协议版本是因为在http块当中已经进行了声明,如果说你是自己编译安装的Nginx的话可以看看http块中是否有相应的声明。以下这个用作示例的server块的意思就是当公网以HTTPS协议使用域名www.example.com:33456访问你的Nginx主机的33456端口时,实际上后台进行交互的服务是192.168.1.101:8096上的服务。如果有更多的服务,就复制整个server块然后按需求修改就行。
server{
#监听33456端口并启用ssl,如果不要ssl就不加ssl,上面是IPv4,下面方括号的是IPv6
listen 33456 ssl;
listen [::]:33456 ssl;
#server_name就是你的域名,自行修改
server_name www.example.site;
#两个ssl文件的存放路径,就是我们上一篇申请ssl证书之后下载的crt文件和key文件,注意文件名
ssl_certificate /etc/ssl/example.site.crt;
ssl_certificate_key /etc/ssl/example.site.key;
#以下是location块,除了wordpress这种建站工具的访问需要php动态或者伪动态处理之外,其他的我们一律就静态就OK
location / {
#下面j就是你局域网服务的访问地址和端口号
proxy_pass http://192.168.1.101:8096;
#client_max_body_size 3000m;#如果说有的服务需要单次传输大文件,就把这行注释取消了
}
# 部分要用到websocket才能正常登录的服务,比如HomeAssitant需要加入websocket单独的代理
# location /api/websocket {
# proxy_pass http://192.168.1.101:8096/api/websocket;
# proxy_set_header Host $host;
# proxy_set_header Upgrade $http_upgrade;
# proxy_set_header Connection "upgrade";
# }
}
如果说你的服务本身没有密码保护,那么可以用htpasswd命令来创建一个密码文件,然后访问的时候先要求验证身份,htpasswd需要先安装apache2-utils,命令如下:
-c是用于创建这个密码文件,如果说你已经创建了这个密码文件后续要添加用户就不用再写-c。-b是在命令行直接输入密码不用等后面提示再输,可选。我们还是把密码文件放在Nginx配置目录,并且设置为隐藏文件。
apt install apache2-utils
htpasswd -cb /etc/nginx/.htpasswd 你的用户名 你的密码
然后我们需要将上面Nginx配置文件中的location块略作修改,请输入账号密码那里是提示词,可以随意修改。
location / {
proxy_pass http://192.168.1.101:8096;
auth_basic "请输入账号密码";
auth_basic_user_file /etc/nginx/.htpasswd;
}
但是用的edge好像并不能显示那一行提示,效果如图
图片当然了,不是所有的服务都在http这种应用层上,有的服务需要走TCP/UDP这种传输层,例如说后面会说到的远程控制中转服务器rustdesk。这个时候我们就要用到stream块,stream块下不能按域名区分了,到这个端口的都会转发到你指定的后台端口,他的配置文件的模式如下,包含两个块upstream和server,都可以按需求增加。需要注意的是stream块是独立的,不要把他写到http块里面去了。
stream {
#后台服务1,server1这个名字可以按你喜欢的改,里面的就是你服务的IP和端口号
upstream server1{
server 192.168.1.111:3724;
}
server{
# 监听端口,同样还是有中括号的是IPv6,没有的是IPv4;什么都不写就是TCP,如果是UDP需要在端口号后空格加上
listen [::]:23880;
listen 23880;
# 后端服务设置,需要注意proxy_pass要在上面的upstream块中有写
proxy_pass server1;
proxy_timeout 1s;
proxy_responses 1;
error_log logs/dns.log;
}
设置完成之后按左上角保存,然后我们运行Nginx的测试命令看配置文件是否有问题
nginx -t
如果没问题的话他会返回这个东西
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
这个时候我们就可以重启我们的Nginx服务了
nginx -s reload
这样就完成了Nginx的配置并且启用了他的转发功能,从而实现了我们只有一台机器在公网上有域名,但是我们也可以方便地访问我们局域网内需要的服务。
补充:防火墙
PVE有自带的防火墙,而且是在网页端就可以设置,需要先开数据中心层面的下面的节点和虚拟机才会生效。但是不管你是不是把数据中心层面以及虚拟机的进出都设置成accept都会导致突然出现bug啥都访问不了了, 所以我确实这个地方没有办法写一个稳定的教程,如果要使用的话只能请大家自己折腾了。当然我们的lxc容器里面可以自己直接启用防火墙,比如还是使用iptable然后进行配置,只打开我们上面使用了的端口的对外访问,当然每次我们要新增加端口的时候还需要去设置防火墙。作为建议肯定还是建议开启防火墙的,毕竟是在公网上,不过有一说一确实我现在还没有遇到过被扫的情况以及从其他未启用端口进行攻击的情况。
下一篇我们开始进入All in one功能最多的docker部署的环节。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

crysiswen
校验提示文案
allenjwb
校验提示文案
值友3891755773
校验提示文案
值友3891755773
校验提示文案
allenjwb
校验提示文案
crysiswen
校验提示文案