为Nginx添加basic_auth

为Nginx添加basic_auth,意思就是访问页面的时候需要弹出来一个用户和密码验证的东西,本文基于CentOS 6

1, 安装密码生成工具htpasswd并生成用户密码文件

yum install httpd-tools               #适用centos
sudo apt-get install apache2-utils    #适用ubuntu

生成用户密码文件

$ htpasswd -c /var/www/html/.htpasswd user1  #回车会要求输入两遍密码,会清除所有用户!
$ htpasswd -bc /var/www/html/.htpasswd user1 password  #不用回车,直接指定user1的密码为password
$ htpasswd -b /var/www/html/.htpasswd user2 password   #添加一个用户,如果用户已存在,则是修改密码
$ htpasswd -D /var/www/html/.htpasswd user2  #删除用户

2, 为Nginx添加basic_auth配置

server {
	listen		80;
#	root		/tmp;
#	index		index.html index.htm;
	server_name	zhukun.net www.zhukun.net;

	location / {
		auth_basic		"input you user name and password";
		auth_basic_user_file	/export/servers/.htpasswd;
		proxy_pass http://127.0.0.1:9000;
	}
}

然后再次访问zhukun.net时便会弹出验证框要求输入用户名和密码。 继续阅读

Excel转换txt & 批量筛选IP & 批量扫描服务器信息

假设,有一个智障同事,发了一个Excel过来(里面含有多张表格),要求扫描里面所有的IP是否有网卡故障,比如下面这样的
Excel转换txt

先不说IP数量多少的问题,里面有多张表格,并且有多个列,每一列都有不少IP,IP呢,还有分为172开头的(物理机),和10开头的(Docker),看起来好像复杂死了。

这里说一下我的处理方式。

找一个Excel转换成JSON/TXT的工具(比如这个Excel To Formula View),转换以后的效果如下
Excel To Formula View 继续阅读

ansible文件内容替换+在远程主机上运行多个command

ansible在远程主机上进行文件内容替换可以使用lineinfile来实现,可以使用正则筛选到所需要的行,然后进行替换,本文进行了演示。

ansible在远程主机上运行多个command,标准写法为

  - name: install an apple
    command: "{{item}}"
    with_items:
     - tar -xvzf /tmp/apple.tar.gz creates=/tmp/apple
     - /tmp/apple/install.sh --default creates=/etc/apple
     - rm -rf /tmp/apple

实例
假设有一个process.ymal

- hosts: new
  user: admin
  vars:
     ps_env: "{{ ps_env }}"
  tasks:
   - name: push ~/.ssh/id_rsa/pub to remote .ssh/authorized_keys
     authorized_key: user=admin state=present key="{{ lookup('file', '/home/admin/.ssh/id_rsa.pub') }}"

   - name: push ump_agent_code to remote
     copy: src=/opt/zhukun/ump_agent/bin dest=/home/admin/zhukun owner=admin group=admin mode=644 backup=yes follow=yes

   - name: prepare the product/test enviroment of PS
     command: sed -i "s,stage,{{ ps_env }},g" /home/admin/zhukun/bin/config.json

   - name: prepare the product/test enviroment of PS
     lineinfile:
       dest: /home/admin/zhukun/bin/config.json
       regexp: '^.*[PRODUCT].*$'
       line: '"PRODUCT": "{{ ps_env }}"'

   - name: reboot the observer-agent service
     command: "{{ item }}"
     with_items:
      - ps -ef | grep /export/App/observer-agent.jd.local/bin | grep -v grep | awk '{ print $2}' | xargs kill
      - /export/App/observer-agent.jd.local/bin/start.sh

   - name: reboot the PS service
     command: ps -ef | grep /export/Packages/prediction_service/latest/prediction_service | grep -v grep | awk '{ print $2}' | xargs kill

继续阅读

ansible批量推送ssh key+批量推送文件(夹)

ansible批量推送ssh key的方法,这里记录一下。

假设有以下主机列表

$ cat /opt/list
[new]
172.20.121.109
172.20.114.69
172.20.114.57
172.20.114.58
172.20.114.59

1,使用ansible命令来推送SSH Key
命令比较简单,一行即可搞定

$ ansible -i /opt/list new -m authorized_key -a "user=admin key='{{ lookup('file','/home/admin/.ssh/id_rsa.pub') }}'" -k

这里解释一下命令:
-i表示指定IP列表文件位置,后面的new表示文件里的分组
-k表示询问目标IP的密码
-a后面表示authorized_key模块的参数,user和key是2个必需的参数,也可以加一个默认参数state=present(加不加均可),如果设置state=absent则表示删除这一条key
经测试,反复运行多次此命令,远程机器上的~/.ssh/authorized_keys文件里只会存在一行,不会存在多行key。

2,使用playbook来推送SSH key

$ vim key.ymal 
- hosts: new
  user: admin
  tasks:
   - name: Set authorized key took from file
     authorized_key: user=admin state=present key="{{ lookup('file', '/home/admin/.ssh/id_rsa.pub') }}"

文件解释:
hosts: 表示/opt/list文件里的分组
user: 表示本地用户,这里如果写错可能导致执行失败

$ ansible-playbook -i /opt/list key.ymal -k

继续阅读

Shell处理json数据

Shell处理json数据的方法,简单介绍一下,本文基于CentOS 6 64bit。

yum install jq    #需要EPEL源

下面我们有一个config.json文件

{
  "USERNAME": "admin",
  "CLUSTERMAP_HOSTS": {
      "staging":{
          "pc": "10.191.130.70",
          "app": "10.191.76.250",
          "wx": "172.28.172.171"
      },
      "production":{
          "mjq_pc":"172.28.139.30",
          "mjq_app":"172.28.148.150",
          "mjq_weixin":"172.28.149.84",
          "mjq_qq":"172.28.149.77",
          "lf_pc":"172.20.145.51",
          "lf_app":"172.20.145.40",
          "lf_weixin":"172.20.145.86",
          "lf_qq":"172.20.112.150",
          "jos":"172.20.145.50",
          "lf_coupon":"172.20.112.44",
          "mjq_coupon":"172.28.139.48"
      },
      "ab":{
          "mjq_pc":"172.28.175.36",
          "lf_app":"172.20.121.107"
      }
  },
  "CLUSTERMAP_BINARY_PATH": "/export/App/jd_search/clustermap/bin"
}

获得分片

$ cat config.json | jq '.CLUSTERMAP_HOSTS.production'
[
  {
    "lf_app": "172.20.121.107",
    "mjq_pc": "172.28.175.36"
  },
  {
    "mjq_coupon": "172.28.139.48",
    "lf_coupon": "172.20.112.44",
    "jos": "172.20.145.50",
    "mjq_pc": "172.28.139.30",
    "mjq_app": "172.28.148.150",
    "mjq_weixin": "172.28.149.84",
    "mjq_qq": "172.28.149.77",
    "lf_pc": "172.20.145.51",
    "lf_app": "172.20.145.40",
    "lf_weixin": "172.20.145.86",
    "lf_qq": "172.20.112.150"
  },
  {
    "wx": "172.28.172.171",
    "app": "10.191.76.250",
    "pc": "10.191.130.70"
  }
]

获得Key列表 继续阅读

解决swapper: page allocation failure. order:4, mode:0x20

一般在小内存的机器上会遇到这样的问题,这里附上解决办法

先看一下系统设置

$ cat /proc/sys/vm/zone_reclaim_mode
0

$ cat /proc/sys/vm/min_free_kbytes
1433

解决办法:

$ sysctl -w vm.zone_reclaim_mode=1
#当区域内存不足时允许使用内存回收,此项默认被禁用,因为对服务器来说,Cache非常重要

$ sysctl -w vm.min_free_kbytes=2048
#告诉内核随时保持2M的内存空闲
#当可用内存低于这个参数时, 系统开始回收Cache内存, 以释放内存, 直到可用内存大于这个值
#值越高, 内核越早开始回收内存, 空闲内存越高
#设定这个参数时请小心, 因为该值过低和过高都有问题
#太低可防止系统重新利用内存, 这可导致系统挂起并让 OOM 杀死多个进程
#将这个参数值设定太高(占系统总内存的 5-10%)会让您的系统很快会内存不足
#Linux 的设计是使用所有可用 RAM 缓存文件系统Cache. 该值设定太高的结果是在该系统中花费太多时间重新利用内存
#默认值:
 * 16MB:    512k 
 * 32MB:    724k 
 * 64MB:    1024k 
 * 128MB:   1448k 
 * 256MB:   2048k 
 * 512MB:   2896k 
 * 1024MB:  4096k 
 * 2048MB:  5792k 
 * 4096MB:  8192k 
 * 8192MB:  11584k 
 * 16384MB: 16384k 

$ echo 'vm.zone_reclaim_mode = 1' >> /etc/sysctl.conf
$ echo 'vm.min_free_kbytes = 2048' >> /etc/sysctl.conf

然后可以确认一下

cat /proc/sys/vm/zone_reclaim_mode
1
cat /proc/sys/vm/min_free_kbytes
2048

参考文档
内核参数Zone_reclaim_mode介绍
内存域水印值:min_free_kbytes

使用命令/脚本增加/删除crontab项

使用命令/脚本增加/删除crontab项,记录一下吧.

一, 删某一项cron任务

方法1(仅适用root,不推荐)
修改/var/spool/cron/root文件

这个方法有以下问题:
1, 只有root用户可以修改,其它用户均没有权限,因为/var/spool/cron这个目录的属主及属组均是root,且目录权限是700, 因此其它用户没有权限进入此目录去修改自己的/var/spool/cron/username文件.

方法2
如果某个用户要删除自己的cron任务, 那么只需要执行

crontab -l

crontab -l | grep -v 'config-edit.163.com/config_dir/newsyn' | crontab -

crontab -l | grep -v 'tomcatRoot/jd_product/data/jd_product.txt' | crontab -

如果root需要删除某个用户的cron任务, 那么

crontab -u USERNAME -l

crontab -u USERNAME -l | grep -v 'config-edit.163.com/config_dir/newsyn'  | crontab -u USERNAME -

crontab -u USERNAME -l | grep -v 'tomcatRoot/jd_product/data/jd_product.txt'  | crontab -u USERNAME -

提示: -u参数仅有root可以调用.

也可以这么做

crontab -l | grep -v 'config-edit.163.com/config_dir/newsyn' > cron.base
crontab cron.base

继续阅读

第 3 页,共 30 页123456...102030...最旧 »