常见的SSH登录缓慢的情况和解决方案

Published: Tags: SSH LINUX

最常见的SSH登录慢的处理情况,是修改客户端和服务端的UseDNSGSSAPIAuthentication参数。

这个网上可以搜到大把就不说了。将要说的是以上修改无效的情况,前后踩了几个坑都没解决。 由于客户端有密钥,而服务端使用密码登录,优先密码连接SSH的命令(可在/etc/ssh/ssh_config配置)

ssh -vvv -o PreferredAuthentications=password 10.0.0.123

懒得写总结,具体请参考: 解决centos ssh登录缓慢问题 解决ssh到ubuntu server卡顿 SSH slow at starting session ssh connection takes forever to initiate

修改SSH重试次数和IPTABLES屏蔽规则

Published: Tags: SHELL LINUX

前两天买了个小机器用于测试,所以就没弄密钥登录,然后发现SSH被暴力破解的频率有点高。 因此修改了SSH的最大重试次数,并且加上IPTABLES的屏蔽规则,当然最好的解决方法是使用密钥。

vi /etc/ssh/sshd_config,去掉MaxAuthTries的注释,设值为1次(默认6次),再reload下SSH即可。

然后添加两行IPTABLES的规则,在3600秒的时间内,对22端口建立超过20次链接,则丢包处理,如下:

iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHBAN --set
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHBAN --update --seconds 3600 --hitcount 20 -j DROP

被屏蔽的IP列表,可以在 /proc/net/xt_recent/ 目录中找到(部分发行版在ipt_recent目录下)

以上的方法有个问题,就是如果用于GIT项目管理之类,使用了22端口,而某个IP在设定的时间内, 提交了超过20次的话,那么之后的提交都会失败(连接服务器超时),可以换用fail2ban屏蔽方案。

参考: Iptables模块recent应用 Iptables防攻击模块介绍(五)

使用GIT钩子进行代码自动部署

Published: Tags: GIT LINUX

利用GIT的钩子,可以减少人工部署代码出错的可能性,又能增加效率。

  • 方法一

先在 /data/web/ 目录(笔者的项目)下,使用 git clone 拉取一次项目的代码文件, 然后再修改服务器仓库(不是项目路径)中的 hooks/post-receive 文件,添加以下代码:

#!/bin/sh

unset GIT_DIR
originPath=$(pwd)
deployPath="/data/web"

cd $deployPath
git pull origin master
cd $originPath

但是这种方法会把 .git 仓库暴露在公网,当然了,如果不开放目录访问其实问题也不大。 简单的解决方法,可以先把项目建立在非公网路径下,然后使用 rsync 命令同步代码过去。

但是其实还有另外一个更加简洁的方法,以下就是我要说的,利用 core.worktree 配置。

  • 方法二

修改仓库的 config 文件,注意 bare 为 false 值,其他根据自己的情况进行修改:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    worktree = /data/web

[receive]
    denycurrentbranch = ignore

然后是钩子的代码:

#!/bin/sh

unset GIT_DIR
git checkout -f

这样的话,就不会把 .git 仓库暴露在公网环境下,而又可以使用钩子进行代码自动部署了。

参考: Git hook之自动化部署 - SegmentFault 思否 通过git自动部署WEB服务上的PHP代码,提交即生效 GIT_DIR和GIT_WORK_TREE的妙用,工作区和仓储可隔离

改造RM命令,增加回收站防止误删除

Published: Tags: SHELL LINUX

由于网上找到的代码和方法有点繁杂,所以重新造了个轮子~

放到 /etc/bashrc 即可(不同发行版配置,路径请自行修改)

alias rm='remove2trash'; remove2trash () 
{
    datetime=$(date +'%s');
    trash="/tmp/.trash.$(whoami)";

    mkdir -m 700 -p "$trash" && touch "$trash";
    find "$trash" -maxdepth 1 -mtime +7 |xargs /bin/rm -rf;

    for src in "$@"; do
        [[ "$src" =~ ^"-" ]] && continue;
        srcpath=$(cd "$(dirname "${src}")"; pwd |tr '/' '|');
        dst="${trash}/${datetime}${srcpath}|$(basename "$src")";
        mv "$src" "$dst" && touch "$dst";
    done
}

显示Fiddler的目标服务器IP地址

Published: Tags: WEB DNS

服务器在响应请求之后,我们就能知道它的IP地址,在Fiddler Rules添加如下代码即可:

static function Main() {
    var today: Date = new Date();
    FiddlerObject.StatusText = " CustomRules.js was loaded at: " + today;

    // Uncomment to add a "Server" column containing the response "Server" header, if present
    // UI.lvSessions.AddBoundColumn("Server", 50, "@response.server");

    // Uncomment to add a global hotkey (Win+G) that invokes the ExecAction method below...
    // UI.RegisterCustomHotkey(HotkeyModifiers.Windows, Keys.G, "screenshot"); 

    UI.lvSessions.AddBoundColumn("ServerIP", 50, "X-HOSTIP");
}

配置Nginx使用Https的最简单方法

Published: Tags: LINUX NGINX

年初的时候笔者所在的公司就配置了JAVA和NGINX的SSL接入,然而最近有个朋友也需要把NGINX加上HTTPS, 但是网上配置太多让人眼花缭乱,因此为了不求甚解,笔者就以最简单的方式为NGINX加上HTTPS的访问协议啦~

以下是原始的Nginx默认接入配置:

server {
    listen       80;
    server_name  test.jtwo.me;

    root /data/www;

    location / {
        index index.php index.html;
    }

    location ~ \.php$ {
        include        fastcgi_params;
        fastcgi_pass   127.0.0.1:9000;
    }

    location ~* \.(?!(php|jsp|asp|aspx)$) {
        add_header Cache-Control "max-age=31536000";
    }
}

然后,其实添加HTTPS只需要三行(同时修改443默认端口):

server {
    listen       443; # HTTPS
    server_name  test.jtwo.me;

    # 只需要增加以下三行配置
    ssl                  on;
    ssl_certificate      "/data/ssl/nginx.crt";
    ssl_certificate_key  "/data/ssl/nginx.key";

    root /data/www;

    location / {
        index index.php index.html;
    }

    location ~ \.php$ {
        include        fastcgi_params;
        fastcgi_pass   127.0.0.1:9000;
    }

    location ~* \.(?!(php|jsp|asp|aspx)$) {
        add_header Cache-Control "max-age=31536000";
    }
}

看,就这么简单!ssl_certificate是CA颁发的证书,ssl_certificate_key是申请证书时的私钥。

####附加资料: * 免费SSL证书申请-腾讯云-免费一年 * 免费SSL证书申请-StartSSL-免费一年 * Nginx官方文档-Https模块说明(英文)

强制让Nginx压缩包头中未带GZip的请求

Published: Tags: LINUX NGINX

假设你已经把Nginx的GZip压缩配置正常打开了,如果没有的话麻烦先去Google相关资料,以下是针对请求头中未带「Accept-Encoding: gzip」包头时,也让Nginx始终进行GZip压缩并返回的方法。

####通常的方法有两种: * 使用Nginx的第三方模块「headers-more-nginx-module」,优点是功能齐全、配置简单,缺点是要重新编译,对于Yum/Apt安装之类的Nginx有些麻烦。 * 启动两个Nginx进程服务,一个前端修改Header作为反向代理转发,一个作为后端固定会收到GZip包头所以会返回压缩,以下的是这种方法的简化版本。

启动两个Nginx进程太不人性化,所以网上常用的方法是配置两个虚拟主机。但是笔者觉得还是多余了一些,所以对此再作了一些修改,先来看看原始配置:

server {
    listen       80;
    server_name  test.jtwo.me;

    root /data/cdnfile;

    location ~* \.(?!(php|jsp|asp|aspx)$) {
        add_header Access-Control-Allow-Origin *;
        add_header Cache-Control "public, max-age=259200";
    }
}

然后再来看看,经过笔者多次修改,测试后简化的配置:

upstream test.jtwo.me {
    server 127.0.0.1:80;
}
server {
    listen       80;
    server_name  test.jtwo.me;

    root /data/cdnfile;

    location ~* \.(?!(php|jsp|asp|aspx)$) {
        gzip_http_version 1.0;
        proxy_set_header Accept-Encoding gzip;
        if ($http_accept_encoding !~* "gzip") {
            proxy_pass http://test.jtwo.me;
        }
        add_header Access-Control-Allow-Origin *;
        add_header Cache-Control "public, max-age=259200";
    }
}

可以看出来实际上就只是多了几行配置,相比重新编译Nginx,或者启动两个虚拟主机要简单吧?笔者现在解释下修改的指令和参数:

upstream test.jtwo.me 这句就不解释了,太简单网上资料很多,通常可以用于负载均衡等作用。

gzip_http_version 1.0 GZip最低的压缩协议,不能使用默认的1.1,因为Nginx转发用的是1.0协议。

proxy_set_header Accept-Encoding gzip 修改转发请求,加上gzip的包头,只修改转发,并不会影响到正常的请求。

if ($http_accept_encoding !~* "gzip") 如果请求过来的包头中未匹配到gzip关键字,则进入if的逻辑,进行转发。

proxy_pass http://test.jtwo.me 转发到虚拟主机的域名,这个就是server区域的server_name,不要搞错。

####参考资料: * Headers More Nginx Module * Nginx始终返回GZip压缩内容的方法 * 从Nginx默认不压缩 HTTP/1.0 说起

Nginx中Location的非匹配正则写法

Published: Tags: NGINX

最近发现项目中有部分静态文件没有被客户端缓存,是由于location中没加上对应后缀, 因此应该对所有文件进行强缓存的设置,再反过来对几个动态的后缀进行匹配会更简单:

server {
    listen       80;
    server_name  test.jiangjun.vip;

    root /zone/www/test;

    location / {
        index index.php index.html;
    }

    location ~* \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        include        fastcgi_params;
    }

    # 注意写法和顺序,会影响能否正确匹配
    location ~* \.(?!(php|jsp|asp|aspx)$) {
        expires 3650d;
        add_header Cache-Control "max-age=315360000";
    }
}

均衡分配Linux进程的CPU亲和力

Published: Tags: LINUX

Nginx有设置CPU亲和力的配置,只需要修改如下参数并重启进程:

worker_processes 4;
worker_cpu_affinity 1000 0100 0010 0001;

但很多程序(比如PHP)并没有可以设置CPU亲和力的配置,可以使用如下脚本处理:

#!/bin/bash
# * * * * * /worker/cpu/affinity.sh &

CPUs=$(grep -c processor /proc/cpuinfo)
PIDs=$(ps aux | grep "php-fpm[:] pool" | awk '{print $2}')

i=0; for PID in $PIDs; do
    CPU=$(echo "$i % $CPUs" | bc)
    (( i++ ))
    taskset -pc $CPU $PID
done

以上脚本还可以优化,比如根据CPU的平均负载,让每个进程只在低负载CPU中执行。

参考:http://huoding.com/2016/07/19/528

登录vsftp报500 OOPS无法切换目录

Published: Tags: VSFTP LINUX

使用帐号密码能连上FTP,但是ls时却提示无法切换目录:

lftp test@127.0.0.1:~> ls
ls: Login failed: 500 OOPS: cannot change directory:/home/test

原因是SELinux导致的问题,把ftp的家目录开启即可:

setsebool ftp_home_dir on #临时使用,不写入配置,重启失效
setsebool -P ftp_home_dir on #写入配置文件,该命令执行较慢
setsebool -P allow_ftpd_full_access on #遇到553无法创建则启用

参考: http://man.linuxde.net/setsebool http://blog.arithm.com/2009/06/15/