分类 运维/Linux 下的文章

就让我来试试传说中最适用于IOT的MQTT协议。

安装

虽然搜索资料很多,但大多是MQTT的使用,尽管有搭建服务器的文章,但我感觉写的不太清楚,大多数文章选择了Mosquitto(也许是Eclipse大厂出品的原因)。
经过寻找,找到了Nodejs写的mosca,但在Pi上老是安装失败,翻了翻Issues,找到了同作者写的依赖性小,轻量化的aedes。

npm install aedes --save


//最小例子
var aedes = require('aedes')();
var server = require('net').createServer(aedes.handle);
server.listen(8266);

简单使用

将所有的订阅与推送保存到sqlite3数据库中:

//Nodejs
var aedes = require('aedes')();
var colors = require('colors');
var server = require('net').createServer(aedes.handle);
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('data.db');
var port = 8266;
//更多事件查看Github:https://github.com/mcollina/aedes
aedes.on('publish',function(packet,client) {
    if (client) {
        console.log('[ Publish ] CilentID:'.green,client.id,' Qos:'.green,packet.qos,' Data:[ '.green,String(packet.payload),' ]'.green);
        db.run("INSERT INTO publish (date,client_id,topic,data) VALUES (datetime('now'),?,?,?);",[client.id,packet.topic,String(packet.payload)]);
    }
});
aedes.on('subscribe', function (subscriptions, client) {
    if (client) {
        //subscriptions懒得历遍(一般情况同时只有一个吧)
        db.run("INSERT INTO subscribe (date,client_id,topic) VALUES (datetime('now'),?,?)",[client.id,subscriptions[0].topic]);
        console.log('[ Subscribe ] SubscripTions:'.green,subscriptions[0].topic,' Qos:'.green,subscriptions[0].qos,' CilentID:'.green,client.id);
    }
});
aedes.on('unsubscribe',function(unsubscriptions,client){
    if(client){
        //同理
        console.log('[ unSubscribe ] unSubscripTions:'.green,unsubscriptions[0],' CilentID:'.green,client.id);
        db.run("DELETE FROM subscribe WHERE client_id = ? AND topic = ?;",[client.id,unsubscriptions[0]])
    }
});
server.listen(port,function(){
    console.log('[ Server ] server listening on port'.green,port)
});

//Sqlite3
CREATE TABLE "publish" ( `date` TEXT NOT NULL, `client_id` TEXT NOT NULL, `topic` TEXT NOT NULL, `data` TEXT NOT NULL );
CREATE TABLE "subscribe" ( `date` TEXT NOT NULL, `client_id` TEXT NOT NULL, `topic` TEXT NOT NULL );

//Micropython for ESP8266
>>> from umqtt.simple import MQTTClient                                                                             
>>> conn = MQTTClient('esp8266','192.168.1.64',8266)
>>> conn.connect()
0
>>> conn.publish(b'/test',b'test')
>>> conn.disconnect()

优缺点

  • 轻量化
  • 可以更好的结合业务逻辑
  • 不支持或不完全支持Qos2

Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。

安装

通过包管理器安装

(debain/ubuntu) sudo apt-get install nginx

编译安装

有人写了一键安装脚本,安装时间稍微长一些,如果没有特殊需求的话,一般使用包管理器提供的版本,尽管不是最新,但一般情况下很稳定。
https://lnmp.org/auto.html

基础配置

示例版本:nginx/1.14.2

重启Nginx:(debain/ubuntu) sudo servcie nginx restart

基础网站配置

所有的网站配置都在/etc/nginx/sites-available/(通过包管理器安装的,如果编译安装,请查看编译配置)中,默认有一个default配置
我们把注释删减下,得到如下的配置:

server {
    #监听端口 ipv4&ipv6
    listen 80;
    listen [::]:80;
    #网站根目录
    root /var/www/html;
    #主页
    index index.html index.htm index.nginx-debian.html;
    #服务器名称,如果有多个站点,这里填写你的域名
    server_name _;
    #路径配置块
    location / {
        #404配置,寻找文件,先寻找文件后寻找目录
        try_files $uri $uri/ =404;
    }
}

PHP配置

做站怎么能没有PHP,在配置中添加:

location ~ \.php$ {
    #注意你的PHP版本,这里配置的是php7.3-fpm
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php7.3-fpm.sock;
}

编译安装的这里会报错,因为你没有snippets/fastcgi-php.conf这个配置文件(这个配置中又引用了其他配置,记得全部拷贝回来), 你可以在编译前从包管理器的版本中拷贝一份,记得删除包管理器版本。

安全配置

现在的站点基本配有SSL,我们也要想办法装上一个

获取证书

你可以在这搞一张证书:https://freessl.cn/
当然也可以买一张便宜的证书,一般是Sectigo(Comodo),的比较便宜,一年5刀

SSL配置

在1.11.0之后的版本中,支持RSA与ECC双证书,填写两张证书路径,配置优先ECC算法即可。

#将你的监听端口改为:
listen 443 ssl;
listen [::]:443 ssl;
#在老版本中,启用ssl的配置为:
#ssl on;
#而不是在监听端口后加ssl
#证书/私钥配置(目录为你的证书存放目录)
ssl_certificate /etc/nginx/ssl_cert/main.crt;
ssl_certificate_key /etc/nginx/ssl_cert/main.key;
#其他ssl配置
ssl_session_timeout 5m; #会话过期时间
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #支持握手协议(通常使用TLSv1.2)
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; #优先选择算法
ssl_prefer_server_ciphers on;  #启用服务器偏好配置

跳转设置

将http访问全部变为https访问:

#在上一个server{...}后新建:
server {
    listen 80;
    server_name yourdomain;
    rewrite ^(.*) https://$server_name$1 permanent;
}

关闭服务器token

Nginx会在响应头标识服务器版本,我们要关掉它(在/etc/nginx/nginx.conf(通过包管理器安装的,如果编译安装,请查看编译配置) 中):

#http段中
server_tokens off;

禁止访问

#禁止访问passwd路径(路径支持正则)下的所有文件
location /passwd {
    deny all;
}

优化配置

gzip压缩

使用gzip压缩来减少传输时间,将/etc/nginx/nginx.conf(通过包管理器安装的,如果编译安装,请查看编译配置)中关于gzip配置注 释删除即可。

gzip_vary on; #启用压缩标识
gzip_proxied any; #反向代理时,无条件启用压缩
gzip_comp_level 6; #压缩等级
gzip_buffers 16 8k; #缓存空间大小
gzip_http_version 1.1; #版本
gzip_types text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; #启用压缩的文件类型

使用优化模型

#配置头直接填写
worker_processes auto; #自动配置工作进程数量
#worker_cpu_affinity 01 10 01 10; #不同进程绑定不同逻辑cpu(四进程双核示例)
worker_rlimit_nofile 65535; #Nginx能打开最大的文件描述符(Linux好像为65535)
#events段中
use epoll; #使用epoll轮询处理
# kqueue | rtsig | epoll | /dev/poll | select | poll (Nginx支持的事件模型)
worker_connections 1024; 每个进程最大的连接数

其它应用

反向代理

恰饭链接

浏览目录(文件服务器)

再次恰饭链接

后续

现在你可以开始关心网站的SEO,以及前端优化了。

据说是官方推荐的部署方式。通过Lighttpd的Fastcgi来部署。
适合部署些小应用。

1 安装环境

#安装Lighttpd
apt-get install lighttpd
#安装Webpy及其依赖
pip install web.py flup

2 配置Fastcgi

通过apt方式安装的,配置在/etc/lighttpd目录下

#lighttpd.conf
#添加模块
    "mod_rewrite"
    "mod_fastcgi"
#在static-file.exclude-extensions中添加
    ".py"
#在include_shell前添加配置
    fastcgi.server = ( ".py" =>
        (( "socket" => "/tmp/fastcgi.socket", #fastcgi名
            "bin-path" => "/var/www/html/index.py", #应用入口文件
            "max-procs" => 3, #子进程个数
            "bin-environment" => (
                "REAL_SCRIPT_NAME" => ""
            ),
            "check-local" => "disable"
        )))
#转发配置
    url.rewrite-once = (
        "^/favicon.ico$" => "/static/favicon.ico",
        "^/static/(.*)$" => "/static/$1",
        "^/(.*)$" => "/index.py/$1",
    )

3 重启&测试

重启:

service lighttpd restart

测试用例(index.py):

#coding=utf-8
import web
urls = (
    "/(.*)", "index",
)
app = web.application(urls, globals())
class index:
    def GET(self, name):
        web.header('Content-Type','text/html; charset=UTF-8')
        return "Hello " + name
if __name__ == "__main__":
    app.run()

现在可以访问不同的路径康康效果:

http://localhost/
http://localhost/test

给树莓派装的。

1 安装

sudo apt-get update
sudo apt-get install samba samba-common-bin

2 配置

打开位于/etc/samba/smb.conf的配置文件,进行配置:

#在末尾添加如下配置
#配置前可做个备份: sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.back
#寻找配置 read only 更改为 no
[NAS]
    #设备说明
    comment = NAS For RPi
    #允许访问的用户
    valid users = pi
    #目录
    path = /
    #被其他人看到资源名称(非内容)
    browseable = yes
    #写使能
    writable = yes
    #新建文件权限
    create mask = 0664
    #新建文件夹权限
    directory mask = 0775

重启服务:

sudo /etc/init.d/samba restart

3 设置密码

在终端输入如下命令,为用户设置访问密码:

sudo smbpasswd -a pi

OpenResty 是一个强大的 Web 应用服务器,Web 开发人员可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,更主要的是在性能方面,OpenResty可以 快速构造出足以胜任 10K 以上并发连接响应的超高性能 Web 应用系统。

1.安装依赖包

sudo apt-get install gcc g++ make libpcre3 libpcre3-dev zlib1g-dev openssl libssl-dev

2.下载源码

我们需要分别下载nginx,luajit以及lua-nginx-module

#nginx 1.14.2,LuaJIT 2.0.5,lua-nginx-module 0.10.13
mkdir temp && cd temp/
wget http://nginx.org/download/nginx-1.14.2.tar.gz
wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz
wget https://github.com/openresty/lua-nginx-module/archive/v0.10.13.tar.gz
tar xfvz nginx-1.14.2.tar.gz
tar xfvz LuaJIT-2.0.5.tar.gz
tar xfvz v0.10.13.tar.gz

3.编译Nginx

cd LuaJIT-2.0.5/
make && make install
cd ../nginx-1.14.2/
#指定luajit目录
export LUAJIT_LIB=/usr/local/lib
export LUAJIT_INC=/usr/local/include/luajit-2.0
#新建一个文件夹,这将作为安装目录
mkdir /etc/nginx
#配置模块
./configure --prefix=/etc/nginx --add-module=../lua-nginx-module-0.10.13 --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_sub_module --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module
make -j2 && make install

4.配置使用

打开/etc/nginx/conf/nginx.conf加入:

location /lua {
  default_type 'text/plain';
  content_by_lua 'ngx.say("hello")';
}

然后运行nginx:

/etc/nginx/sbin/nginx

测试!

curl http://localhost/lua
hello

最近Armbian访问巨慢,刚好有闲置的VPS,就干脆反向代理,来加速访问Armbian源。

Step 1 :你得有个Nginx

Apt直接装:

sudo apt-get install nginx

Step 2 :配置Nginx

由于我只做代理镜像源,所以直接删除默认的配置,重新写了一下:

 server {
         listen 80; #监听端口
         listen [::]:80;
         server_name _;

 location / {
         proxy_pass  https://apt.armbian.com; #源地址
         proxy_redirect     off;
         #替换头
         proxy_set_header   Host             $host;
         proxy_set_header   X-Real-IP        $remote_addr;
         proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
         proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
         proxy_max_temp_file_size 0; #指定当响应内容大于proxy_buffers指定的缓冲区时, 写入硬盘的临时文件的大小
         proxy_connect_timeout      90; #nginx跟后端服务器连接超时时间
         proxy_send_timeout         90; #后端服务器数据回传时间
         proxy_read_timeout         90; #连接成功后,后端服务器响应时间
         proxy_buffer_size          4k; #设置代理服务器保存用户头信息的缓冲区大小
         proxy_buffers              4 32k; #proxy_buffers缓冲区
         proxy_busy_buffers_size    64k; #高负荷下缓冲大小
         proxy_temp_file_write_size 64k; #设定缓存文件夹大小
    }
 }

Step 3 :配置板子源

Armbian的源在/etc/apt/sources.list.d/armbian.list下直接替换就行:

sudo vim /etc/apt/sources.list.d/armbian.list
#分享一下我的反向代理源
deb http://apt.chutian.bid stretch main stretch-utils stretch-desktop
#保存&退出,更新软件源
sudo apt-get update

Nginx做文件服务器时,需要显示目录结构,由于安全性的原因,Nginx默认是不开启的,所以下面来人工打开它。

配置

打开你的站点配置文件加入(一般在/etc/nginx/sites-enabled中):

autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
\autoindex_exact_sizeautoindex_localtime
on显示出文件的确切大小,单位为bytes显示的文件时间为文件的服务器时间
off显示出文件的大概大小,单位为kB或MB或GB显示的文件时间为GMT时间

乱码解决

配置完成后我们打开站点,发现中文显示乱码,在配置文件中加入一行即可:

charset utf-8,gbk;

指定目录显示

很多时候我们只需要某个目录暴露出来,这时我们需要定义一个段,下面以站点目录的video为例:

location /video {
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
        charset utf-8,gbk;
}

Slowhttptest是依赖HTTP协议的慢速攻击DoS攻击工具,设计的基本原理是服务器在请求完全接收后才会进行处理,如果客户端的发送速度缓慢或者发送不完整,服务端为其保留连接资源池占用,大量此类请求并发将导致DoS

这次将对一台装有Lighttpd的测试服务器进行DoS攻击。

版本信息:

lighttpd/1.4.45 (ssl) - a light and fast webserver
Build-Date: Jan 14 2017 21:07:19

安装这个工具:

sudo apt-get install slowhttptest
----------------------------------------------------
git仓库地址:https://github.com/shekyan/slowhttptest

用法与参数:

~# slowhttptest -h 
 -g      在测试完成后,以时间戳为名生成一个CVS和HTML文件的统计数据
 -H      SlowLoris模式
 -B      Slow POST模式
 -R      Range Header模式
 -X      Slow Read模式
 -c      number of connections 测试时建立的连接数
 -d      HTTP proxy host:port  为所有连接指定代理
 -e      HTTP proxy host:port  为探测连接指定代理
 -i      seconds 在slowrois和Slow POST模式中,指定发送数据间的间隔。
 -l      seconds 测试维持时间
 -n      seconds 在Slow Read模式下,指定每次操作的时间间隔。
 -o      file name 使用-g参数时,可以使用此参数指定输出文件名
 -p      seconds 指定等待时间来确认DoS攻击已经成功
 -r      connections per second 每秒连接个数
 -s      bytes 声明Content-Length header的值
 -t      HTTP verb 在请求时使用什么操作,默认GET
 -u      URL  指定目标url
 -v      level 日志等级(详细度)
 -w      bytes slow read模式中指定tcp窗口范围下限
 -x      bytes 在slowloris and Slow POST tests模式中,指定发送的最大数据长度
 -y      bytes slow read模式中指定tcp窗口范围上限
 -z      bytes 在每次的read()中,从buffer中读取数据量

攻击例子:

slowhttptest -c 1000 -H -g -o test -i 10 -r 200 -t GET -u http://your_domain/ -x 24 -p 3

(这条命令会在测试后留下一个名为test的html和csv文件,下面是html的内容)

请输入图片描述

服务器防范措施:

  1. 限制链接数
  2. 设置最大并发数
  3. 限制单位时间内的请求数
  4. 对于Nginx,可以使用 ModSecurity,http_guard,ngx_lua_waf
  5. 对于Apache,可以使用 mod_security,mod_evasive