将自己的树莓派/服务器变成自己的NAS、下载器

本文最后更新于:2021年9月4日 凌晨

前言

对NAS总是抱有好奇?对NAS的价格望而却步?
但是,如果你有树莓派,或者是Linux服务器,为什么不试试让它们变成自己的小型NAS?

NAS

NAS(Network Attached Storage:网络附属存储)按字面简单说就是连接在网络上,具备资料存储功能的装置,因此也称为“网络存储器”。它是一种专用数据存储服务器。

大型的NAS,比如:群晖。可以有App,对手机照片进行备份,还可以对数据进行灾变处理,但是价格就比较贵了。而本次搭建NAS,主要满足:

  • 在线访问数据
  • 下载站
  • 挂载到电脑上,作为网络U盘

操作思路

1. 在线访问数据

比如:.flv、.mp4、.jpg等等,我们使用PHP实现网络浏览,这里我们使用_h5ai:
_h5ai效果

2. 下载站

Aria2实现下载站
下载站,我们使用Aria2这个多线程下载器实现,难点是挂载到电脑上,也就是目录映射。最好能满足:

  • 加密传输,保证安全
  • 支持平台多,速度稳定

3. 挂载到本地磁盘

在macOS上挂载
在macOS上挂载
在Windwos上挂载
其实,本地挂载树莓派、服务器磁盘的选择有很多。比如:SMB、FTP等。但是,考虑安全和利用情况下,我还是选择Webdav。

Windows和macOS都支持挂载Webdav,但是可能会出现无法写的情况。我建议使用第三方免费工具:

以上两款软件也都是免费的。

本文使用Webdav挂载,如果你使用宝塔,或者使用SMB,那么也完全可以选择非Webdav协议挂载磁盘。

(宝塔不可使用Nginx Webdav插件)

总结

综上,我们本次需要安装:

  • Nginx:用来提供Web目录访问
  • PHP:用来映射目录,实现_h5ai
  • Nginx模块:Webdav模块和Fancyindex模块,用来实现Webdav

前排提示

本次教程,适用所有架构的Linux(arm架构和x86都可以)。PHP、Nginx的配置,使用编译安装的方法,可能比较硬核,需要耐心观看。

如果还是不知道如何操作,可以使用宝塔面板安装Nginx和PHP,但是宝塔面板无法安装Webdav模块哦。

如果你想使用宝塔完成搭建,可以参考图文:宝塔搭建PHP、Nginx并部署_h5ai

考虑到树莓派的性能,不建议树莓派使用宝塔面板。

视频演示

嘿嘿,做教程视频不易(B站根本不会推荐引流),请务必一键三连嗷~B站视频地址:https://www.bilibili.com/video/BV1Ey4y1571F

服务器要求

如果是树莓派,那么没什么具体要求,有个可以刷写SD卡的软件即可(比如:https://www.balena.io/etcher

但是,如果是服务器,最好选择高带宽的服务器,内存最好需要2G以上,否则编译PHP时,可能需要SWAP的支持。

如果你还买购买服务器,我们推荐:

另外,为大家争取到优惠*(੭ˊᵕˋ)੭ଘ:

以上链接,均为我们博客专享优惠链接了解

PHP

PHP官方下载地址:https://www.php.net/downloads.php。因为PHP8还是不稳定,所以我们选择PHP7.4。下载到服务器后,使用tar对其解压,并进入这个目录,准备开始编译:

1
2
3
wget 'https://www.php.net/distributions/php-7.4.22.tar.gz'
sudo tar -xf php-7.4.22.tar.gz
cd php-7.4.22

下载PHP源码
因为,我们需要安装_h5ai,所以编译参数可以(这个是我配置的PHP7.4,其他PHP版本可能略微不一样,需要自己判断):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
./configure \
--prefix=/usr/local/php7 \
--with-curl \
--with-mysqli \
--with-openssl \
--with-pdo-mysql \
--with-jpeg \
--enable-gd \
--enable-fpm \
--with-fpm-user=pi \
--with-fpm-group=pi \
--enable-bcmath \
--enable-xml \
--with-zip \
--enable-mbstring \
--enable-sockets \
--with-zlib \
--enable-fileinfo \
--enable-exif

为了达成这个编译参数,我们需要安装依赖。

依赖安装

之后,我们安装依赖,主要是一些编译库。

GCC

编译,肯定需要编译器的支持,后文的Nginx也需要这个。我们安装build-essential即可安装GCC。类似于macOS的Xcode-commnad。终端内输入:

1
sudo apt-get install build-essential

pkg-config

需要pkg-config,Debian发行版本Linux上可以这样安装:

1
sudo apt-get install pkg-config

libxml2

需要libxml2,Debian发行版本Linux上可以这样安装:

1
sudo apt-get install libxml2-dev

openssl

需要openssl,Debian发行版本Linux上可以这样安装。openssl是必须的,这个提供了加密支持,Nginx也需要这个:

1
sudo apt-get install openssl libssl-dev

sqlite3

需要sqlite3,Debian发行版本Linux上可以这样安装:

1
sudo apt-get install libsqlite3-dev 

zlib

需要zlib,这个很重要用来处理文件

1
sudo apt-get install zlib1g-dev

libcurl

需要libcurl,用来调用curl:

1
sudo apt-get install libcurl4-openssl-dev

libpng&libjpeg

需要libpng和libjpeg,用来处理图片:

1
sudo apt-get install libpng-dev libjpeg-dev

oniguruma

需要oniguruma:

1
sudo apt-get install libonig-dev

libzip

需要libzip,用来生成和处理zip文件:

1
sudo apt-get install libzip-dev

配置

上面的配置依赖,全部安装好后,即可开始安装,在PHP源码目录(注意:一下信息需要修改):

  • –with-fpm-user:fpm进程属于的用户
  • –with-fpm-group:fpm进程属于的用户组

如果你在服务器上操作,建议创建一个www用户和www用户组:

1
2
3
4
5
6
# 创建一个www用户
sudo useradd www
# 创建一个www用户组
sudo groupadd www
# www用户归属于www用户组
sudo usermod -a -G www www

而如果你是树莓派上操作,可以直接把自带的pi用户,添加到一个用户组内,比如:

1
2
3
4
# 创建一个pi用户组
sudo groupadd pi
# pi用户归属于pi用户组
sudo usermod -a -G pi pi

假设,用户为pi,且用户组也为pi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
./configure \
--prefix=/usr/local/php7 \
--with-curl \
--with-mysqli \
--with-openssl \
--with-pdo-mysql \
--with-jpeg \
--enable-gd \
--enable-fpm \
--with-fpm-user=pi \
--with-fpm-group=pi \
--enable-bcmath \
--enable-xml \
--with-zip \
--enable-mbstring \
--enable-sockets \
--with-zlib \
--enable-fileinfo \
--enable-exif

其中:

  • prefix为PHP配置地址

等待Makefile生成完毕,并且没有错误:
检测完成
之后,我们进行编译安装即可。

编译安装

上面的configure配置没有问题,接下来就是编译和安装了,首先是编译:

1
make

这个时候,依照性能不同,编译时间也不同。注意:

  • 上文的configure配置要通过,否则编译可能缺少依赖。
  • 设备内存小于2G,一般需要添加SWAP才可能编译成功,否则可能内存泄露,导致编译失败。

编译完成

编译通过,我们就不测试了,直接安装:

1
sudo make install

编译安装完成

测试运行

因为还没有注册为服务,并且我们需要解决一些php-fpm初始化的问题;所以我们现在手动运行PHP的FPM试试,如果你的PHP配置地址也和我一样(/usr/local/php7),那么启动命令是其下路径的sbin/php-fpm

1
sudo /usr/local/php7/sbin/php-fpm

一般都有初始化问题,比如:

1
2
3
[14-Aug-2021 09:19:48] ERROR: failed to open configuration file '/usr/local/php7/etc/php-fpm.conf': No such file or directory (2)
[14-Aug-2021 09:19:48] ERROR: failed to load configuration file '/usr/local/php7/etc/php-fpm.conf'
[14-Aug-2021 09:19:48] ERROR: FPM initialization failed

fpm启动错误
解决方法很简单,我们把php-fpm的默认配置激活即可:

1
2
sudo mv /usr/local/php7/etc/php-fpm.conf.default /usr/local/php7/etc/php-fpm.conf
sudo mv /usr/local/php7/etc/php-fpm.d/www.conf.default /usr/local/php7/etc/php-fpm.d/www.conf

之后即可启动。如果不确定是否启动,可以用lsof命令进行检测:

1
sudo lsof -i:9000

fpm启动错误

这样安装的PHP-fpm,只能这样启动。如果需要注册为systemctl服务,可以看看后文的服务注册。可以实现快捷启动和开机自启。

Nginx

Nginx官方下载地址:http://nginx.org/en/download.html,我们选择最新的稳定版本进行安装,最新的稳定版本是nginx-1.20.1。下载到服务器后,使用tar对其解压,并进入这个目录,准备开始编译:

1
2
wget 'http://nginx.org/download/nginx-1.20.1.tar.gz'
tar -xf nginx-1.20.1.tar.gz

下载Nginx源码
参考编译参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
./configure \
--prefix=/usr/local/nginx \
--user=pi \
--group=pi \
--sbin-path=/usr/local/nginx/sbin/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--with-file-aio \
--with-threads \
--with-http_addition_module \
--with-http_auth_request_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_mp4_module \
--with-http_random_index_module \
--with-http_realip_module \
--with-http_secure_link_module \
--with-http_slice_module \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_v2_module \
--with-mail \
--with-mail_ssl_module \
--with-stream \
--with-stream_realip_module \
--with-stream_ssl_module \
--with-stream_ssl_preread_module

当然,还建议添加模块:

1
2
--add-module=#PATH_TO_FANCYINDEX
--add-module=#PATH_TO_WEBDAV_EXT

其中:

  • #PATH_TO_FANCYINDEX:Fancyindex模块
  • #PATH_TO_WEBDAV_EXT:Webdav模块

为了达成以上编译配置,还有模块,接下来我们安装依赖。

宝塔安装的方法,无法安装--add-module=#PATH_TO_WEBDAV_EXT

安装依赖

编译Nginx需要gcc+的环境支持,build-essential内包含gcc+套件,所以我们安装build-essential即可:

1
sudo apt-get install build-essential

因为nginx.conf中使用了正则表达式,所以编译Nginx时就需要把PCRE库编译进Nginx:

1
sudo apt-get install libpcre3 libpcre3-dev

当热,Nginx编译过程和Http相应过程还需要gzip格式的压缩,所以我们还需要安装zlib库用于对HTTP包的内容做gzip格式的压缩,可以这样安装:

1
sudo apt-get install zlib1g-dev

最后,现在SSL协议很重要,Chrome等主流浏览器,都开始默认相应HTTPS了,所以OpenSSL编译环境也很重要:

1
sudo apt-get install openssl libssl-dev

额外模块

为了更好的体验,我们安装额外的模块:
额外模块

Fancyindex

如果我们需要进行目录映射,需要更好看的、更实用的目录映射,需要额外的Fancyindex模块支持:ngx-fancyindex:https://github.com/aperezdc/ngx-fancyindex

WebDav

Nginx自带的Webdav支持不完善,需要额外的模块进行支持:nginx-dav-ext-module:https://github.com/arut/nginx-dav-ext-module
为此,需要安装依赖:

1
2
sudo apt-get install libxml2-dev
sudo apt-get install libxslt-dev

配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
./configure \
--prefix=/usr/local/nginx \
--user=pi \
--group=pi \
--sbin-path=/usr/local/nginx/sbin/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--with-file-aio \
--with-threads \
--with-http_addition_module \
--with-http_auth_request_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_mp4_module \
--with-http_random_index_module \
--with-http_realip_module \
--with-http_secure_link_module \
--with-http_slice_module \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_v2_module \
--with-mail \
--with-mail_ssl_module \
--with-stream \
--with-stream_realip_module \
--with-stream_ssl_module \
--with-stream_ssl_preread_module

如果你安装额外模块获得更好体验:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
./configure \
--prefix=/usr/local/nginx \
--user=pi \
--group=pi \
--sbin-path=/usr/local/nginx/sbin/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--with-file-aio \
--with-threads \
--with-http_addition_module \
--with-http_auth_request_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_mp4_module \
--with-http_random_index_module \
--with-http_realip_module \
--with-http_secure_link_module \
--with-http_slice_module \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_v2_module \
--with-mail \
--with-mail_ssl_module \
--with-stream \
--with-stream_realip_module \
--with-stream_ssl_module \
--with-stream_ssl_preread_module \
--add-module=/usr/local/src/NginxModule/nginx-dav-ext-module \
--add-module=/usr/local/src/NginxModule/ngx-fancyindex

Nginx配置通过

编译安装

上面的configure配置没有问题,接下来就是编译和安装了,首先是编译:

1
sudo make

这个时候,依照性能不同,编译时间也不同。注意:

  • 上文的configure配置要通过,否则编译可能缺少依赖。

Nginx安装通过

编译通过,我们就不测试了,直接安装:

1
sudo make install

Nginx安装通过

测试运行

因为还没有注册为服务,所以我们现在手动运行Nginx试试,如果你的Ngixn配置地址也和我一样(/usr/local/nginx),那么启动命令是:

1
sudo /usr/local/nginx/sbin/nginx

正常是没有信息返回的,但是如果你有报错,那就有问题了,比如:

1
nginx: [emerg] mkdir() "/var/cache/nginx/client_temp" failed (2: No such file or directory)

这个问题很简单,是因为我编译安装时候,选择Nginx的缓存地址是/var/cache/nginx,但是Linux上并没有存在这个地址,我们需要手动创建:

1
sudo mkdir /var/cache/nginx

之后就可以运行,如果你不放心,还可以使用lsof命令查看:

1
sudo lsof -i:80

Nginx测试运行

配置_h5ai

H5AI,其实全称是:HTML5 Apache Index。最初是用来在Apache Web服务器上,完成资源映射,但是后来适配到Nginx等其他平台。配置很简单:下载_h5ai-修改Nginx配置文件-开始使用
注意_h5ai的映射逻辑:

1
2
3
4
网站根目录(需要映射的目录)
├─ _h5ai
├─ 你的其他文件1
└─ 你的其他文件1

下载_h5ai

因为是开源的工具,所以网上有很多修改版本,包含官方的:

  • 官方版本:官方的版本,功能全、稳定。
  • Dplayer版本:基于官方旧版本开发,支持更多格式的在线视频播放。
  • Mintimate’s _h5ai:基于Dplayer版本并合并官方最新版本代码。

我作为Mintimate’s _h5ai的开发者,当然是选择这个这位演示,在自己需要映射的文件夹内,输入:

1
2
git clone https://github.com/Mintimate/h5ai_M
mv h5ai_M/_h5ai _h5ai

克隆到映射目录

映射的文件夹,Nginx所属用户需要有读写权限。比如:我映射的下载站是/home/pi/Downloads、Nginx所属pi用户,pi用户有/home/pi/Downloads目录的读写权限。

修改Nginx配置

如果你的Nginx配置和我一样,那么需要修改/usr/local/nginx/nginx.conf,我们对其备份:

1
sudo mv /usr/local/nginx/nginx.conf /usr/local/nginx/nginx.conf.BAK

之后新建一个配置文件(可以使用vim命令新建),可以参考我的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
user  pi;
worker_processes 1;
events {
worker_connections 1024;
}


http {
include mime.types;
default_type application/octet-stream;

sendfile on;

keepalive_timeout 65;

gzip on;

server {
listen 80;
server_name localhost;
root /home/pi/Downloads;


location / {
index index.html index.htm /_h5ai/public/index.php;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}


# php-fpm配置
location ~ [^/]\.php(/|$){
# try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
include fastcgi.conf;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
}
}
}

之后进行重载即可:

1
sudo /usr/local/nginx/sbin/nginx -s reload

最后,我们可以通过浏览器访问_h5ai的映射目录:
访问_h5ai
默认:

  • 用户名:admin
  • 密码:admin

当然,这个时候_h5ai可能有问题或者功能不完整,我们需要再验证是否缺少依赖。

开始使用

正式使用前,我们来看看是否缺少依赖,登陆后,我们进入的地址_h5ai/public/index.php,这个界面是没有密码的,直接点击登陆:
访问_h5ai依赖
如果你是按我教程来的,只有以下几个需要配置:
缺少的依赖
很简单,到SSH内输入:

1
sudo apt-get install ffmpeg imagemagick 

安装的依赖
回到_h5ai/public/index.php内,即可看到全绿了。

Tips

h5ai个性化设置有一些个性化设置,可以开启嗷。
依赖于PHP的JIT(及时编译),以下配置不需要重启PHP FPM服务或Nginx。

1. 设置中文

h5ai个性配置中110n为语言选项,可以选语言在_h5ai/private/conf/l10n内,这里我们设置成中文,更改us为zh-cn:

1
2
3
4
5
"l10n": {
"enabled": true,
"lang": "zh-cn",
"useBrowserLang": true
},

更改结果

2. 二维码

可以通过扫码的方式下载文件(其实就是文件直链生成二维码)。在配置文件中“info”项为true时,激活(当前版本都是默认激活的了)。

1
2
3
4
5
6
7
"info": {
"enabled": true,
"show": true,
"qrcode": true,
"qrFill": "#999",
"qrBack": "#fff"
},

打开侧栏信息按钮后,把鼠标悬停在文件上就可以看见h5ai右侧显示文件类型和二维码,手机扫码就可以下载文件。

3. 复选打包

h5ai个性配置中select为复选功能,默认为开启:

1
2
3
4
5
"select": {
"enabled": true,
"clickndrag": true,
"checkboxes": true
},

复选打包,默认为tar压缩包,如果想改为zip压缩包,更改h5ai个性配置中download:

1
2
3
4
5
6
"download": {
"enabled": true,
"type": "shell-zip",
"packageName": null,
"alwaysVisible": false
},

其中,type可选:”php-tar“, “shell-tar“ or “shell-zip“。

4. 搜索

h5ai个性配置``中search`为搜索功能,开启后即可搜索当前文件夹下的文件(递归式):

1
2
3
4
5
6
"search": {
"enabled": true,
"advanced": true,
"debounceTime": 300,
"ignorecase": true
},

配置下载器

如果只配置了_h5ai,距离NAS基本算完成一大步了。但是,我认为还需要配置下载器,能把网上资源,直接下载到服务器才算是NAS。
这里我们使用Aria2作为下载器。

配置Aria2

这个再熟悉不过了吧。看过我们教程的小伙伴应该都了解,如果是新朋友,还能坚持看到这里,可以到这里了解一下:

为了简化过程,我们这里使用我的一键脚本进行搭建:

脚本一键安装

测试使用

这个时候,我们本地就可以使用Aria2的RPC进行下载了,首先Linux服务器上启动Aira2:

1
2
cd ~
./aria2.sh

启动Aria2
之后,使用本地RPC传递:
RPC传递
可以看到,视频就下载好了:
下载完成
到h5ai里,也可以播放和下载:
预览
播放

Nginx插件

如果你刚刚有安装Fancyindexwebdav-ext插件,那么,还可以解锁更多技能,来完善我们的小型NAS。通过这两个插件,可以让Linux上的目录,作为Webdav外部目录,给macOS和Windows进行挂载,方便文件的上传和下载等。

设置Webdav目录

我们打开Nginx的配置文件,在server内追加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 以下为Webdav模块,如果没有安装Webdav模块,不需要填写
location ^~/webdav{
set $dest $http_destination;
if (-d \$request_filename) {
rewrite ^(.*[^/])$ $1/;
set $dest $dest/;
}
if ($request_method ~ MKCOL) {
rewrite ^(.*[^/])$ $1/ break;
}
# 映射目录
alias /home/pi/Downloads/;
autoindex on;
# Webdav设置
dav_methods PUT DELETE MKCOL COPY MOVE;
dav_ext_methods PROPFIND OPTIONS;
create_full_put_path on;
# 最大上传文件
client_max_body_size 3G;
dav_access user:rw group:rw all:rw;
auth_basic "Authorized Users Only";
# 验证用户
auth_basic_user_file webdavpasswd;
}

之后,重载Nginx的配置文件。因为我们设置了验证用户,所以还需要创建webdavpasswd这个验证文件。如果不需要验证,可以删除这一项,就可以使用本地的Webdav客户端访问了。

设置验证用户

因为我们安装了openssl,可以直接用openssl来生成验证用户的密码:

1
openssl passwd #密码

比如,我们生成一个2000作为密码:
生成密码
之后,复制生成的密码,创建webdavpasswd这个文件:

1
vim /usr/local/nginx/webdavpasswd

修改密码

客户端登陆

macOS和Windows的文件管理器都可以登录,但是功能不全(无法上传),这里推荐:

以上软件,个人使用免费版本就可以了:
本地连接

系统服务注册

什么是系统服务器注册呢?其实就是设置为systemctl进程。设置好systemctl进程后,我们可以把服务器交给系统去自动处理,比如:允许Aria2开机自启、Nginx开机自启。下面就教大家设置。

1. 创建配置文件

Systemd默认从目录/etc/systemd/system/读取配置文件。但是里面存放的大部分文件都是符号链接,指向目录/usr/lib/systemd/system/,真正的配置文件存放在那个目录。比如:我们创建一个Nginx的服务

1
vim /usr/lib/systemd/system/nginx.service

2. 编写配置文件

参考配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
- Unit
- Description,服务的描述
- Documentation,文档介绍
- After,该服务要在什么服务启动之后启动,比如Mysql需要在network和syslog启动之后再启动
- Install
- WantedBy,值是一个或多个Target,当前Unit激活时(enable)符号链接会放入/etc/systemd/system目录下面以Target名+.wants后缀构成的子目录中
- RequiredBy,它的值是一个或多个Target,当前Unit激活(enable)时,符号链接会放入/etc/systemd/system目录下面以Target名+.required后缀构成的子目录中
- Alias,当前Unit可用于启动的别名
- Also,当前Unit激活(enable)时,会被同时激活的其他Unit
- Service
- Type,定义启动时的进程行为。它有以下几种值。
- Type=simple,默认值,执行ExecStart指定的命令,启动主进程
- Type=forking,以 fork 方式从父进程创建子进程,创建后父进程会立即退出
- Type=oneshot,一次性进程,Systemd 会等当前服务退出,再继续往下执行
- Type=dbus,当前服务通过D-Bus启动
- Type=notify,当前服务启动完毕,会通知Systemd,再继续往下执行
- Type=idle,若有其他任务执行完毕,当前服务才会运行
- ExecStart,启动当前服务的命令
- ExecStartPre,启动当前服务之前执行的命令
- ExecStartPost,启动当前服务之后执行的命令
- ExecReload,重启当前服务时执行的命令
- ExecStop,停止当前服务时执行的命令
- ExecStopPost,停止当其服务之后执行的命令
- RestartSec,自动重启当前服务间隔的秒数
- Restart,定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
- TimeoutSec,定义 Systemd 停止当前服务之前等待的秒数
- Environment,指定环境变量

比如,我们创建nginx.service配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=nginx
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Nginx配置文件

3. 生效配置文件

首先,我们运行配置文件生效,并允许开机自动启动。比如,我们生效nginx.service配置文件::

1
sudo systemctl enable nginx 

之后,使用start命令即可启动:
Nginx配置生效

4. Demo

很多小伙伴systemctl使用不熟练,这里给大家提供以下模版,如果是按本篇文章部署的PHP和Aria2,可以直接套用。

① PHP-FPM

1
sudo vim /usr/lib/systemd/system/php-fpm.service

配置内容:

1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=php-fpm
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/php7/sbin/php-fpm
PrivateTmp=true

[Install]
WantedBy=multi-user.target

允许开机启动并激活:

1
sudo systemctl enable php-fpm

② Aria2

1
sudo vim /usr/lib/systemd/system/aria2.service

配置内容:

1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=Aria2
After=network.target

[Service]
Type=forking
ExecStart=/etc/aria2/aria2c --conf-path=/etc/aria2/aria2.conf
PrivateTmp=true

[Install]
WantedBy=multi-user.target

允许开机启动并激活:

1
sudo systemctl enable aria2

END

这样,简单的个人NAS就搭建好了;兼备在线查看浏览和离线下载功能~~


若对文章很感兴趣,可以B站关注我ヾ(≧▽≦*)o

点击跳转“爱发电”页面(○` 3′○)