前段时间搭建博客的时候为远程服务器配置了许多环境,由于其中踩了一些坑,故想记录下来。今日心情不错,特此一录。
Docker是用于搭建环境的不二选择,本文采用传统的方式进行环境搭建,以后可能会出一个Docker的版本。
Linux远程服务器环境搭建如何选购云服务器?一些很重要的Linux命令:查询某个服务占用的端口号:强大的systemctl:Mysql服务器搭建安装过程:MQTT服务器搭建:1.MQTT协议实现方式2.MQTT客户端3.MQTT服务器4.MQTT协议中的订阅、主题、会话5.MQTT协议数据包结构mosquitto简介1. apt-get命令安装2. 修改配置文件3. 启动4. 其他处理Frp服务器搭建如何安装:客户端搭建:配置启动文件:客户端部署模板:配置代理访问:点对点透传:Tomcat服务器安装:服务器安装:我的世界服务器安装:如何使用:
Mysql远程环境 MQTT物联网服务器环境 Frp内网穿透 java环境 python环境 Tomcat服务器配置 Ftp服务器搭建
云服务器是一台部署在云端的一台远程主机,通过ssh协议可以想在本地一样使用云服务器。ssh协议属于TCP/IP协议族中的一种用于远程登录的安全的通讯协议,它位于体系结构中的应用层,实际是使用Tcp协议进行通讯。常见的远程登录有telnet和ssh两种,但ssh协议是十分安全的,因为它在通讯的过程中,会对需要通讯的消息进行加密,实际传输的都是密文,十分安全,故而经常用于远程控制服务器。
拥有一台远程服务器是很酷的一件事情,拥有一台服务器可以干许多事情,例如搭建一台MQTT服务器,然后可以使用ESP8266或ESP32等芯片轻松实现物联网应用。搭建一台Frp服务,轻松实现内网穿透,解决众多小伙伴没有公网ip的烦恼。搭建一台Mysql服务器,实现数据的远程存储。配置Tomcat服务器,搭建个人网站或博客,或者搭建一台我的世界服务器等等…
现在网上有许多服务器的供应商,例如阿里云,腾讯云等,每个平台新用户或双十一的时候都有巨大折扣,我去年的一台一年期的服务器就是在双十一的时候花60多块钱买的。购买服务器时主要看三个指标:**1.性能指标:**例如1核2G或2核4G,主要体现云服务器的性能。**2.带宽:**带宽也是一个很重要的指标,带宽除以8就是实际的最大网速,对于网站,游戏服务器等并发量可能会比较大的应用,需要选取合适的带宽。3,是否是境外服务器:对于境外服务器,搭建网站的时候不需要备案,如何时境内的,根据相关法律法规的要求,必须要进行备案。ps:网站备案程序十分麻烦,建议早做准备,我前段时间为我的域名备案,一顿操作后还让我苦等了半个月,其中艰辛不足为外人道也。。。如果是境外服务器还可以搭建梯子,frp就可以实现Socket代理和http代理,实现科学上网。但境外服务器的价格普遍比国内服务器的价格贵许多。
ps:新用户购买服务器有许多优惠,强烈推荐各位到万能的淘宝上进行购买,我前几天就在上面买了个一年期的2核4G的服务器,才花了50多块钱。。。
这里介绍几个很常用且很实用的linux命令:对于基础的文件管理,权限管理,用户管理等基础知识不进行赘述。
1.查询某个服务的进程PID:
ps -aux | grep 服务名
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Dh5J61t-1636729425688)(https://i.loli.net/2021/10/17/pgLDkYKZwar8jVy.png)
该命名结合管道符可以用来查询某个服务的pid号,可以用来查看某个服务是否在运行
2.通过PID号查询该服务开启的端口:
每个服务一般都是通过端口与外界或其他应用程序进行数据交流。
netstat -nap | grep [pid]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1l5JUrgt-1636728972823)(https://i.loli.net/2021/10/17/Jto7bxE63IiZfmN.png)]
注意第三列表示本机ip和进程开放的端口号,第四列表示与本机连接的远程主机的 ip和端口号,ipv6本机地址用::表示。注意:第二列如果是0.0.0.0:端口号表示可以由任意远程主机进行连接,如果是127.0.0.1:端口号表示只能由本机ip进行访问.我配置Mysql远程连接的时候就遇到了这个坑。
如果要结束某个进程直接用kill PID号就可以了。
Linux中的systemctl主要用来管理主机中的一些进程。你可以通过它将某些命令或shell脚本配置为服务。然后通过systemctl工具来管理这些服务,你可以用systemctl方便的启动或停止某些服务,或者将其配置为开机自启。
systemctl是十分强大的,你可以将一些命令,脚本或者应用程序配置为服务,然后通过它进行管理。配置为服务其实就是建立一个 服务名.service文件,并把它放在**/usr/lib/systemd/system目录下**。
[Unit]
Description=服务描述
After=服务依赖(再这些服务后启动本服务)
[Service]
Type=服务类型
ExecStart=启动命令
ExecStop=终止命令
ExecReload=重启命令
[Install]
WantedBy=服务安装设置
这是一个服务配置文件的示例,将其放在/usr/lib/systemd/system目录下之后需要运行以下命令让系统重新读取所有服务文件。
systemctl daemon-reload
]
以上命令查看/usr/lib/systemd/system目录下的Frp服务端的配置文件,可以发现它时间上还是通过运行/usr/local/frp/frps的可执行程序并指定配置文件-c /usr/local/frp/frps.ini来运行服务的。
systemctl enable 服务名 # 启用开机自启
systemctl disable 服务名 # 禁用开机自启
systemctl status tomcat.service #(tomcat服务详细信息)
systemctl start 服务名 #启动某服务
systemctl stop 服务名 #停止某服务
systemctl restart 服务名 #重启某服务
systemctl list-units --type=service #显示所有已启动的服务
systemctl list-unit-files #查看开机自启的服务
这里只是大概讲了以下systemctl的用途。想要了解更多的小伙伴可以自行去学习。
MySQL是一个关系型数据库管理系统,由瑞典[MySQL AB](https://baike.baidu.com/item/MySQL AB/2620844) 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
本文推荐从 Ubuntu 仓库上安装 MySQL。非常简单,
1.更新软件源
sudo apt update
2.安装 MySQL 5.7
sudo apt install mysql-server -y
3.配置mysql:
对于刚安装的 MySQL,你应该运行它提供的安全相关的更新命令。就是:
sudo mysql_secure_installation
这样做首先会询问你是否想使用 “ 密码有效强度(validate password component)”。如果你想使用它,你将必须选择一个最小密码强度(0 – 低,1 – 中,2 – 高)。你将无法输入任何不遵守所选规则的密码。如果你没有使用强密码的习惯(本应该使用),这可能会配上用场。如果你认为它可能有帮助,那你就键入 y
或者 Y
,按下回车键,然后为你的密码选择一个强度等级和输入一个你想使用的密码。如果成功,你将继续强化过程;否则你将重新输入一个密码。
但是,如果你不想要此功能(我不会),只需按回车或任何其他键即可跳过使用它。
对于其他选项,我建议开启它们(对于每一步输入 y
或者 Y
和按下回车)。它们(依序)是:“ 移除匿名用户(remove anonymous user)”,“ 禁止 root 远程登录(disallow root login remotely)”,“ 移除测试数据库及其访问(remove test database and access to it)”。“ 重新载入权限表(reload privilege tables now)”。
4.重启mysql服务:
sudo systemctl restart mysql.service
5.使用mysql:
mysql -h host_name -u user -p
-h
用来指定一个主机名(如果这个服务被安装到其他机器上,那么会有用;如果没有,忽略它)-u
指定登录的用户-p
指定你想输入的密码.要从服务端断开连接和离开 MySQL 提示符,输入:
QUIT
6.开启远程访问:
在默认情况下,MySQL 数据库仅监听本地连接。如果想让外网远程连接到数据库,我们需要修改配置文件,让 MySQL 可以监听远程固定 ip 或者监听所有远程 ip。
首先打开 mysqld.cnf
配置文件。
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
默认情况下, bind - address 的值为 127.0.0.1 ,所以只能监听本地连接。我们需要将这个值改为远程连接 ip 可访问,可使用通配符 ip 地址 *
, ::
, 0.0.0.0
,当然也可以是单独的固定 ip,这样就仅允许指定 ip 连接,更加安全。在某些 MySQL 版本的配置文件中,没有 bind - address 这一行,这种情况下,在合适的位置加上就可以了。
然后重启 MySQL 服务,使刚刚编辑的 mysqld.cnf
文件生效。
MQTT(Message Queuing Telemetry Transport)消息队列遥测传输协议,是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。 . MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。 . MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。
实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。 . MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:
- (1)Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);
- (2)payload,可以理解为消息的内容,是指订阅者具体要使用的内容。
一个使用MQTT协议的应用程序或者设备,它总是建立到服务器的网络连接。客户端可以:
- (1)发布其他客户端可能会订阅的信息;
- (2)订阅其它客户端发布的消息;
- (3)退订或删除应用程序的消息;
- (4)断开与服务器连接。
MQTT服务器以称为"消息代理"(Broker),可以是一个应用程序或一台设备。它是位于消息发布者和订阅者之间,它可以:
- (1)接受来自客户的网络连接;
- (2)接受客户发布的应用信息;
- (3)处理来自客户端的订阅和退订请求;
- (4)向订阅的客户转发应用程序消息。
一、订阅(Subscription)
订阅包含主题筛选器(Topic Filter)和最大服务质量(QoS)。订阅会与一个会话(Session)关联。一个会话可以包含多个订阅。每一个会话中的每个订阅都有一个不同的主题筛选器。
二、会话(Session)
每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互。会话存在于>一个网络之间,也可能在客户端和服务器之间跨越多个连续的网络连接。
三、主题名(Topic Name)
连接到一个应用程序消息的标签,该标签与服务器的订阅相匹配。服务器会将消息发送给订阅所匹配标签的每个客户端。
四、主题筛选器(Topic Filter)
一个对主题名通配符筛选器,在订阅表达式中使用,表示订阅所匹配到的多个主题。
五、负载(Payload)
消息订阅者所具体接收的内容。
在MQTT协议中,一个MQTT数据包由:固定头(Fixed header)、可变头(Variable header)、消息体(payload)三部分构成。MQTT数据包结构如下:
- (1)固定头(Fixed header)。存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识。
- (2)可变头(Variable header)。存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容。
- (3)消息体(Payload)。存在于部分MQTT数据包中,表示客户端收到的具体内容。
Mosquitto是用C语言实现MQTT协议的Broker。是一款实现了消息推送协议 MQTT v3.1 的开源消息代理软件,提供轻量级的,支持可发布/可订阅的的消息推送模式,使设备对设备之间的短消息通信变得简单,比如现在应用广泛的低功耗传感器,手机、嵌入式计算机、微型控制器等移动设备。一个典型的应用案例就是 Andy Stanford-ClarkMosquitto(MQTT协议创始人之一)在家中实现的远程监控和自动化。
Mosquitto官网
Mosquitto最新的源码
# 安装mosquitto
sudo apt-get install mosquitto
# 安装客户端
sudo apt-get install mosquitto-clients
# 安装设备端
sudo apt-get install mosquitto-dev
123456
配置文件地址:/etc/mosquitto/mosquitto.conf
从上面的源码地址中下载源码,然后找到mosquitto.conf
文件,将其替换掉/etc/mosquitto/mosquitto.conf
文件。 你也可以根据需求,阅读手册自己写mosquitto.conf
mosquitto -c /etc/mosquitto/mosquitto.conf
systemctl status mosquitto
systemctl start/stop mosquitto
ps -aux | grep mosquitto
netstat -apn | grep 1883
kill -9 pid
frp是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务, 支持tcp, udp, http, https等协议类型,并且web服务支持根据域名进行路由转发。 frp内网穿透主要用于没有公网IP的用户,实现远程桌面、远程控制路由器、 搭建的WEB、FTP、SMB服务器被外网访问、远程查看摄像头、调试一些远程的API
1.一个域名(www.test.xyz)
2.一台有公网IP的服务器(阿里云、腾讯云等都行)
3.一台内网主机
4.下载frp,选择适合的版本下载
解压下载的压缩包并进入相应的目录。
配置frps.ini服务器端配置文件:
[common]
bind_port = 7000 # 服务端与客户端通信端口
dashboard_port = 7500 # 后台管理端口
dashboard_user = admin # 后台登录用户名
dashboard_pwd = admin
vhost_http_port = 7002 # http穿透端口
vhost_https_port = 7003 # https穿透端口
max_pool_count = 50
token = aaa123 # 身份验证令牌,frpc要与frps一致
tcp_mux = true
log_file = /usr/local/frp/frps.log # 日志相关
log_level = info
log_max_days = 3
authentication_timeout = 0 # 服务器与客户端时间相差15min会连接失败,0表示不验证
subdomain_host = test.xyz # 注册的域名
privilege_mode = true
启动服务器:
frps -c frps.ini
启动成功后,可以访问后台管理界面(这里举例地址:ip地址:7500)
编辑frpc.ini配置文件。
[common]
server_addr = 10.10.xxx.xxx # 公网服务器ip
server_port = 7000 # 公网服务端通信端口
token = aaa123 # 令牌,与公网服务端保持一致
tcp_mux = true
log_file = /usr/local/frp/frpc.log # 日志相关
log_level = info
log_max_days = 3
authentication_timeout = 0 # 服务器与客户端时间相差15min会连接失败,0表示不验证
[ssh] # 添加ssh节点
type = tcp
local_ip = 192.168.xxx.xxx
local_port = 22
remote_port = 7001 # 指明由公网服务器的7001端口代理
[web01] # 添加web节点
type = http
local_ip = 192.168.xxx.xxx
local_port = 8080 # 本地8080端口可以通公网服务器7002端口访问,这里我的8080跑着tomcat
subdomain = web01 # 自定义子域名
客户端启动:
frpc -c frpc.ini
vim /etc/systemd/system/frps.service
[Unit]
Description=frps daemon
After=syslog.target network.target
Wants=network.target
[Service]
Type=simple
ExecStart=/root/frp_0.17.0_linux_amd64/frps -c /root/frp_0.17.0_linux_amd64/frps.ini
Restart= always
RestartSec=1min
[Install]
WantedBy=multi-user.target
注意ExecStart中要配置成自己的绝对路径,绝对路径可以通过pwd命令查询。
#启动frps
systemctl daemon-reload
systemctl start frps
#设置为开机启动
systemctl enable frps
[common]
server_addr = your_server_ip #VPS服务器IP
server_port = 7000 #端口,与服务端bind_port一致
privilege_token = 123456 #自定义值,需和服务端frps.ini的一致
login_fail_exit = false #失败时自动重连
admin_addr = 127.0.0.1 #开启后可通过热加载方式进行 FRP 客户端配置变更
admin_port = 7400 #可以通过 frpc reload 命令来动态加载配置文件,通过 frpc status -c ./frpc.ini 命令在 FRP 客户端查看当前代理状态信息。
#通过 TCP 访问内网机器:
#1.公网通过ssh访问内部服务器
[ssh]
type = tcp #连接协议
local_ip = 127.0.0.1 #内网服务器ip,填你需要转发到的目的ip
local_port = 22 #ssh默认端口
remote_port = 8000 #自定义的访问内部ssh端口号
#2.公网通过ftp(如使用WinSCP)访问内部服务器
[ftp]
type = tcp
local_ip = 127.0.0.1
local_port = 21,10000-10010 #FTP默认端口
remote_port = 2121,10000-10010 #自定义的远程访问端口 使用:打开WinSCP,填写主机IP(VPS的公网IP)、端口(自定义的远程访问端口2121 )、用户名密码(树莓派的用户名和密码) 。也可以通过访问 ftp://服务端IP:2121
#3.公网通过VNC远程访问图像化内部服务器
# 自定义一个配置名称,格式为“[range:名称]”,放在开头
[range:VNC]
type = tcp
local_ip = 127.0.0.1
local_port = 5900 #vnc默认端口
remote_port = 5900 #远程端口,ssh远程树莓派时使用的端口
#通过 UDP 访问内网机器
[dns]
type = udp
local_ip = 8.8.8.8
local_port = 53
remote_port = 8500
#通过 FRP 客户端代理其它内网机器访问外网
[http_proxy]
type = tcp
remote_port = 9000
plugin = http_proxy
#通过自定义域名访问部署于内网的 Web 服务
[web]
type = http #访问协议
local_ip = 127.0.0.1 #内网服务器ip
local_port = 80 #内网web服务的端口号
custom_domains = www.dengxj.com,dengxj.com
#所绑定的公网服务器域名,一级、二级域名都可以,绑定多个域名时用英文“,”分开
在只能通过代理访问外网的环境内,FRP 客户端支持通过 HTTP_PROXY 参数来配置代理和 FRP 服务端进行通信。要使用此功能可以通过设置系统环境变量 HTTP_PROXY 或者通过在 FRP 客户端 的配置文件中设置 http_proxy 参数来使用此功能。
[common]
server_addr = your_server_ip
server_port = 7000
protocol = tcp
http_proxy = http://user:pwd@your_server_ip:8080
在传输大量数据时如果都经过服务器中转的话,这样会对服务器端带宽压力比较大。
FRP 提供了一种新的代理类型 XTCP 来解决这个问题,XTCP 模式下可以在传输大量数据时让流量不经过服务器中转。
使用方式同 STCP 类似,需要在传输数据的两端都部署上 FRP 客户端上用于建立直接的连接。
首先在 FRP 服务端 配置上增加一个 UDP 端口用于支持该类型的客户端: bind_udp_port = 7001
[common]
bind_addr = 0.0.0.0
bind_port = 7000 # 客户端与服务端进行通信的端口,即frp服务端口,需与客户端server_port一致
privilege_token = 123456 # 特权模式密钥,需与客户端frpc.ini一致
vhost_http_port = 8080 # http服务端口,开启后服务端完成通过域名访问部署于内网的 Web 服务部署,这里将 HTTP 访问端口设为 8080
vhost_https_port = 443 # https服务端口
dashboard_port = 7500 # 控制台端口 通过 Dashboard 可以方便的查看 FRP 的状态以及代理统计信息展示 通过 http://[server_addr]:7500 访问 Dashboard 界面,用户名密码默认都为 admin。
bind_udp_port = 7001
1234567891011
其次配置 FRP 客户端,和常规 TCP 转发不同的是这里不需要指定远程端口。 修改前:
[common]
server_addr = your_server_ip
server_port = 7000
[ssh]
type = tcp #连接协议
local_ip = 127.0.0.1 #内网服务器ip
local_port = 22 #ssh默认端口
remote_port = 8000 #自定义的访问内部ssh端口号
123456789
修改后:
[common]
server_addr = your_server_ip
server_port = 7000
[p2p_ssh]
type = xtcp
sk = abcdefg # 只有 sk 一致的用户才能访问到此服务
local_ip = 127.0.0.1
local_port = 22
123456789
然后在要访问这个服务的机器上启动另外一个 FRP 客户端,配置如下:
[common]
server_addr = your_server_ip
server_port = 7000
[p2p_ssh_visitor]
type = xtcp
role = visitor # XTCP 的访问者
server_name = p2p_ssh # 要访问的 XTCP 代理的名字
sk = abcdefg
bind_addr = 127.0.0.1 # 绑定本地端口用于访问 ssh 服务
bind_port = 6006
1234567891011
这样就可以通过本机 6006 端口对内网机器 SSH 服务进行访问。
目前 XTCP 模式还处于开发的初级阶段,并不能穿透所有类型的 NAT 设备,所以穿透成功率较低。穿透失败时可以尝试 STCP 的方式。
Tomcat简单的说就是一个运行JAVA的网络服务器,底层是Socket的一个程序,它也是JSP和Serlvet的一个容器。
配置Tomcat
运行Tomcat需要JDK的支持【Tomcat会通过JAVA_HOME找到所需要的JDK】。
Linux服务器安装Tomcat服务有一下几种方式:
这里介绍最后一种直接用apt-get的安装方式。
1.首先需要进行JAVA环境的配置和安装,在linux上可以下载openjdk来作为java环境。
OpenJDKJava最早由SUN公司(Sun Microsystems,发起于美国斯坦福大学,SUN是Stanford University Network的缩写)发明,2006年SUN公司将Java开源,此时的JDK即为OpenJDK。OpenJDK是Java SE的开源实现,他由SUN和Java社区提供支持,2009年Oracle收购了Sun公司,自此Java的维护方之一的SUN也变成了Oracle。大多数JDK都是在OpenJDK的基础上编写实现的,比如IBM J9,Azul Zulu,Azul Zing和Oracle JDK。几乎现有的所有JDK都派生自OpenJDK,他们之间不同的是许可证,OpenJDK根据许可证GPL v2发布。 Oracle JDK根据Oracle二进制代码许可协议获得许可。
更新系统安装包缓存,并且安装OpenJDK8
sudo apt-get update
sudo apt-get install openjdk-8-jdk
设置环境变量:
修改全局配置文件,作用于所有用户:
export JAVA_HOME=/usr/lib/jdk/jdk1.8
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=.:${JAVA_HOME}/bin:$PATH
之后通过一条命令就可以安装tomcat9
sudo apt-get install tomcat9
想要寻找tomcat的配置文件可以通过以下命令来寻找tomcat9的配置和安装目录:
whereis tomcat9
这里安装的是forge1.17版本
服务端下载链接:链接:https://pan.baidu.com/s/1GE1M2kW_utK8JVULPcCsVA 提取码:t1ab
客户端下载链接:链接:https://pan.baidu.com/s/15VRI2LUxWqqYbDItAk_n8A 提取码:656b
服务端:
1.安装java环境,该版本需要配置jdk1.16版本的环境,还需要配置JAVA_HOME等环境变量。
2.将服务器端文件上传到服务器,同时解压就可以运行
服务器端运行run.sh就可以启动。
客户端:
客户端直接点击运行就可以启动,输入服务器的ip地址或域名就可以进入到服务器。
想要装Mod的话可以到网上找找教程,好像把mod放到.minecraft文件夹应该就可以了。