分类 Internet 下的文章

小内存福音|LNMP 定时监控 Nginx Mysql PHP-fpm

首先强烈谴责一下 CNblog、CSDN 以及简书,抄来抄去就是没有一个能解决问题的,简直就是互联网三大毒瘤。

在网上找的脚本基本上都是抄来抄去,比如 Nginx 可以用,套在 Mysql 上就不行了,搜索了相关资料也没找到,只看到网上千变一律的抄来抄去,连脚本的 BUG 都没发现还抄你大爷呢,害惨我了,不过还是由我这个菜鸡搞定了,在别人原有的基础上修改了一下,算是伪原创吧。

此次教程主要针对 512M 内存或以下的,防止系统内存不足或者其它原因导致的程序自动退出或者被 kill 掉而写的。

以下全部脚本配合 crontab 定时任务监控程序是否运行,否则将会自动启动。

Nginx 监控脚本

#!/bin/bash
pgrep -x nginx &> /dev/null
if [ $? -ne 0 ]
then
    /etc/init.d/nginx start
    echo "Nginx stopped at time: `date` " >> /home/logs/server.log
else
    echo $(date +%F%n%T) "Nginx server is running."
fi

Mysql 监控脚本

#!/bin/bash
pgrep -x mysqld &> /dev/null
if [ $? -ne 0 ]
then
    echo "At time: `date` :MySQL  is stop .">> /home/logs/server.log
    service mysql start
    #echo "At time: `date` :MySQL server is stop."
else
    echo $(date +%F%n%T) "MySQL server is running."
fi

php-fpm 监控脚本

#!/bin/bash
pgrep -x php-fpm &> /dev/null
if [ $? -ne 0 ]    
then
     echo "At time: `date` :php-fpm is stop ." >> /home/logs/server.log
     /etc/init.d/php-fpm start
    #echo "At time: `date` :php-fpm server is stop."
else
     echo $(date +%F%n%T) "php-fpm server is running."
fi

CentOS 7 安装 bitwarden_rs 自建密码管理

20200331134418.png
bitwarden_rs项目延伸自Bitwarden,bitwarden_rs使用Rust实现了Bitwarden相似的功能,两者均开源。不过Bitwarden需要较多的依赖(如MSSQL),占用内存也比较大,如果是个人或家庭使用,推荐更加轻量的bitwarden_rs,并且bitwarden_rs还可以免费使用Bitwarden的一些高级功能,如附件上传、TOTP等功能。

安装 Docker

yum -y install docker

启动 docker

systemctl start docker

开机自启

systemctl enable docker

接下来使用 Docker 拉取 bitwarden_rs 镜像并运行

docker pull bitwardenrs/server:latest
docker run -d --name bitwarden -v /bw-data/:/data/ -p 80:80 bitwardenrs/server:latest

上方使用了80端口,如果您已经安装了WEB服务,可能会导致冲突,可以将bitwarden_rs映射的端口修改为其它,比如8880

docker run -d --name bitwarden -v /bw-data/:/data/ -p 8880:80 bitwardenrs/server:latest

反向代理:

server
    {
    listen 443 ssl http2;
  # certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
        ssl_certificate fullchain.cer;
        ssl_certificate_key xxx.com.key;
        ssl_session_timeout 5m;
        ssl_protocols  TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
        ssl_ciphers "TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:TLS-AES-128-GCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5";
        ssl_session_cache builtin:1000 shared:SSL:10m;
        # openssl dhparam -out /usr/local/nginx/conf/ssl/dhparam.pem 2048
        ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;
        add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

    # OCSP Stapling ---
    # fetch OCSP records from URL in ssl_certificate and cache them
    ssl_stapling on;
    ssl_stapling_verify on;

    server_name     xxx.com;
   client_max_body_size 128M;
    location / 
  {
        proxy_set_header  Host  'xxx.com';
        proxy_pass http://127.0.0.1:8880;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
location /notifications/hub 
  {
    proxy_pass http://127.0.0.1:3012;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }

  location /notifications/hub/negotiate 
  {
    proxy_pass http://127.0.0.1:8880;
  }

  }

自行替换成你的域名以及相关目录,此配置有可能并不完全适合你。

打开你自建的 bitwarden 网站注册之后,为了安全可以禁止注册;

删除 docker bitwarden 容器,不会删除的自己去百度一下‘docker 删除容器’,然后依次输入以下命令即可;

docker run -d --name bitwarden \
  -e SIGNUPS_ALLOWED=false \
  -v /bw-data/:/data/ \
  -p 8880:80 \
  bitwardenrs/server:latest

问题须知:

Google Chrome浏览器无法登录?

某些网络浏览器(例如Chrome)不允许在不安全的上下文中使用Web Crypto API。在这种情况下,您可能会收到类似的错误Cannot read property 'importKey'。要解决此问题的办法就是配置https访问。

容器不能跟 Docker 同时启动怎么办?

在生活中难免会出现断电关机,遭遇黑客攻击导致程序死掉,测试服务器之后需要重启等等…在重启 VPS 的时候虽然会自动启动 Docker 程序,但不会同时启动里面的容器,只需要再次输入以下命令即可;

docker update --restart=always <CONTAINER ID>

说明:

--restart=always <无论退出状态是如何,都重启容器>

是容器名字,如果你在上诉搭建过程中没有指定容器名,系统会自动命名一个名字。

docker ps -a 查看当前 bitwarden 的容器名,填入上方命令回车即可。

Typecho 通过 JS 脚本预加载提升网站访问速度

在用户点击网站链接之前,他们将鼠标悬停在该链接上。当用户徘徊65毫秒时,他们将点击该链接有两个机会,因此 instant.page 此时开始预加载,平均超过 300 毫秒,以便页面预加载。

instant.page 是渐进式增强 - 对不支持它的浏览器没有影响。

原理就是通过捕捉鼠标悬浮的链接进行预加载。此脚本的加速指站内加速,但只会预加载 html 页面,不会加载图片等资源,所以不用担心与流量损耗等问题。

20200331124923.png

GitHub 地址:https://github.com/instantpage/instant.page

typecho 调用方法

把上述 Github链接文件 instantpage.js 下载之后上传到网站目录下;

在foot.php 文件 /body 标签前添加:

<script src="`存放路径`/instantpage.js" type="module"></script>

BUG:使用此脚本后统计数据增加,因为预加载会被统计成正常浏览次数,期待官方解决。

CC 发包工具 siege 安装与使用

Siege是一款开源的压力测试工具,设计用于评估WEB应用在压力下的承受能力。可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行。siege可以从您选择的预置列表中请求随机的URL。所以siege可用于仿真用户请求负载,而ab则不能。但不要使用siege来执行最高性能基准调校测试,这方面ab就准确很多。

说白了,用到正处就是测试服务器压力的,用到坏处就是 CC 发包攻击服务器。

大佬们别打我,我自己测试过自己的服务器,一打就 502 Bad Gateway。

安装方法:

yum install gcc
wget http://download.joedog.org/siege/siege-4.0.5.tar.gz
tar -zxf siege-4.0.5.tar.gz
cd siege-4.0.5
./configure
make
make install

使用 siege 来查看是否真的安装成功了

siege

如果看到如下信息,则说明安装成功了:

SIEGE 4.0.5
Usage: siege [options]
       siege [options] URL
       siege -g URL
Options:
  -V, --version             VERSION, prints the version number.
  -h, --help                HELP, prints this section.
  -C, --config              CONFIGURATION, show the current config.
  -v, --verbose             VERBOSE, prints notification to screen.
  -q, --quiet               QUIET turns verbose off and suppresses output.
  -g, --get                 GET, pull down HTTP headers and display the
                            transaction. Great for application debugging.
  -p, --print               PRINT, like GET only it prints the entire page.
  -c, --concurrent=NUM      CONCURRENT users, default is 10
  -r, --reps=NUM            REPS, number of times to run the test.
  -t, --time=NUMm           TIMED testing where "m" is modifier S, M, or H
                            ex: --time=1H, one hour test.
  -d, --delay=NUM           Time DELAY, random delay before each requst
  -b, --benchmark           BENCHMARK: no delays between requests.
  -i, --internet            INTERNET user simulation, hits URLs randomly.
  -f, --file=FILE           FILE, select a specific URLS FILE.
  -R, --rc=FILE             RC, specify an siegerc file
  -l, --log[=FILE]          LOG to FILE. If FILE is not specified, the
                            default is used: PREFIX/var/siege.log
  -m, --mark="text"         MARK, mark the log file with a string.
                            between .001 and NUM. (NOT COUNTED IN STATS)
  -H, --header="text"       Add a header to request (can be many)
  -A, --user-agent="text"   Sets User-Agent in request
  -T, --content-type="text" Sets Content-Type in request
      --no-parser           NO PARSER, turn off the HTML page parser
      --no-follow           NO FOLLOW, do not follow HTTP redirects

Copyright (C) 2017 by Jeffrey Fulmer, et al.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE.

使用方法:

siege -c 200 -r 20 https://baidu.com
#-c 200 并发200个用户 -r 20 重复循环20

这是最基本的用法,如果需要更强的用法,参照帮助去尝试即可。

Nginx 503 Service Temporarily Unavailable

昨天遇到一个奇怪的问题,初次访问网站的时候,部分CSS,JS,PNG文件不会加载,提示 Nginx 503 Service Temporarily Unavailable 错误,但接着再刷新一下就自动加载了。

发帖子求助之后查看了我的网站之后经过排查,Nginx.conf 配置文件没错,是网站的虚拟配置文件设置了并发限流,才想起去年12月份的时候我设置了,也没测试网站就没去理会,所以也就导致了这种低级错误。

4429609.png

之前设置的限流:

        limit_conn perip 6;
        limit_req zone=allips burst=5 nodelay;

去掉之后,重启 Nginx 完事。