分类目录归档:Linux

关于 SSH Key 使用的一些注意事项

SSH 使用 pubkey 认证方式自动登陆的安全性要求其实比想象中严格很多,除此之外配置也有很多讲究,目前遇到的几点简单列举如下:

  • 关于 private key 及其路径的权限
    • /home/<username> 目录为 700
    • /home/<username>/.ssh 目录为 700
    • /home/<username>/.ssh/authorized_keys 为 600
    • /home/<username>/.ssh/<privateKey> 为 600
  • 关于 SSH 的配置文件
    • SSH 登陆全局配置文件:/etc/ssh/ssh_config
    • SSH 单用户配置文件:/home/<username>/.ssh/config
    • 如果用 sudo 命令执行 ssh,相当于对于 ssh 命令使用了 root 或对应用户的环境,应在对应的 home 目录下放置相应的 privateKey 和 config

Online Dedibox IPv6 配置

Online 的 IPv6 配置真是不一般地蛋疼,官方文档上面那个 DHClient6 完全不能用,在 U2 上有人推荐使用 Dibbler,但是在上一台挂掉的盒子上也还是不好用,平均三天会挂掉一次。在最新的一台盒子上尝试放弃 Online 自己的 IPv6 线路,使用 HE 的 TunnelBroker,然而根本没办法加载网络设备,我也是没有任何办法。

现在又找到了一版 DHClient6 配置,记录如下:

将如下内容写入 /etc/network/interfaces

iface eno1 inet6 static
  address <one IPv6 address from your block from Online>
  netmask 56
  accept_ra 1
  pre-up /sbin/dhclient -1 -v -pf /run/dhclient6.eno1.pid -lf /var/lib/dhcp/dhclient6.eno1.leases -cf /etc/dhcp/dhclient6.conf -6 -P eno1

创建 /etc/dhcp/dhclient6.conf

interface "eno1" {
  send dhcp6.client-id <your DUID for the subnet>;
  request;
}

之后运行 systemctl reload-or-restart networking.service

按照我之前的经历,DHClient6 获得的 IPv6 地址只能存活 12 小时,所以我先继续配置,等待 12 小时之后再来更新。

更新:已经将近 24 小时,目前 IPv6 仍然存活,认为配置成功。

从零开始的盒子:Online Dedibox 盒子配置记录

讲真,我也记不得这是我第几次配盒子了,但是这次我的主力盒子 & 杂活独立服务器挂掉还是给我造成了很大的损失。一方面,我损失了所有的盒子配置,包括澄空学园字幕组和 LoliHouse 的公网分流记录和文件,还有一些刷 PT 的环境;另一方面,我损失了虚拟机上的 Windows 压制环境;还有一些特定用途的杂活类服务,比如 Node.js 环境、Python / Anaconca 环境等等。为了以后维护方便,也为了给有同样需求的人一个参考,我在这里记录一下配置的历程。

先说点别的吧,关于这个盒子为什么会突然挂掉。起因是昨天(2017 年 10 月 9 日)下午至晚上,某国的大型网络过滤系统突然发威,在全国范围内干掉了我盒子的 IP 地址,我就很奇怪,我盒子一不做代理、二不放网站,就几个 BT 客户端的 WebUI 跑在上面,怎么就无缘无故给我过滤掉了。发现了 IP 问题之后,我尝试订购了一个 Failover IP 地址作为备用 IP。在配置的时候,由于我想要把这个 IP 作为我的主 IP 而改动了路由表,然后就被上级交换机锁了网络端口,与客服沟通之后,由于问题在短时间内无法解决,进而选择换机,我也丢失了所有数据。

先整理一下大致需求:

  1. Server As a Seedbox
    1. Update Kernel & BBR & BBR_powered
    2. Deluge ( Main BT/PT Client )
    3. Transmission ( Secondary PT Client )
    4. UTserver ( Specialized BT Client for SumiSora_Initial )
    5. Tixati ( Specialized BT Client for SumiSora_Main )
    6. qBittorrent ( Specialized BT Client for LoliHouse )
    7. Jailed SSH User ( For SumiSora_Initial SFTP Upload )
    8. SSHFS (Map Wishosting Stroage KVM Disk, not decided yet; maybe let Tixati work on this disk )
  2. Server As an Encoding Server
    1. VMware WorkStation
    2. gcc6
    3. Windows 7 & Activation
    4. Runtime Library
    5. Python & VapourSynth
    6. BaiduNetDisk
  3. Server As a Computer
    1. Node.js Http Server
    2. Anaconda Environment in Windows VM
    3. IPv6 Configuration
    4. Xfce & VNCserver
    5. Wine
    6. Firefox
  4. Server As a Storage Box
    1. Jailed SSH User ( Website Backup )

接下来开始安装:

  • 系统安装

系统仍然选择了我熟悉的 Ubuntu 16.04 LTS Server,由于我的服务器硬盘是 SoftRaid,在配置的时候还遇到了一些问题。最主要的问题就是 SWAP 分区不能使用 RAID0,如果这么选择安装操作系统就会报错。

  • 预配置及软件源添加
sudo apt-get install python-software-properties software-properties-common
sudo add-apt-repository ppa:transmissionbt/ppa
sudo add-apt-repository ppa:deluge-team/ppa
sudo add-apt-repository ppa:qbittorrent-team/qbittorrent-stable
curl -sL https://deb.nodesource.com/setup_9.x | sudo -E bash -
sudo dpkg --add-architecture i386 
wget -nc https://dl.winehq.org/wine-builds/Release.key 
sudo apt-key add Release.key 
sudo apt-add-repository https://dl.winehq.org/wine-builds/ubuntu/
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
  • 安装一系列软件
sudo apt update
sudo apt install xfce4 vnc4server deluged deluge-web qbittorrent transmission-daemon sshfs nodejs firefox build-essential fonts-noto gtk3-engines-xfce xfce4-goodies xfce4-power-manager
sudo apt-get install --install-recommends winehq-stable
sudo apt-get install gcc-7 g++-7
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 60 --slave /usr/bin/g++ g++ /usr/bin/g++-7
sudo update-alternatives --config gcc
  • Kernel Update & BBR_powered

在 http://kernel.ubuntu.com/~kernel-ppa/mainline/ 上下载 4.11 版本的内核,4.12 存在 VirtIO 方面的 bug,4.13+ 无法适配 BBR_powered 模块,所以采用 4.11.12

wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.11.12/linux-headers-4.11.12-041112_4.11.12-041112.201707210350_all.deb
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.11.12/linux-headers-4.11.12-041112-generic_4.11.12-041112.201707210350_amd64.deb
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.11.12/linux-image-4.11.12-041112-generic_4.11.12-041112.201707210350_amd64.deb
sudo dpkg -i linux*.deb
sudo update-grub
sudo reboot

wget -O ./tcp_tsunami.c https://down.gloriousdays.pw/Tools/tcp_tsunami.c
echo "obj-m:=tcp_tsunami.o" > Makefile
make -C /lib/modules/$(uname -r)/build M=`pwd` modules CC=/usr/bin/gcc
sudo cp tcp_tsunami.ko /lib/modules/$(uname -r)/kernel/drivers/
echo 'tcp_tsunami' | sudo tee -a /etc/modules
sudo depmod
sudo modprobe tcp_tsunami
sudo bash -c "echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf"
sudo bash -c "echo "net.ipv4.tcp_congestion_control=tsunami" >> /etc/sysctl.conf"
sudo sysctl -p
  • IPv6 配置

鉴于 Online 的蛋疼实现,另起一篇在这里

  • BT 客户端配置
sudo systemctl stop transmission-daemon.service
sudo vi /var/lib/transmission-daemon/info/settings.json
#Change the following lines to the content that you want
"rpc-password": "{62b16db87b89a91dd49a5110a7cafc06d20eb4f2wtK6kqPj",
"rpc-username": "transmission",
"rpc-whitelist": "*",
"umask": 2,

一、utserver
这个比较简单

前往utserver的官网: http://www.utorrent.com/downloads/linux 下载编译好的程序
文件名一般是utserver.tar.gz
注意适用的发行版。

目前最新的3.3已经可用。

部署:
sudo tar xvzf utserver.tar.gz -C /opt/

#释放到opt目录

sudo chmod -R 777 /opt/utorrent-server-alpha-v3_3/
#给予目录权限,这里的目录名视情况而定。可以先敲sudo chmod -R 777 /opt/ut 再按下TAB自动补全

sudo ln -s /opt/utorrent-server-alpha-v3_3/utserver /usr/bin/utserver

#链接可执行文件,建立快捷方式。目录名问题同上。
utserver -settingspath /opt/utorrent-server-alpha-v3_3/
#(测试)运行。目录名问题同上。

如果这是没有出错提示,恭喜已经成功了
访问 [server_ip]:8080/gui 登陆webui
用户名 admin, 密码为空
登陆后开始设置

如果提示libssl.so package missing
运行
sudo apt-get install libssl0.9.8:i386
#补全依赖

因为一旦登出,utserver -settingspath /opt/utorrent-server-alpha-v3_3 这个命令终止导致ut停止运行
可以使用tmux或者nohup后台运行
nohup utserver -settingspath /optutorrent-server-alpha-v3_3 >/dev/null 2>&1 &

[Unit]
Description=utserver
After=network-online.target

[Service]
ExecStart=/usr/bin/sudo -u <username> /path/to/utserver/bin -settingspath /path/to/utserver/dir/
ExecStop=kill -9 $(cat /run/utserver.pid)
Restart=always
PIDFile=/run/utserver.pid
TimeoutStopSec=300
RestartSec=3

[Install]
WantedBy=multi-user.target
  • VNCserver 配置

修改 ~/.vnc/xstartup 以启动 Xfce 桌面环境

#!/bin/sh

# Uncomment the following two lines for normal desktop:
# unset SESSION_MANAGER
# exec /etc/X11/xinit/xinitrc

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
#x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#x-window-manager &
startxfce4 &

修改 /usr/bin/vncserver 中 VNCserver 的配置,这个需要 root 权限

$geometry="1024x768"
$vncPort = 5900 + $displayNumber
$depth = 16 #(may cause problems with Windows VM if set to 24)
  • Jailed SSH User 进一步配置

由于我不想打开 SSH 的 Password Authentication, 但是 LNMP 脚本的备份又需要通过密码认证的 SSH 连接实现,因此寻找了可以打开单个用户的密码认证的方法:

在 /etc/ssh/sshd_config 中写入如下代码块即可

Match User <username1>,<username2>
    PasswordAuthentication yes
Match all  #This line is to end the match block
  • systemd 自启动脚本的设定

参照之前我写的这篇文章和 SSHFS 设置的这篇文章

Ubuntu 16.04 上 SSHFS 的配置

为什么要想起来折腾 SSHFS,这个就说来话长了。简单地说,就是买到了 Treudler 家 1TB 硬盘 10 欧/季度的 VPS,鉴于之前在上面跑 Deluge 被商家封过一次,现在我又好死不死想再折腾一次。但是呢,OpenVZ 架构的 VPS 上面跑的程序对于用户来说是毫无隐私可言的,因此运行 BT 客户端是不可能的了,因此想到了将它的硬盘挂载到其他 VPS,然后进行下载的做法。

经过一番查找,我最终选定了 SSHFS 的方案。选择这个方案的理由主要是无需在客户端,即 Treudler VPS 一方进行任何额外配置,只需要有基本 SSH 能力即可,最大程度减少在 OpenVZ 上折腾被商家刻意针对的可能性。此外,SSH 连接是加密的,商家也不会知道我在他们的 VPS 上进行大量的 BT 操作,唯一需要注意的可能是硬盘的使用,这一点会不会被商家封停还有待观察。

SSHFS 的配置很简单,在需要挂载的一方执行 apt install sshfs 即可获得所有需要的软件包。需要注意的一点是,SSHFS 基于 SFTP 实现,这不可避免存在一个登陆的问题,这个可以通过生成 SSH Key 自动登陆的方法解决,具体命令如下:

ssh-keygen -t rsa  #make a ssh key pair under ~/.ssh/, usually the name is "id_rsa" and "id_rsa.pub"

然后将 id_rsa.pub 中的内容写入被挂载一方的 ~/.ssh/authorized_key 文件中,将 /etc/ssh/ssh_config 文件拷贝一份存为 ~/.ssh/config,然后写入相应的私钥路径:IdentityFile   /path/to/your/private/key

这里需要注意的一点是,如果是本地上传私钥到 ~/.ssh/目录下,需要调整权限为 600,默认的 644 权限会导致 SSH 拒绝使用该私钥进行认证。

之后可以使用 sshfs 命令行工具实现挂载,我没有选择在 /etc/fstab 中写入挂载点的方法,而选择了 systemd 自启动脚本,脚本如下:

[Unit]
Description=SSHFS
After=network-online.target

[Service]
Type=forking
ExecStart=/usr/bin/sudo -u <username> /usr/bin/sshfs -o reconnect -o cache=yes -o follow_symlinks username@host:/path /mountpoint
ExecStop=/usr/bin/sudo -u <username> /bin/fusermount -u /mountpoint
ExecStartPre=-/usr/bin/sudo /bin/umount -l  /mountpoint
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

ExecStartPre 选项是为了强制清除挂载点上的任何东西,以一个干净的方式启动。

VMware 在 Ubuntu 上运行 Windows 虚拟机会造成 khugepaged CPU 高占用的问题

这个问题一直存在,没有很好的解决方法,是内核中 transparent huge page 不断尝试整理 vmware-vmx 申请的大量内存导致的。在 khugepaged 运行时会造成 VMware 虚拟机卡顿,且系统整体会非常慢。

可以在 /etc/rc.local 中写入如下代码关闭这个功能:

if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
   echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
   echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi

 

Ubuntu 14.04 部署 h5ai 目录列表程序

h5ai 是一个挺好用的 PHP 目录列表工具,相对于 Apache/nginx 的目录列表功能更加美观,简要记载安装过程如下:

  • 下载安装包

https://larsjung.de/h5ai/ 处下载最新的安装包,unzip 之后会得到一个 _h5ai 的文件夹,放入域名根目录

  • 修改 nginx 配置

在 vhost 的配置中做如下修改:

index  index.html  index.php  /_h5ai/public/index.php;
  • 查看 h5ai 配置

打开 http://YOUR-DOMAIN.TLD/_h5ai/public/index.php,应该会看到一系列的 yes/no 的状态,一般情况下,会发现两个 cache 目录还有一些预览的选项是 no

对于 cache 文件夹的权限问题:

cd _h5ai
chmod 666 private/cache 
chmod 666 public/cache

对于已安装 ffmpeg tar zip 等工具后仍然显示 no 的问题,这里需要调整 php 的禁用参数,删除 /usr/local/php/etc/php.ini 中 passthru exec scandir 三个函数

对于 PDF 预览的问题:

apt-get install aptitude
aptitude install imagemagick
  • 安装 ffmpeg

如果需要视频及音频文件预览,需要安装 ffmpeg,由于我的 VPS 是OpenVZ 架构的 Ubuntu 14.04,安装起来还有些折腾,记录如下:

add-apt-repository ppa:jonathonf/ffmpeg-3
add-apt-repository ppa:jonathonf/tesseract #(for Ubuntu 14.04 only)
apt update
apt upgrade
apt install libavfilter-extra6
apt install ffmpeg

 

参考资料:
https://bmzz.cf/blog/37.html
https://imeiji.github.io/2016/03/26/搭建h5ai文件服务器/
http://ubuntuhandbook.org/index.php/2017/05/install-ffmpeg-3-3-in-ubuntu-16-04-14-04/

部分 Seedbox 使用的 systemd 自动启动脚本

本文仅供记录使用,可能将合并入将来撰写的系列文章:”大刷子的养成方法“

所有脚本存放于 /etc/systemd/system 目录下

Deluge 及其 WebUI 的 SystemD 启动脚本:

[Unit]
Description=Deluged
After=network-online.target

[Service]
ExecStart=/usr/bin/deluged -d
ExecStop=/bin/kill -9 $(/bin/cat /run/deluged.pid)
Restart=always
PIDFile=/run/deluged.pid
TimeoutStopSec=300

[Install]
WantedBy=multi-user.target
[Unit]
Description=Deluge-web
After=network-online.target deluged.service
Wants=deluged.service

[Service]
ExecStart=/usr/bin/deluge-web
ExecStop=/bin/kill -9 $(/bin/cat /run/deluge-web.pid)
Restart=always
PIDFile=/run/deluge-web.pid

[Install]
WantedBy=multi-user.target

VNCserver 启动脚本:

[Unit]
Description=VNCserver
After=syslog.target network.target

[Service]
ExecStart=/usr/bin/sudo /usr/bin/vncserver :1
ExecStop=/usr/bin/sudo /usr/bin/vncserver -kill :1
ExecStartPre=-/usr/bin/sudo /usr/bin/vncserver -kill :1 > /dev/null 2>&1
Restart=always
Type=forking
#PIDFile=/run/vncserver.pid

[Install]
WantedBy=multi-user.target

OpenVZ 下 TunnelBroker 实现(借助 tb_tun 实现):

[Unit]
Description=ipv6tb
After=network-online.target

[Service]
Type=forking
ExecStart=/usr/bin/sudo /etc/init.d/ipv6tb start
ExecStop=/usr/bin/sudo /etc/init.d/ipv6tb stop
Restart=always

[Install]
WantedBy=multi-user.target

执行 systemctl enable <serviceName> 安装服务

写入完成之后,执行 systemctl daemon-reload 载入 service 文件,再使用 systemctl start <serviceName> 运行服务,或者重启测试

一些说明:

  • Type=forking 代表该启动脚本需要 systemd 跟踪 fork 出来的进程,在执行脚本的时候可能需要,以及 vncserver 这样需要启动桌面环境(其他进程)的启动项
  • VNCserver 采用 sudo 运行的原因是需要指定运行环境变量,如果直接运行 /usr/bin/vncserver 会有 vncserver: The HOME environment variable is not set. 的错误,为了方便直接指定 sudo 采用 root 环境运行
  • Systemd 脚本需要写绝对路径,不能写相对路径

Amazon AWS 配置 TensorFlow 与 Keras 环境记录

因为一些需求,需要在 AWS 上进行一些 GPU 的计算,按道理 AWS 已经提供了深度学习的 AMI 映像供我们使用,但是我实在是搞不清他到底做了些什么,因此也不怎么会用。加上自带各种用不到的库实在太大,为了放下我所有的数据需要开 80G 的 EBS 存储卷,感觉有些小贵,无奈之下只能从最干净的 Ubuntu 16.04 开始配置一台符合我需求的 EC2 实例。

具体步骤我打算按照 Keras 官方文档上的方案,由于我也不确定能不能搞定,这里就做一个实时的记录:

  • 配置 python 与 CUDA 环境,这个相对比较简单,需要注意一点的是 cuDNN 库需要在国内自己找,这个 CSDN 上有很多,文件名是 cudnn-8.0-linux-x64-v5.1.tgz 就好了。这一步我进行得十分顺利。
  • Keras 相关依赖包的安装,这里开始出现了问题
    • 首先安装 Anaconda,需要注意一点的是,Anaconda 安装包会将其自身路径写入 .bashrc,但是需要执行 source .bashrc 这条命令才能使 Anaconda 做的修改生效,这里一定要注意,不要认为是安装出了问题。完成之后运行 python,应该就会发现你的 python 已经是 Anaconda 发行版了。
    • 接下来 pip install –U –pre pip setuptools wheel 这步也出现了问题,执行 pip 后报错 “FileNotFoundError: [Errno 2] No such file or directory: ‘/home/ubuntu/anaconda3/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg’
      • 解决方案是这里,手工指定 setuptools 版本进行安装:pip install setuptools==27.2.0
    • 然后是安装 scipy numpy tensorflow-gpu keras 等一干所必要的包,安装一切顺利
    • 检查 TensorFlow 安装时再次出现问题,import tensorflow 出现 ImportError: libcudnn.so.6: cannot open shared object file: No such file or directory
      • 查询后发现,pip 默认安装是 tensorflow 1.3,这个版本需要 cuDNN 6.0,但是考虑到教程通用性需求,不选择升级到 tf 1.3,采用 pip install –U –pre tensorflow-gpu==1.2 命令强制安装 1.2 版本使用 cuDNN 5.1

之后的操作就相当顺利了,所有的操作都和本地类似,还是熟悉的东西好用啊。

由于我不需要现在就继续进行计算,因此在停止了实例之后,为其配置的环境创建一个 AMI,供下次继续计算时开启竞价型实例使用。

网站备份与 Jailed SSH User 的实现

之前在看一些 VPS 博客的时候经常看到这样的一句话:“任何服务商都不会永久稳定,要做好数据备份”,虽然我本人还没遇到跑路的 VPS 服务提供商,Scaleway 的东家 Online 也是存在了快十年的公司了,但这也不意味着备份就是不必要的,毕竟这不是 PT 盒子,关停了再配置一个也就是最多半天的事情,如果自己写了几年的文章,突然就因为什么不可抗力的原因全都没了,这种打击估计谁也受不了,因此在我在这个博客架设之初就必须考虑到备份的问题。

备份一般来说,有本地备份和异地离线灾备两种,本地一般是为了回滚使用,而异地离线灾备则是为了 VPS 完全挂掉的时候,仍然不至于丢失所有的数据。考虑到 LinuxEye 的 LNMP 一键包提供了本地和远程备份的脚本,因此我选择本地和异地都备份一份以在保证高可用性的同时的可靠性。

备份脚本的操作并不是很复杂,这里已经有了操作说明,在这里也不再赘述。略微需要记录的一点,则是 Jailed SSH User 的实现。

一键包中的远程备份,是在本地完成备份打包之后,通过 rsync over SFTP 的方式同步至远程服务器,因此在远程服务器上必须有相对应的 SSH 用户才能操作。这里自然就会引出一个问题,由于无论是密码还是密钥登录,都需要将其存储在 VPS 之上,而我们自然不希望有人窃取了密码或者私钥之后登录到我们的备份服务器,因此这个备份用户本身的访问权限就应该被限制,也就是 Jailed SSH User,简而言之,Jailed SSH User 就是一个访问权限受限于特定目录树的用户,即使密码或者密钥被人窃取,也不用担心会给宿主机造成任何危害。接下来就谈一谈具体的实现。

Jailed SSH User 的创建教程用 Google 可以搜索到很多,我最终采用的是 StackOverflow 上提供的 Jailkit 的方案。具体步骤记录如下:

  • 下载 Jailkit 源码,编译安装
Download & Install:

http://olivier.sessink.nl/jailkit/index.html#download

# cd /tmp
# wget https://down.gloriousdays.pw/Tools/jailkit-2.19.tar.gz
# tar -zxvf jailkit-2.19.tar.gz
# cd jailkit-2.19
# ./configure
# make
# make install
  • 设置 Jail 根目录并完成初始化
# mkdir /home/jail
# chown root:root /home/jail

# jk_init -v /home/jail basicshell
# jk_init -v /home/jail netutils
# jk_init -v /home/jail ssh
# jk_init -v /home/jail jk_lsh
  • 创建一个用户并设置密码
# useradd -d /home/testuser -m testuser -s /bin/bash
# passwd testuser
  • 使用 Jailkit 将创建的用户移入 Jail 环境,如果需要建立更多的 Jailed User,在建立用户之后从这步开始即可
# jk_jailuser -m -j /home/jail testuser

Your /etc/passwd should contain something like this now:
testuser:x:1001:1001::/home/jail/./home/testuser:/usr/sbin/jk_chrootsh
  • 使用 jk_cp 命令复制 Bash 相关 Binary 进入 Jail 环境
# jk_cp -v -f /home/jail /bin/bash
  • 最后再做一些小的修改,将默认 shell 从 lsh 改成 bash
Now edit the /home/jail/etc/passwd file and make sure it contains something like this:
testuser:x:1001:1001::/home/testuser:/bin/bash
  • 之后在网站 VPS 上设置好备份配置,将备份脚本添加进入 crontab 自动执行
crontab -e 
0 1 * * * cd ~/lnmp;./backup.sh  > /dev/null 2>&1 &

Done!

如果还需要做一些维护,可以这样:

By using jk_update updates on the real system can be updated in the jail. A dry-run will >show what’s going on:
# jk_update -j /home/jail -d

 

搭建 NextCloud 服务器

之前折腾那些个 Low End VPS 的时候,弄到过一款 CentexHosting 的大硬盘的VPS,然后正好最近折腾有需求,就准备搭一个私有云在上面。一般来说,碰到私有云第一反应可能都会是 OwnCloud / SeaFile,不过我为什么要用 NextCloud 呢,还是因为我比较懒,NextCloud 有在线一键安装包,就不用麻烦去折腾配置了。

整体安装还是比较简单的,首先使用 LinuxEye 家的 LNMP 安装包,添加一个 nginx 虚拟主机。在这里不得不佩服一下这个一键包的作者,几乎所有的事情都可以通过他提供的脚本完成,比如我需要使用 Let’s Encrypt 签发 SSL 证书,只要用他的 addon.sh 安装 certbot 以后,在 vhost.sh 添加虚拟主机时就可以自动签发对应的证书,同时也配置好了自动续期的功能,如果有读者有类似需求,我在这里强烈推荐使用这个一键包,可以解决很多问题。

接下来就在 NextCloud 官网上下载 Web-Installer,放在虚拟主机对应的数据文件夹中,使用 phpMyAdmin 创建供私有云使用的用户和数据库,授予权限之后,填写在安装页面就可以了。

#安装过程不算特别顺利,NextCloud 似乎无法和 LNMP 一键包默认安装的 Zend OPcache 共存(报错“PHP 被设置为移除内联块, 这将导致多个核心应用无法访问”),需要使用 memcache 进行缓存。如何关掉 Zend OPcache也费了我一番周折,最后在 /usr/local/php/etc/php.d/ 目录下找到了它的配置文件,opcache.enable=0 关掉了缓存。不过这个仍然存在一定的问题,因为 NextCloud 还是需要缓存的,这点先按下不表。

  • Update:关于这个问题,其实还是可以使用 Zend OPcache 的,需要将 /usr/local/php/etc/php.d/ext-opcache.ini (oneinstack专用)中改为 opcache.save_comments=1 ,因为默认是0,改完重启 php-fpm 即可。

安装完成之后,却出现了 index.php 被跳转到 index.php/app/files 并且找不到文件的问题,Google 一下之后,官方论坛有人提到可能是 nginx 配置的问题,于是我就去查看了官方建议配置,但是却出现了 502 Bad Gateway 的问题。经查询,这种一般出现于 nginx 和 php-fpm 进程通信之间,观察了官方的配置文件之后,发现了这样一段:

upstream php-handler {
    server 127.0.0.1:9000;
    #server unix:/var/run/php5-fpm.sock;
}

我突然意识到,官方的配置文档是针对 php5 制作的,而我安装的是 php7,可能问题就出现在这里。于是试着换成了 /usr/local/nginx/conf/nginx.conf 中的 php 用法:

upstream php-handler {
     #server 127.0.0.1:9000;
     #server unix:/var/run/php5-fpm.sock;
     server unix:/dev/shm/php-cgi.sock;
}

#在执行了 service nginx reload 之后,神奇地可以用了,我也暂时也搞不清这是为什么,能正常运行了也是一件好事。

  • Update:关于这个跳转的问题,我认为是 nginx 配置 rewrite 规则的问题,如果需要解决这样的问题,应该严格按照官方建议 nginx 配置中的内容调整 location 开头的那些配置行。如果需要解决安装后 Nextcloud 有关 http header 问题的报错,则需要添加官方建议配置中的 add-header。这些在 Linuxeye 的一键包生成的配置中都没有解决,需要手动添加。

以下列出官方建议配置:

upstream php-handler {
    server 127.0.0.1:9000;
    #server unix:/var/run/php5-fpm.sock;
}

server {
    listen 80;
    server_name cloud.example.com;
    # enforce https
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name cloud.example.com;

    ssl_certificate /etc/ssl/nginx/cloud.example.com.crt;
    ssl_certificate_key /etc/ssl/nginx/cloud.example.com.key;

    # Add headers to serve security related headers
    # Before enabling Strict-Transport-Security headers please read into this
    # topic first.
    # add_header Strict-Transport-Security "max-age=15768000;
    # includeSubDomains; preload;";
    #
    # WARNING: Only add the preload option once you read about
    # the consequences in https://hstspreload.org/. This option
    # will add the domain to a hardcoded list that is shipped
    # in all major browsers and getting removed from this list
    # could take several months.
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;

    # Path to the root of your installation
    root /var/www/nextcloud/;

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    # The following 2 rules are only needed for the user_webfinger app.
    # Uncomment it if you're planning to use this app.
    #rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
    #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json
    # last;

    location = /.well-known/carddav {
      return 301 $scheme://$host/remote.php/dav;
    }
    location = /.well-known/caldav {
      return 301 $scheme://$host/remote.php/dav;
    }

    # set max upload size
    client_max_body_size 512M;
    fastcgi_buffers 64 4K;

    # Enable gzip but do not remove ETag headers
    gzip on;
    gzip_vary on;
    gzip_comp_level 4;
    gzip_min_length 256;
    gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
    gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;

    # Uncomment if your server is build with the ngx_pagespeed module
    # This module is currently not supported.
    #pagespeed off;

    location / {
        rewrite ^ /index.php$uri;
    }

    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {
        deny all;
    }
    location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
        deny all;
    }

    location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+)\.php(?:$|/) {
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param HTTPS on;
        #Avoid sending the security headers twice
        fastcgi_param modHeadersAvailable true;
        fastcgi_param front_controller_active true;
        fastcgi_pass php-handler;
        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;
    }

    location ~ ^/(?:updater|ocs-provider)(?:$|/) {
        try_files $uri/ =404;
        index index.php;
    }

    # Adding the cache control header for js and css files
    # Make sure it is BELOW the PHP block
    location ~ \.(?:css|js|woff|svg|gif)$ {
        try_files $uri /index.php$uri$is_args$args;
        add_header Cache-Control "public, max-age=15778463";
        # Add headers to serve security related headers (It is intended to
        # have those duplicated to the ones above)
        # Before enabling Strict-Transport-Security headers please read into
        # this topic first.
        # add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
        #
        # WARNING: Only add the preload option once you read about
        # the consequences in https://hstspreload.org/. This option
        # will add the domain to a hardcoded list that is shipped
        # in all major browsers and getting removed from this list
        # could take several months.
        add_header X-Content-Type-Options nosniff;
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Robots-Tag none;
        add_header X-Download-Options noopen;
        add_header X-Permitted-Cross-Domain-Policies none;
        # Optional: Don't log access to assets
        access_log off;
    }

    location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ {
        try_files $uri /index.php$uri$is_args$args;
        # Optional: Don't log access to other assets
        access_log off;
    }
}

不过,NextCloud 服务端报告目前仍然存在一定的问题:

  • PHP模块’文件信息’丢失. 我们强烈建议启用此模块以便mime类型检测取得最佳结果.
  • “X-Frame-Options” HTTP 头部没有配置和 “SAMEORIGIN” 的一样。这是一个潜在的安全或者隐私风险,我们调整
  • 内存缓存未配置。如果可用,请配置 memcache 来增强性能。更多信息请查看我们的文档 。

之后我再考虑如何解决,解决了之后也会在这里更新。

Update: Memcached 配置

根据官方文档,我选择 redis 作为 cache 模块,在 <site root>/config/config.php 中添加如下字段即可:

'memcache.local' => '\OC\Memcache\Redis',
'memcache.locking' => '\OC\Memcache\Redis',
'redis' => array(
   'host' => 'localhost',
   'port' => 6379,
),

Update2:优化 php-fpm 内存占用

pm = ondemand
pm.max_children = 16
pm.start_servers = 11
pm.min_spare_servers = 8
pm.max_spare_servers = 16
pm.max_requests = 2048
pm.process_idle_timeout = 10s
request_terminate_timeout = 120
request_slowlog_timeout = 0

dd关于这个问题,如果 pm 配置为 dynamic 或者 static,php-fpm 会维护一个进程池,导致消耗大量内存,在小内存的 VPS 上,我们可以配置为 ondemand,就不需要那些额外开销了。