记录了自己使用树莓派期间的所有使用笔记记录-前人栽树后人乘凉也为了自己以后可以快速查找备忘。

Docker基本入门

docker基本安装

使用 APT 安装

由于 apt 源使用 HTTPS 以确保软件下载过程中不被篡改。因此,我们首先需要添加使用 HTTPS 传输的软件包以及 CA 证书。

1
2
3
4
5
6
7
8
9
$ sudo apt-get update

$ sudo apt-get install \
     apt-transport-https \
     ca-certificates \
     curl \
     gnupg2 \
     lsb-release \
     software-properties-common

鉴于国内网络问题,强烈建议使用国内源,官方源请在注释中查看。

为了确认所下载软件包的合法性,需要添加软件源的 GPG 密钥。

1
2
3
$ curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/raspbian/gpg | sudo apt-key add -
# 官方源
# $ curl -fsSL https://download.docker.com/linux/raspbian/gpg | sudo apt-key add -

然后,我们需要向 source.list 中添加 Docker CE 软件源:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ sudo add-apt-repository \
    "deb [arch=armhf] https://mirrors.ustc.edu.cn/docker-ce/linux/raspbian \
    $(lsb_release -cs) \
    stable"


# 官方源
# $ sudo add-apt-repository \
#    "deb [arch=armhf] https://download.docker.com/linux/raspbian \
#    $(lsb_release -cs) \
#    stable"

以上命令会添加稳定版本的 Docker CE APT 源,如果需要最新版本的 Docker CE 请将 stable 改为 edge 或者 test。从 Docker 17.06 开始,edge test 版本的 APT 源也会包含稳定版本的 Docker CE。

安装 Docker CE

更新 apt 软件包缓存,并安装 docker-ce

1
2
3
$ sudo apt-get update

$ sudo apt-get install docker-ce

一键安装docker到树莓派

1
sudo curl -sSL https://get.docker.com | sh

启动 Docker CE

1
2
$ sudo systemctl enable docker
$ sudo systemctl start docker

安装docker compose (可选)

1
2
3
4
5
6
7
8
9
您可以使用pip以下方法安装Docker Compose :

$ sudo pip install docker-compose

Hypriot提供了docker-composeRaspbian 的静态二进制。它可能并不总是最新的,但如果空间有限,你可能会觉得它很有用。要使用它,首先按照Hypriot 关于设置存储库的 说明,然后运行以下命令:

curl -s https://packagecloud.io/install/repositories/Hypriot/Schatzkiste/script.deb.sh | sudo bash

sudo apt-get install docker-compose

建立 docker 用户组

默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。

建立 docker 组:

1
$ sudo groupadd docker

将当前用户加入 docker 组:

1
$ sudo usermod -aG docker $USER

退出当前终端并重新登录,进行如下测试。

注意: ARM 平台不能使用 x86 镜像,查看 Raspbian 可使用镜像请访问 arm32v7

从官方打包好的deb包安装docker

Go to https://download.docker.com/linux/debian/dists/, choose your Debian version, browse to pool/stable/, choose either amd64 or armhf, and download the .deb file for the Docker CE version you want to install.

sudo dpkg -i /path/to/package.deb

docker 卸载

1
2
3
4
5
sudo apt-get purge docker-ce
apt-get purge docker-engine
apt-get autoremove # 自动删除依赖
rm -rf /var/lib/docker
sudo rm -rf /var/lib/docker

docker基本命令

docker 加速

对于使用 systemd 的系统,用 systemctl enable docker 启用服务后,编辑 /etc/systemd/system/multi-user.target.wants/docker.service 文件,找到 ExecStart= 这一行,在这行最后添加加速器地址 --registry-mirror=<加速器地址>,如:

1
ExecStart=/usr/bin/dockerd --registry-mirror=http://b6d1863d.m.daocloud.io
1
2
3
重新加载配置并且重新启动。
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

Linux系统下配置完加速器需要检查是否生效,在命令行执行 ps -ef | grep dockerd,如果从结果中看到了配置的 --registry-mirror 参数说明配置成功。

第二种方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
sudo nano /etc/docker/daemon.json
##粘贴下方内容修改加速地址
{
    "registry-mirrors": [
        "http://b6d1863d.m.daocloud.io"
    ],
    "insecure-registries": []
}
##重启服务
service docker restart

###官方一键配置
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s 加速地址

获取镜像

1
2
docker pull [选项] [Docker Registry地址]<仓库名>:<标签>
docker run -it --rm armhf/ubuntu #!/bin/bash 
  • -it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
  • --rm:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 --rm 可以避免浪费空间。
  • armhf/ubuntu:这是指用 armhf/ubuntu 镜像为基础来启动容器。
  • #!/bin/bash :放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 #!/bin/bash

进入容器后,我们可以在 Shell 下操作,执行任何所需的命令。这里,我们执行了 cat /etc/os-release,这是 Linux 常用的查看当前系统版本的命令,从返回的结果可以看到容器内是 Ubuntu 16.04.1 LTS 系统。

最后我们通过 exit 退出了这个容器。

列出镜像

1
docker images

中间层镜像

1
docker images -a

列出部分镜像

根据仓库名列出镜像

1
docker images ubuntu

列出特定的某个镜像,也就是说指定仓库名和标签

1
docker images armhf/ubuntu

以特定格式显示

1
2
$ docker images -q
5f515359c7f8

-f 过滤显示

1
2
docker images --format "{{.ID}}: {{.Repository}}"
5f515359c7f8: redis

以表格等距显示,并且有标题行,和默认一样

1
2
3
docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
IMAGE ID            REPOSITORY          TAG
5f515359c7f8        redis               latest
1
2
docker start stop 
exit 退出容器

GVM-Golang管理器

GVM,类似于ruby 中的RVM,java 中的jenv(国产),可用于方便管理 Go 的版本,它有如下几个主要特性:

  • 管理 Go 的多个版本,包括安装、卸载和指定使用 Go 的某个版本
  • 查看官方所有可用的 Go 版本,同时可以查看本地已安装和默认使用的 Go 版本
  • 管理多个 GOPATH,并可编辑 Go 的环境变量
  • 可将当前目录关联到 GOPATH
  • 可以查看 GOROOT 下的文件差异

Go 版本切换

二进制文件的管理比较简单,通过链接使用不同版本的程序即可,实际上主要是一些环境变量和标准库的设置问题,环境变量主要是 GOPATH 以及 GOROOT,标准库的话需要在切换 go 版本时也能跟着切换。gvm 实际上就是帮助完成这些配置工作。

安装

按照官方文档操作即可

1
2
3
bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
# or
zsh < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)

使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ gvm
Usage: gvm [command]

Description:
  GVM is the Go Version Manager

Commands:
  version    - print the gvm version number
  get        - gets the latest code (for debugging)
  use        - select a go version to use (--default to set permanently)
  diff       - view changes to Go root
  help       - display this usage text
  implode    - completely remove gvm
  install    - install go versions
  uninstall  - uninstall go versions
  cross      - install go cross compilers
  linkthis   - link this directory into GOPATH
  list       - list installed go versions
  listall    - list available versions
  alias      - manage go version aliases
  pkgset     - manage go packages sets
  pkgenv     - edit the environment for a package set

一般常规的操作是

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 先列一下看支持哪些版本
gvm listall

# 看下自己环境有哪些版本
gvm list

# 安装需要的版本,比如go1.8.3,加--default代表每次再进terminal时默认使用这个版本
gvm install go1.8.3 [--default]

# 然后看下是否成功
go version
go env

几点注意

  • 在 Linux 下安装 GVM,需要安装相关依赖,详情见官网说明,或者执行以下命令

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    Debian/Ubuntu
    
    sudo apt-get install curl git mercurial make binutils bison gcc build-essential
    
    Redhat/Centos
    
    sudo yum install curl
    sudo yum install git
    sudo yum install make
    sudo yum install bison
    sudo yum install gcc
    sudo yum install glibc-devel
    
    FreeBSD Requirements
    
    sudo pkg_add -r bash
    sudo pkg_add -r git
    sudo pkg_add -r mercurial
    
  • GVM 官方显示没对 Windows 做支持,考虑到 Windows 不是程序员的标配吧(有同学回复用 git-windows客户端,自带bash功能,可以自行尝试安装下)。

  • GVM 安装新版本之后,Go 环境变量会重新设置,为了节约磁盘空间和时间,建议把之前版本的 GOPATH 内容移动到新版本对应的 GOPATH 目录下,相关路径可以通过 go env 获取

  • 在同一版本下,用 gvm pkgset 创建多个 GOPATH,可能会占用你比较大的磁盘空间

  • 使用 gvm implode 需谨慎

  • GVM 是用 shell 编写

NVM-NodeJS管理器

安装脚本

要安装或更新nvm,可以使用cURL 使用安装脚本

1
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash

或Wget:

1
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash

再执行

1
source .bashrc

验证安装

要验证是否已安装nvm,请执行以下操作:

1
command -v nvm

如果安装成功,应输出’nvm’。请注意,这是which nvm行不通的,因为nvm是一个源代码的shell函数,而不是一个可执行的二进制文件。

使用 nvm 安装 Node.js

以下操作都是在“终端”窗口中完成。

安装指定版本的 Node.js

我们可以通过以下 nvm 命令在线安装指定版本的 Node.js。

1
nvm install [nodeversion]

例如,需要安装 v6.9.1 版本的 Node.js,那可以通过以下命令完成。

1
nvm install v9.3.0

指定当前使用的 Node.js 版本

通过 nvm 可以同时安装多个版本的 Node.js,我们可以指定某个版本的使用。

1
nvm use [nodeversion]

例如,需要使用 v6.9.1 版本的 Node.js,那可以通过以下命令完成。

1
nvm use v9.3.0

查看当前安装的 Node.js 版本列表

由于通过 nvm 可以安装多个 Node.js,版本多了不好管理。我们还可以随时查看当前安装了哪些 Node.js 的版本。

1
nvm ls

nvm 的其他命令

nvm 还提供一些命令,方便我们平时管理 Node.js 的版本。

  • nvm uninstall [nodeversion]: 表示删除指定版本的 Node.js,用法类似于 install 命令。
  • nvm current: 表示显示当前使用的 Node.js 版本。
  • nvm reinstall-packages [npmversion]: 表示在当前的 Node.js 版本下,安装指定版本的 npm 包管理器。

安装多个版本 Node.js 的意义

自从 Node.js 基金会成立,Node.js 就有一个发布计划,就是同时存在两个发布版本:稳定版和试验版。

在 Node.js 中,带有长期支持(LTS)的稳定版是以偶数开始(4,6,8…),而试验版是从奇数开始(5, 7…)。我们推荐在生产环境中用 LTS 版本,而用试验版尝试新东西。

国内环境的问题

由于国内在一些情况下有些特殊。Node.js 官方镜像源又在国外,经常通过 nvm 安装 Node.js 时,速度比较慢,或者没有响应。

根据这种情况,nvm 允许更改安装的镜像源,我们可以将镜像源切换到国内的淘宝提供的镜像源。

nvm 软件切换镜像源

根据 nvm 官方提供的帮助文档,我们可以通过以下命令进行切换。

1
export NVM_NODEJS_ORG_MIRROR="http://npm.taobao.org/mirrors/node"

http://npm.taobao.org/mirrors/node 是 淘宝NPM镜像 提供的国内 Node.js 的安装镜像源。

**值得注意的是:**这种方式,在每次重启“终端”会失效。也就是说,每次打开“终端”都需要执行上述命令。

如果并不想每次打开“终端”,都需要重新设置 NVM_NODEJS_ORG_MIRROR 环境变量。

  • 如果“终端”使用的是 bash Shell 的话向 ~/.bash_profile 文件(如果没有,会自动创建)增加以下内容:
1
2
3
# nvm
export NVM_NODEJS_ORG_MIRROR="http://npm.taobao.org/mirrors/node"
source ~/.nvm/nvm.sh
  • 如果“终端”使用的是 zsh Shell 的话向 ~/.zshrc 文件(如果没有,会自动创建)增加以下内容:
1
2
3
# nvm
export NVM_NODEJS_ORG_MIRROR="http://npm.taobao.org/mirrors/node"
source ~/.nvm/nvm.sh

Windows 系统的 nvm-windows 软件切换镜像源

我们可以找到 nvm-windows 软件的安装目录中的 settings.txt 文件,增加以下内容:

1
node_mirror=http://npm.taobao.org/mirrors/node/

添加成功之后,需要重新打开命令行窗口。

Pyenv-Python管理器

pyenv是一个简单的python版本管理工具,前身为pythonbrewpyenv允许你改变全局的python版本,安装多种不同的python版本,设置应用指定的python版本以及创建/管理虚拟的python环境;

安装pyenv:

1
curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash

配置环境变量,并添加 pyenv 初始化到你的shell

1
2
3
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc

常用命令

  1. 查看当前设置默认的 python 版本

    1
    
    pyenv version
    
  2. 查看当前已安装的所有python版本

    1
    
    pyenv versions
    
  3. 查看当前可安装的python版本列表

    1
    
    pyenv install -l | less
    
  4. 安装指定版本的python

    1
    
    pyenv install 3.6.4
    
  5. 设置全局python版本

    1
    
    pyenv global <python版本>
    
  6. 设置局部 Python 版本 设置之后可以在目录内外分别试下which pythonpython --version看看效果, 如果没变化的话可以pyenv rehash之后再试试

    1
    
    pyenv local <python版本>
    
  • 制定版本创建virtualenv 用于单独为efb使用环境
1
pyenv virtualenv 3.6.4 telegram(名字随便起)
  • 列出现有virtualenvs

pyenv virtualenvs显示现有virtualenv和conda环境的列表。

1
pyenv virtualenvs
  • 激活virtualenv
1
pyenv activate virtualenv的名称 
  • 删除现有virtualenv
1
pyenv uninstall virtualenv的名称 

Redis部署

1
2
3
cd /home/pi/Downloads

wget http://download.redis.io/releases/redis-4.0.9.tar.gz

解压

1
tar -zxf redis-4.0.9.tar.gz

编译

1
2
cd /home/pi/Downloads/redis-4.0.9
sudo make

安装

1
sudo make install

试启动看看

1
redis-server 

面是前端模式启动, 退出登录的话进程就没了, 只适合测试

正式使用要用后端模式, 按以下方法:

先复制配置文件

1
sudo cp /home/pi/Downloads/redis-4.0.9/redis.conf /etc/

修改配置文件内容

1
sudo vi /etc/redis.conf

找到daemonize, 把no修改成yes

保存退出

再次启动服务

1
sudo redis-server /etc/redis.conf 

检查是否有端口为6379的进程

1
netstat -nlp

用客户端连接测试一下

1
redis-cli 

外部网络访问树莓派的Redis

Redis搭建好后一般都是使用编程语言进行连接调用,默认Redis的设置是不允许外界访问的

2、解决方案

进入Redis目录打开Redis.conf配置文件

1
2
3
4
5
6
1>注释掉bind
#bind 127.0.0.1
2>默认不是守护进程方式运行,这里可以修改
daemonize no
3>禁用保护模式
protected-mode no

启动Redis并指明配置文件

1
sudo redis-server /etc/redis.conf 

如果开启了iptables服务的,需要把redis的端口加入一下不然连不上!

OK,通过外网telnet一下Redis服务器看看是否通了,在可视化管理工具中连接Redis也就可以了

3、附录

可视化管理工具

下载地址:redisddesktop

SpiderFoot部署

结合本文章Pyenv-Python管理器来完成此次spiderfoot系统的部署。

1
2
3
4
5
6
7
8
9
pyenv install 2.7.14
pyenv virtualenv 2.7.14 spiderfoot
pyenv activate spiderfoot
git clone https://github.com/smicallef/spiderfoot.git
cd spiderfoot
sudo nano  requirements.txt
删掉M2Crypto==0.23.0 这一行 后面我们用别的方式安装它不会是装不上的
pip install -r requirements.txt
pip install git+https://gitlab.com/m2crypto/m2crypto.git

启动SpiderFoot

LINUX / BSD / Solaris上

要运行SpiderFoot,只需sf.py从您将SpiderFoot提取的目录执行即可:

1
~/spiderfoot-X.X.X$ python ./sf.py

一旦执行,网络服务器将启动,默认情况下将在127.0.0.1:5001上进行监听。然后,您可以通过浏览http://127.0.0.1:5001来使用您选择的网络浏览器。或者,从版本2.10开始,您可以使用CLI,默认情况下,该CLI将在本地连接到服务器127.0.0.1:5001:

1
~/spiderfoot-X.X.X$ python ./sfcli.py

如果您希望使SpiderFoot可以从另一个系统访问(例如在服务器上运行并远程控制它),则可以指定SpiderFoot要绑定到的外部IP,或使用0.0.0.0,以便绑定到所有地址,包括127.0.0.1:

1
~/spiderfoot-X.X.X$ python ./sf.py 0.0.0.0:5001

然后在这种情况下使用CLI,从sfcli.py文件被复制到的远程系统上运行:

1
$ python ./sfcli.py -u http://<remote ip>:5001

运行python ./sfcli.py --help以更好地了解如何使用CLI。

如果系统上的另一个应用程序使用端口5001,则可以更改端口:

1
~/spiderfoot-X.X.X$ python ./sf.py 127.0.0.1:9999

windows

Windows的SpiderFoot作为预打包的可执行文件,无需安装任何依赖项。

目前,没有安装向导,因此只需将该包解压缩到一个目录(例如C:\ SpiderFoot)中并运行sf.exe

1
C:\SpiderFoot>sf.exe

与Linux一样,您还可以指定要绑定的IP和端口:

1
C:\SpiderFoot>sf.exe 0.0.0.0:9999

进一步的配置看官方文档

golang部署(手动)

  1. 先下载go源码,go使用mercurial进行版本控制,需要用到工具mercurial,在终端下执行命令sudo apt-get install mercurial进行安装,然后在终端下执行命令hg clone -u release https://code.google.com/p/go
  2. 切换到go的源码目录,在终端下执行./all.bash安装go,安装成功后会提示ALL TESTS PASSED
  3. 打开配置文件vim ,~/.profile,在文件中添加GOROOT、GOBIN等环境变量,最后保存退出
  4. 在终端下执行命令source .profile使配置文件的修改生效
  5. 在终端下执行命令go,如果出现go命令的相关说明,那么恭喜你,go安装成功
  6. 源码安装go需要在终端下执行的命令依次为:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
 cd ~
 sudo apt-get install mercurial
 hg clone -u release https://code.google.com/p/golang
 cd ~/go/src
 ./all.bash
 vim .profile
 export GOROOT=/home/golang/go
 export GOBIN=/home/golang/go/bin
 export PATH=$PATH:/home/golang/go/bin
 source .profile(每次修改完配置文件.profile一定记得执行这句话)

此方式为使用已编译二进制压缩包安装Go

下载go安装包

1
wget https://dl.google.com/go/go1.10.1.linux-armv6l.tar.gz

解压到/usr/local

1
sudo tar -C /usr/local -xzf go1.10.1.linux-armv6l.tar.gz

修改PATH环境变量

1
2
3
4
5
6
vim ~/.profile  # 或者 ~/.bashrc
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
或者添加: 
export PATH=$PATH:/usr/local/go/bin
source .porfile

(可选)设置GOPATH

go命令依赖一个重要的环境变量:$GOPATH,GOPATH不是go的安装目录,而是go程序开发的工作目录(我的工作目录是golang),打开配置文件vim ~/.profile,在文件中添加export GOPATH=/home/hahaya/golang,最后在终端下执行source .porfile使配置文件的修改生效 通常情况下,为了更好的管理go项目,$GOPATH目录约定有下面三个子目录 src:存放源代码(比如.go/.c/.h等) pkg:编译后生成的文件(比如.a) bin:编译后生成的可执行文件(为了方便,可以把此目录加入$PATH环境变量中)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# go1.8及后续版本在没有设置GOPATH时,会默认以$HOME/go为GOPATH
# GOPATH为你的工作目录,其可以为任意合法目录
在终端下依次执行以下命令创建$GOPATH的三个子目录
 cd ~/golang  
 mkdir src  
 mkdir pkg  
 mkdir bin  
vim ~/.profile  # 或者 ~/.bashrc
export GOPATH=$HOME/codes/go
source .porfile

然后进行检测,执行go

使用go编写hello world

  1. 前面已经配置好go语言开发的相关环境,那么接下来编写一个我们在学习新语言时同样会编写的hello world
  2. 建立目录和包,例如$GOPATH/src/hello/hello.go,在新建go应用或者代码包时都是在$GOPATH/src下新建一个目录,依次在终端下执行如下命令建立目录(hello)和包(hello.go):
1
2
3
4
cd $GOPATH/src  
 mkdir hello  
 cd hello  
 vim hello.go    
  1. 在hello.go中输入如下内容
1
2
3
4
5
package main
import "fmt"
func main() {
    fmt.Printf("hello world...\n")
}
  1. 在终端下输入go run hello.go运行程序,当看到终端上输出hello world...,在go语言开发环境搭建成功

更新go

在终端下依次执行如下命令更新go:

1
2
3
4
 cd ~/go/src
    hg pull
    hg update release
    ./all.bash  

oneinstack部署出错的解决办法

部署typecho博客的时候出现的错误,打开任何链接都是No input file specified错误所以衍生出下方的解决方案。不折腾死星人!!!

原理:

​ 任何对.php文件的请求,都简单地交给php-cgi去处理,但没有验证该php文件是否存在。

​ PHP文件不存在,没办法返回普通的404错误,它返回 一个404,并带上一句”No input file specified”

​ 另外,还可能跟 路径或者 权限有关系,或者SCRIPT_FILENAME 变量没有被正确的设置(这在nginx是最常见的原因)。

解决办法:

1 打开文件: usr/local/php/etc/php.ini,修改以下配置

  • 把cgi.fix_pathinfo=0 改为 cgi.fix_pathinfo=1

  • 把 ;cgi.force_redirect=1 改为 cgi.force_redirect=0

    第二种方法

    1
    2
    3
    4
    5
    6
    7
    8
    
    OneinStack的php.ini在:/usr/local/php/etc/php.ini
    添加 cgi.fix_pathinfo = 1
    到/usr/local/php/etc/php.ini内
    然后在/usr/local/nginx/conf/vhost/you-domain.conf内的
    location ~ [^/]\.php(/|$) {
    下添加一行
    fastcgi_split_path_info ^(.+?.php)(/.*)$;
    保存后,重启php和nginx即可解决。
    

2 修改文件权限

1
2
3
4
# cd /home/wwwroot
# chown -R www:www ./*
# chmod -R 755 ./*
# lnmp restart

当执行的时候。如果个别项目里边有 .user.ini 文件。会提示

1
chown: changing ownership of ‘./www.test.com/.user.ini’: Operation not permitted

这时候需要 进入这个目录 执行

1
chattr -i .user.ini 

然后 进入到wwwroot目录 , 再执行权限命令,最后别忘了,进入www.test.com 目录,执行

1
chattr +i .user.ini 

最后重启

1
lnmp restart

补充:Linux chattr 命令,用于改变文件属性。

这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有以下8种模式:

  1. a:让文件或目录仅供附加用途。
  2. b:不更新文件或目录的最后存取时间。
  3. c:将文件或目录压缩后存放。
  4. d:将文件或目录排除在倾倒操作之外。
  5. i:不得任意更动文件或目录。
  6. s:保密性删除文件或目录。
  7. S:即时更新文件或目录。
  8. u:预防以外删除。

语法

1
chattr [-RV][-v<版本编号>][+/-/=<属性>][文件或目录...]

参数

  • -R 递归处理,将指定目录下的所有文件及子目录一并处理。
  • -v<版本编号> 设置文件或目录版本。
  • -V 显示指令执行过程。
  • +<属性> 开启文件或目录的该项属性。
  • -<属性> 关闭文件或目录的该项属性。
  • =<属性> 指定文件或目录的该项属性。

实例

用chattr命令防止系统中某个关键文件被修改:

1
chattr +i /etc/resolv.conf
1
lsattr /etc/resolv.conf

​ 会显示如下属性

1
----i-------- /etc/resolv.conf

让某个文件只能往里面追加数据,但不能删除,适用于各种日志文件:

1
chattr +a /var/log/messages

使用FRP内网穿透

FRP是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https协议。在这篇文章中将为大家介绍FRP服务端和客户端的配置,通过FRP,让树莓派穿透内网,使大家在外网环境下也能轻松访问处于内网中的树莓派~

安装环境和需求

  1. 一台具有公网 ip 的服务器
  2. 一个域名

  • 内网客户端使用 Raspbian Pi 3b,Raspbian Stretch;
  • 公网服务端使用 Vultr 的 Debian 8

服务端配置

1
2
#自己去github获取最新版本
wget https://github.com/fatedier/frp/releases/download/v0.16.1/frp_0.16.1_linux_amd64.tar.gz

解压进去打开 frps.ini

1
2
3
tar -zxvf frp_0.16.1_linux_amd64.tar.gz
cd frp_0.16.1_linux_amd64
nano frps.ini

服务端配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
[common]
bind_addr = 0.0.0.0
bind_port = 7000    #frp服务端口,需与frpc.ini相同
vhost_http_port = 80    #http服务端口
vhost_https_port = 443    #https服务端口
dashboard_port = 7500    #控制台端口
privilege_token = xxxxx    #特权模式密钥,需与frpc.ini相同

log_file = /var/log/frps.log    #日志文件存储路径
log_level = info    #日志记录级别
log_max_days = 3    #日志最大存储天数
max_pool_count = 5
authentication_timeout = 900

subdomain_host = test.com    #服务端绑定域名
tcp_mux = true

保存退出后可以跑跑看

1
./frps -c ./frps.ini

客户端配置

1
wget https://github.com/fatedier/frp/releases/download/v0.16.1/frp_0.16.1_linux_arm.tar.gz

解压配置

1
2
3
tar -zxvf frp_0.14.1_linux_arm.tar.gz
cd frp_0.14.1_linux_arm/
vi frpc.ini

配置示范:

 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
[common]
server_addr = xxxxxx    #服务器公网IP
server_port = 7000    #frp服务端口,需与frps.ini相同
privilege_token = xxxx      #特权模式密钥,需与frps.ini相同

log_file = /var/log/frpc.log    #日志文件存储路径
log_level = info    #日志记录级别
log_max_days = 3    #日志最大存储天数
pool_count = 5
tcp_mux = true

[ssh]    #服务名称,可自定义
type = tcp    #协议类型(tcp)
local_ip = 127.0.0.1
local_port = 22    #本地SSH服务端口
remote_port = 22    #穿透后SSH服务访问端口

[pi]    #服务名称,可自定义
type = http    #协议类型(http)
local_ip = 127.0.0.1
local_port = 80    #本地web服务端口
use_encryption = false
use_compression = true
subdomain = pi    #二级域名,建议与此项的服务名称"web"设置为相同
#custom_domains = xxxxx    #自定义域名

值得说明的是,frps.ini中subdomain_host的域名需要泛解析到服务器的公网IP(比如*.frp.com),这个时候,如果客户端frpc.ini文件中的subdomain属性有定义(如web),则此服务绑定的域名为web.frp.com。

  如果frpc.ini中定义了custom_domains属性,那么可以将custom_domains中提到的自定义域名解析到服务器所在的公网IP,方可正常使用该自定义域名访问此项服务。

  在frps.ini中,vhost_http_port的值一旦被指定(如80),那么所有客户端中web服务映射到服务器中的端口都相同(都为80,比如http://web.frp.com:80)/),vhost_https_port同理。

  dashboard_port属性指定了服务器的控制台端口(以7500为例),访问服务器ip:该端口(如http://123.123.123.123:7500)/),即可进入控制面板来查看frp服务的状态信息(默认用户名和密码都为admin)。

  frpc.ini和frps.ini中注释未提到的内容可以在官方文档或压缩包中自带的配置说明文件frpc.ini/frps.ini中找到,未提到的内容大多为官方推荐配置,可直接应用。

装完就可以起飞了

1
./frpc -c ./frpc.ini

使用 nohup 制作一键启动脚本

服务端

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
 
# check network availability
while true
do
  TIMEOUT=5
  SITE_TO_CHECK="www.baidu.com"
  RET_CODE=`curl -I -s --connect-timeout $TIMEOUT $SITE_TO_CHECK -w %{http_code} | tail -n1`
  if [ "x$RET_CODE" = "x200" ]; then
  echo "Network OK, Start Frp..."
  break
  else
  echo "Network not ready, wait..."
  sleep 1s
  fi
done
 
# Start Frp
/usr/local/bin/frps -c /etc/frp/frps_pi.ini &

客户端

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
 
# check network availability
while true
do
  TIMEOUT=5
  SITE_TO_CHECK="www.baidu.com"
  RET_CODE=`curl -I -s --connect-timeout $TIMEOUT $SITE_TO_CHECK -w %{http_code} | tail -n1`
  if [ "x$RET_CODE" = "x200" ]; then
  echo "Network OK, Start Frp..."
  break
  else
  echo "Network not ready, wait..."
  sleep 1s
  fi
done
 
# Start Frp
sudo /usr/local/bin/frpc -c /etc/frp/frpc_pi.ini &

查看服务状态

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
SSH通过外网主机连接到内网主机
    ssh root@xx.xx.xx.xx -p 6000

查看内网主机日志
    tail -f /var/log/frpc.log

查看外网主机日志
    tail -f /var/log/frps.log

查看内网服务状态
    systemctl status frpc

查看外网服务状态
    systemctl status frps

开机启动

这里使用 Systemd 更简单的管理服务 比 init.d 和上面的破脚本不知道高到哪里去了,也可以使用supervisor

1
sudo vim /lib/systemd/system/frp.service

创建 frp.service,输入

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

[Service]
User=root
Type=simple
ExecStart=/home/frp/./frpc -c /home/frp/./frpc.ini
[Install]
WantedBy=multi-user.target

重载并设置开机启动

1
2
sudo systemctl daemon-reload
sudo systemctl enable frp

// 启动命令 sudo systemctl start frp // 停止命令 sudo systemctl stop frp // 重启命令 sudo systemctl restart frp // 查看状态 sudo systemctl status frp

第二种方法

开机自启FRP服务:

  接下来,我们将让frps/frpc服务开机启动:

  编辑**客户端(树莓派)**的/etc/rc.local文件,在exit 0之前添加以下代码行:

1
2
# Start Frpc
/bin/startfrpc.sh >> /dev/null 2>&1

  编辑服务端/etc/rc.local,在文件末尾添加以下代码行(如果文件末行为exit 0,则应该将以下内容添加到exit 0之前):

1
2
# Start Frps
/bin/startfrps.sh >> /dev/null 2>&1

  这时,关机并重新启动客户端和服务端,待开机后,在客户端或者服务端中执行以下命令:

ps -A | grep frp

  若返回类似结果则证明frps/frpc服务启动成功:

  客户端:

1
2
1920 ?        00:00:00 startfrpc.sh
1925 ?        00:00:15 frpc

  服务端:

1
2
1920 ?        00:00:00 startfrps.sh
1925 ?        00:00:15 frps

  停止FRP服务:

  我们可以使用相同的命令查看FRP服务的PID,比如在服务端中执行:

ps -A | grep frp

  例如终端返回:

1
2
1920 ?        00:00:00 startfrps.sh
1925 ?        00:00:15 frps

  可以得到这两个进程的PID为1920和1925,我们可以使用kill命令杀掉这两个进程来停止FRP服务:

(sudo) kill 1920 1925

  客户端停止流程同理。