nginx与frp内网穿透同时使用80端口

admin2年前 (2023-06-03)frp639

       nginx与frp内网穿透会同时使用80端口,如果修改其中某一个服务的端口,那么用域名访问时就必须加上端口号。该文介绍一种方法,能够让nginx与frp同时使用80端口,它的原理是修改frp端口为非80端口,并使用nginx代理该端口。

        举例:在域名 www.abc.com 与 www.def.com 解析到同一ip地址的情况下,想要通过访问 www.abc.com 连接到nginx服务,访问 www.def.com 连接到frp服务。这样就能够将nginx和frp安装在同一台机器上,并且共用80端口,无需在域名后追加端口号访问。

1 准备工作

1 系统

        ubuntu16.04(已测),ubuntu18.04,ubuntu20.04(已测)


        *其它系统版本略有差异,但差异不大,操作步骤请按实际情况修改。


2  必需组件

        操作过程中会用到:wget(下载文件用), tar(解压缩), nano(文本编辑器,vi/vim也可)。如果已有这些组件,可跳过该步骤。

sudo apt-get update

 

#安装wget

sudo apt-get install wget

 

#安装tar

sudo apt-get install tar

 

#安装nano

sudo apt-get install nano

2 nginx的安装

1 安装过程[1]

#必须更新资源列表,才能获得最新的版本

sudo apt-get update

 

#安装nginx

sudo apt-get install nginx

 

#验证是否安装成功

nginx -V

 

#启动nginx服务

service nginx start

        此时访问服务器域名,若出现nginx的欢迎界面,说明安装成功。


nginx安装完成后的文件路径:


主程序 /usr/sbin/nginx


配置文件目录 /etc/nginx


静态文件目录 /usr/share/nginx


日志目录 /var/log/nginx


2 可能遇到的问题

        在ubuntu系统中(其它系统未测),会遇到修改静态文件 index.html 但无效的情况。无论怎么修改,都一直显示nginx的欢迎页面。这是因为nginx的默认配置中,静态页面文件指向了/var/www/html,所以修改 /usr/share/nginx 下的文件不会生效,我们只需将其路径改为 /usr/share/nginx 即可。


1 编辑default文件

sudo nano /etc/nginx/sites-available/default

找到 root /var/www/html; 并将其替换为 root /usr/share/nginx/html;


2 重新加载nginx使配置生效

nginx -s reload

3 frp的安装

1 安装过程

        使用 wget 通过链接下载frp, 在这里可以找到最新版本的frp链接。


#为方便演示,本文将frp安装在/root目录下

 

cd /root

#下载frp

wget https://github.com/fatedier/frp/releases/download/v0.38.0/frp_0.38.0_linux_amd64.tar.gz

 

#解压

tar -xvf frp_0.38.0_linux_amd64.tar.gz

 

#进入目录

cd frp_0.38.0_linux_amd64

 

#修改配置文件

sudo nano frps.ini

        请注意,此时应该先修改配置文件再启动。因为nginx已经占用了80端口,如果直接启动frp,会出现错误。我们应该首先将frp改为非80端口(本文中改为81)。


#以下为 frps.ini 修改后的内容,注意http的端口已经修改为非80端口

 

[common]
bind_port = 7000
vhost_http_port = 81 
vhost_https_port = 444 
token=abcdefg

配置文件修改完成后,以静默方式启动frp。


#静默方式启动frp(请在frp目录下执行该段代码,否则会报错)

 

nohup ./frps -c ./frps.ini &

 每次都以这种方式启动比较麻烦,我们可以用systemd的方式管理。


touch /lib/systemd/system/frps.service
nano /lib/systemd/system/frps.service

打开编辑界面后,将以下模板按照自己情况改写并粘贴保存。


[Unit]
Description=frps daemon
After=syslog.target network.target
Wants=network.target
 
[Service]
Type=simple
ExecStart=/home/frp/frps -c /home/frp/frps.ini
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill $MAINPID
Restart=always
RestartSec=1min
 
[Install]
WantedBy=multi-user.target

 保存以后,就可以通过systemctl命令来控制frps进程了。


#允许frps自启动

systemctl enable frps

 

#启动frps

systemctl start frps

 

#重启frps(修改完配置文件可以用这条快速启动)

systemctl restart frps

 

#停止frps

systemctl stop frps

2 配置过程

        此时,nginx监听80端口,frp监听81端口,我们还需要配置nginx,将对frp的请求转发到81端口。

sudo nano /etc/nginx/nginx.conf

在http的末尾加入如下配置:


    server {
        listen 80;
        server_name *.def.com *.deff.com *.defff.com;    #如有多个域名,用空格隔开
        location / {
        proxy_pass http://127.0.0.1:81;    #将server_name的请求转发到81端口
        proxy_redirect http://$host/ http://$http_host/;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        }
    }

配置结果如图:



         配置完成后,重新加载nginx使配置生效。

nginx -s reload

        此时,访问 www.def.com,即可显示frp页面;访问www.abc.com,显示nginx页面。


注意事项

1. 在静默运行frp时,应该在frp目录下执行运行命令。


2. centos系统默认开启防火墙,会造成某些端口不可用。


3. 修改frp配置文件后,需要重新启动程序才能生效。


重新启动frp方法:


#查看frps的进程号

ps -e | grep frps

 

#根据进程号结束进程

kill 13013

 

#再次运行frps(在frp目录下运行)

nohup ./frps -c ./frps.ini &