用nginx构建高效不限速的个人网盘
1、源码编译安装nginx并部署私人网盘系统
1.0项目环境说明
操作系统:Centos7.9
服务器IP:本机虚拟机环境192.168.225.133
涉及软件:nginx、网盘程序、ssl证书(需要自己去阿里云免费申请)
nginx官方网站:http://nginx.org/,本文使用版本nginx-1.20.2。Nginx是一个高性能的HTTP和反向代理web服务器,其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现最好,国内使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
网盘程序:https://github.com/filebrowser/filebrowser/releases/
网盘程序教程:https://www.filebrowser.cn/
1.1源码编译、安装nginx
1、安装依赖工具:使用yum命令安装,需保证服务器联网。
[root@51ctolinuxserver day1]yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel wget pcre pcre-devel git
2、将 linux-amd64-filebrowser.tar.gz 和 nginx-1.20.2.tar.gz 上传至/data/day1并解压nginx
[root@51ctolinuxserver day1]cd /data/day1
[root@51ctolinuxserver day1]tar zxvf nginx-1.20.2.tar.gz
3、编译安装,configure是检查操作系统环境是否具备源码编译nginx的要求。with是编译时添加两个功能模块status和ssl。编译是make。安装是make install。
[root@51ctolinuxserver day1]./configure --with-http_stub_status_module --with-http_ssl_module
[root@51ctolinuxserver day1]make && make install
nginx编译完成后,默认安装路径为/usr/local/nginx目录下。初始会有四个子目录。conf为配置文件,html为程序目录,logs为日志文件,sbin为启动nginx的二进制命令。
[root@51ctolinuxserver nginx]# pwd
/usr/local/nginx
[root@51ctolinuxserver nginx]# ll
total 16
drwxr-xr-x 2 root root 4096 Nov 22 06:14 conf
drwxr-xr-x 2 root root 4096 Nov 22 06:14 html
drwxr-xr-x 2 root root 4096 Nov 22 06:14 logs
drwxr-xr-x 2 root root 4096 Nov 22 06:14 sbin
[root@51ctolinuxserver nginx]#
1.2编写nginx启动脚本
1、编写nginx.service启动脚本。
1 [root@51ctolinuxserver nginx]# vi /etc/systemd/system/nginx.service 2 [Unit] 3 Description=The nginx HTTP and reverse proxy server 4 After=network.target remote-fs.target nss-lookup.target 5 6 [Service] 7 Type=forking 8 PIDFile=/usr/local/nginx/logs/nginx.pid 9 ExecStartPre=/usr/bin/rm -f /usr/local/nginx/logs/nginx.pid 10 ExecStartPre=/usr/local/nginx/sbin/nginx -t 11 ExecStart=/usr/local/nginx/sbin/nginx 12 ExecReload=/bin/kill -s HUP $MAINPID 13 KillSignal=SIGQUIT 14 TimeoutStopSec=5 15 KillMode=process 16 PrivateTmp=true 17 18 [Install] 19 WantedBy=multi-user.target
2、启动服务
[root@51ctolinuxserver nginx]# systemctl start nginx.service
3、查看进程是否存在,看到nginx的两个进程表示创建成功。
[root@51ctolinuxserver nginx]# ps -ef
root 13277 1 0 09:50 ? 00:00:00 nginx: master process /usr
nobody 13278 13277 0 09:50 ? 00:00:00 nginx: worker process
4、验证
浏览器输入服务器地址192.168.225.133,看到nginx默认页面表示可以成功访问。
1.3管理nginx服务
systemctl start nginx #启动nginx服务
systemctl stop nginx #关闭nginx服务
systemctl reload nginx #重载nginx服务
systemctl enable nginx #设置nginx服务开机自启动
systemctl status nginx #查看nginx服务运行状态
[root@51ctolinuxserver nginx]# systemctl status nginx.service
â— nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/etc/systemd/system/nginx.service; disabled; vendor preset: disabled)
Active: active (running) since Tue 2022-11-22 09:50:48 CST; 33min ago
Process: 13275 ExecStart=/usr/local/nginx/sbin/nginx (code=exited, status=0/SUCCESS)
Process: 13272 ExecStartPre=/usr/local/nginx/sbin/nginx -t (code=exited, status=0/SUCCESS)
Process: 13271 ExecStartPre=/usr/bin/rm -f /usr/local/nginx/logs/nginx.pid (code=exited, status=0/SUCCESS)
Main PID: 13277 (nginx)
CGroup: /system.slice/nginx.service
├─13277 nginx: master process /usr/local/nginx/sbin/nginx
└─13278 nginx: worker process
Nov 22 09:50:48 51ctolinuxserver systemd[1]: Starting The nginx HTTP an...
Nov 22 09:50:48 51ctolinuxserver nginx[13272]: nginx: the configuration...
Nov 22 09:50:48 51ctolinuxserver nginx[13272]: nginx: configuration fil...
Nov 22 09:50:48 51ctolinuxserver systemd[1]: Failed to parse PID from f...
Nov 22 09:50:48 51ctolinuxserver systemd[1]: Started The nginx HTTP and...
Hint: Some lines were ellipsized, use -l to show in full.
1.4安装并配置网盘程序
1、安装网盘程序,网盘上传的文件都会存放到 /data1/fb目录下。
1)创建存放数据的目录
[root@51ctolinuxserver day1]# mkdir -p /data1/fb
2)解压缩文件
[root@51ctolinuxserver day1]# cd /data/day1
[root@51ctolinuxserver day1]# tar zxvf linux-amd64-filebrowser.tar.gz
CHANGELOG.md
LICENSE
README.md
filebrowser
3)把网盘程序加到系统命令中, 拷贝到/usr/sbin下。
[root@51ctolinuxserver day1]# cp filebrowser /usr/sbin
cp: overwrite ‘/usr/sbin/filebrowser’? y
2、配置网盘程序,也可以把所有命令放到shell脚本中,然后用sh命令执行这个shell脚本。本文分别执行下面命令。
1)初始化,filebrowser.db为数据库文件,非常重要,不能删除。
[root@51ctolinuxserver /]# filebrowser -d /data/fb/filebrowser.db config init
2)绑定网卡,任何人都可以访问。
[root@51ctolinuxserver /]# filebrowser -d /data/fb/filebrowser.db config set --address 0.0.0.0
3)配置网盘系统访问的端口为8088,可自定义。
[root@51ctolinuxserver /]# filebrowser -d /data/fb/filebrowser.db config set --port 8088
4)设置语言为简体中文
[root@51ctolinuxserver /]# filebrowser -d /data/fb/filebrowser.db config set --locale zh-cn
5)设置日志存放路径
[root@51ctolinuxserver /]# filebrowser -d /data/fb/filebrowser.db config set --log /var/log/filebrowser.log
1 [root@51ctolinuxserver /]# filebrowser -d /data/fb/filebrowser.db config set --log /var/log/filebrowser.log 2 Sign up: false 3 Create User Dir: false 4 Auth method: json 5 Shell: 6 7 Branding: 8 Name: 9 Files override: 10 Disable external links: false 11 Color: 12 13 Server: 14 Log: /var/log/filebrowser.log 15 Port: 8088 16 Base URL: 17 Root: . 18 Socket: 19 Address: 0.0.0.0 20 TLS Cert: 21 TLS Key: 22 Exec Enabled: false 23 24 Defaults: 25 Scope: . 26 Locale: zh-cn 27 View mode: list 28 Single Click: false 29 Commands: 30 Sorting: 31 By: name 32 Asc: false 33 Permissions: 34 Admin: false 35 Execute: true 36 Create: true 37 Rename: true 38 Modify: true 39 Delete: true 40 Share: true 41 Download: true 42 43 Auther configuration (raw): 44 45 { 46 "recaptcha": null 47 }
3、设置网盘系统登录用户名和密码
[root@51ctolinuxserver /]# filebrowser -d /data/fb/filebrowser.db users add admin abc123456 --perm.admin
上面创建了一个用户是admin,密码是abc123456的管理员账号。perm是设置为管理员。
1 [root@51ctolinuxserver /]# filebrowser -d /data/fb/filebrowser.db users add admin abc123456 --perm.admin 2 ID Username Scope Locale V. Mode S.Click Admin Execute Create Rename Modify Delete Share Download Pwd Lock 3 1 admin . zh-cn list false true true true true true true true true false 4 [root@51ctolinuxserver /]#
4、设置网盘系统共享数据目录
[root@51ctolinuxserver /]# filebrowser -d /data/fb/filebrowser.db config set --root /data1/fb
以后网盘上传的数据会自动放在/data1/fb目录下。
5、启动程序
1)手动直接启动
[root@51ctolinuxserver sbin]# nohup filebrowser -d /data/fb/filebrowser.db >/dev/null 2>&1 &
[1] 14416
#停止网盘系统,执行如下命令:
[root@51ctolinuxserver sbin]# kill -9 $(pidof filebrowser)
#设置服务开机自启动:
[root@51ctolinuxserver sbin]# echo 'nohup filebrowser -d /data/fb/filebrowser.db >/dev/null 2>&1 &' >>/etc/rc.local
[root@51ctolinuxserver sbin]# chmod +x /etc/rc.d/rc.local
2)通过systemctl管理服务
创建并编写启动脚本fb.service。
[Unit]
Description=The filebrowser Process Manager
After=network.target
[Service]
Type=simple
ExecStart=/usr/sbin/filebrowser -d /data/fb/filebrowser.db
ExecReload=/bin/killall filebrowser
PrivateTmp=true
[Install]
WantedBy=multi-user.target
执行的时候因为写的文件有错误启动不成功,后来修改好后怎么也启动不起来,经查询编辑此文件后,应运行以下命令systemctl daemon-reload让系统知道我们的更改。报错如下:
Nov 22 11:33:43 51ctolinuxserver systemd[1]: [/etc/systemd/system/fb.service:1] Invalid section header '[root@51ctolinuxserver /]# vi /etc/systemd/system/fb.service'
启动进程
运行:systemctl start fb.service
停止运行:systemctl stop fb.service
开机启动:systemctl enable fb.service
取消开机启动:systemctl disable fb.service
查看运行状态:systemctl status fb.service
6、查看进程和网络端口,可以看到8088端口已开启。
[root@51ctolinuxserver fb]# ps -ef
root 14416 13915 0 11:21 pts/3 00:00:00 filebrowser -d /data/fb/filebrowser.db
[root@51ctolinuxserver fb]# netstat -atnlp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 636/rpcbind
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 13277/nginx: master
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1002/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1000/cupsd
tcp 0 52 192.168.225.133:22 192.168.225.1:55767 ESTABLISHED 2452/sshd: root@pts
tcp6 0 0 :::111 :::* LISTEN 636/rpcbind
tcp6 0 0 :::22 :::* LISTEN 1002/sshd
tcp6 0 0 ::1:631 :::* LISTEN 1000/cupsd
tcp6 0 0 :::8088 :::* LISTEN 14416/filebrowser
[root@51ctolinuxserver fb]#
7、用浏览器输入网址查看
http://192.168.225.133:8088/
输入账号密码登录进去。admin/abc123456。可以新建文件夹,上传文件等。
2、使用nginx实现私人网盘安全代理
2.1反向代理
要实现网盘安全稳定运行,我们还需要在网盘前端构建一个反向代理服务器,通过nginx屏蔽网盘系统直接暴露在网上,最大限度保障网盘安全。可见,反向代理保障了服务器的安全。
2.2正向代理
正向代理是从客户端的角度出发,服务于特定用户,比如说一个局域网内的客户,以访问非特定的服务,例如当你用浏览器访问国外的网站(谷歌),被拒绝无法访问时,你可以在国外搭建一个代理服务器,这样就可以正常访问了。
正向代理隐藏了客户,用户的请求被代理服务器接收代替,到了服务器,服务器并不知道用户是谁。而反向代理隐藏的是服务器。
2.3部署nginx实现反向代理
通过源码安装nginx,默认nginx会安装到/usr/local/nginx路径下,接着,找到nginx配置文件nginx.conf,在http
段的server段注释掉下面内容:
#location / {
# root html;
# index index.html index.htm;
#}
同时,添加如下内容:
location / {
proxy_pass http://192.168.225.134:8088;
proxy_set_header Host $proxy_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
这段内容实现的就是反向代理功能,也就是用户请求先访问nginx,然后nginx通过反向代理功能将请求转发到后端
的个人网盘对应的服务端口上。这里192.168.225.134是我安装网盘程序的服务器IP,开放的端口是8088.
最后,启动nginx服务:
[root@server1 conf]# systemctl start nginx
[root@server1 conf]# systemctl enable nginx
最后,通过nginx所在服务器的80端口http://192.168.225.134直接就可以访问我们的网盘系统了。
4、可能会遇到的问题,课堂上讲的,未测试,所以IP地址没有改。
现在通过nginx反向代理,保障了后端网盘系统的安全,但也会带来一些问题,例如,在网盘系统中上传大文
件的时候,可能出现如下错误:
2022/03/01 17:38:06 [error] 305603#0: *199 client intended to send too large body: 605228707 bytes,
client: 172.16.213.132, server: localhost, request: "POST /api/resources/harbor-offline-installer-
v2.3.5.tgz?override=false HTTP/1.1", host: "172.16.213.31", referrer: http://172.16.213.31/files/
这个错误是说,nginx不允许上传这么大的文件.
要取消这个限制,需要在nginx配置文件nginx.conf中的http模块增加如下配置:
client_max_body_size 200m;
其中,client_max_body_size表示允许上传单个文件的最大值,如果你要上传1GB大小的文件, 那么就修改
这个值大于1GB。
3、使用nginx实现https加密传输
3.1http与https区别
HTTP是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),HTTP协
议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全。
HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版本,HTTPS协议是利用SSL+HTTP协议建立安全信道,
加密数据包,提供身份认证的网络协议,要比http协议安全。
HTTPS和HTTP的区别:
•
http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
•
http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
•
使用https协议需要申请证书,证书有收费和免费的。
现在网站几乎所有都开启了https协议,所以使用https已经是个趋势。
个人网盘系统,需要保障数据安全、加密传输,所以,我们还需要设置域名访问网盘,并开启https加
密传输。
要实现这个功能,需要申请一个ssl证书,我们可以在阿里云申请一个免费的ssl证书,然后将证书绑
定到我们服务器的nginx上,即可实现网盘数据加密传输。
3.2阿里云申请ssl证书
阿里云有一年的免费ssl证书可用,申请方式如下:
3.3绑定ssl证书到nginx
获取证书之后,将证书绑定到我们服务器的nginx配置上即可,在nginx上配置ssl证书,需要在nginx.conf中添加一
个server段,内容如下:
server
{
listen 443 ssl;
server_name www.iivey.com;
ssl_certificate iivey/6733838_www.iivey.com.pem;
ssl_certificate_key iivey/6733838_www.iivey.com.key;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "HIGH:!aNULL:!MD5";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-Xss-Protection 1;
location / {
proxy_pass http://172.16.213.31:8088;
proxy_set_header Host $proxy_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
然后,启动nginx服务:
[root@server1 conf]# systemctl restart nginx
最后,再次通过域名访问网盘。
本文是参加51CTO学堂linux集训营的学习笔记,都是参考老师课件结合自己实际操作编写。另外本文网络使用的是nat模式,所以IP地址不稳定,192.168.225.133和192.168.225.134都出现过。