nginx 配置密码访问特定的模块

如果web上的一些内容不想被其他人知道,但是又需要让部分人看到,我们可以利用nginx_http_auth_basic_module模块来实现此功能

默认情况下nginx已经安装了ngx_http_auth_basic_module模块

1.生成密码文件

一般可以使用两种工具来生成密码文件htpasswd和openssl,此处我们使用openssl来生成密码文件

使用

sudo sh -c "echo -n 'song:' >> /etc/nginx/.htpasswd"

来创建一个名为song的用户

使用

sudo sh -c "openssl passwd -apr1 >> /etc/nginx/.htpasswd"

来创建密码

2.配置Nginx密码验证

打开希望添加限制的服务器块配置文件。在此位置块中,使用auth_basic指令打开身份验证并选择在展示提示凭据时向用户显示的提示语。使用auth_basic_user_file指令将Nginx指向我们创建的密码文件,如

location ^~/private / {
     auth_basic " private  area";
     auth_basic_user_file /etc/nginx/.htpasswd;
 }

更多关于nginx配置的知识,可以参考官方的文档,再次不再赘述

3.重启nginx,验证访问效果

使用

nginx –t

检查配置文件有无错误,如果有错误,则需要及时的更改

检查无误后,使用

nginx –s reload 

来重启nginx

访问查看密码验证是否生效

如果提示类似下面的认证选项,则配置成功。

如有错误,请大家批评指正,谢谢,祝好!

发表在 linux | 留下评论

移动光猫HG6201M定期重启设置

由于使用了移动的光猫时间一长之后就会出现网络变慢的情况,需要对设备进行定时重启,但是后台里面发现没有定时重启的功能,所以查阅相关资料,可以通过执行特定的脚本来实现定时重启。

浏览器访问http://192.168.1.1/cgi-bin/telnetenable.cgi?telnetenable=1,然后打开终端

 telnet 192.168.1.1 

使用用户名:root 密码:hg2x0 登陆 

登陆成功之后,在/root下新建文件reboot.sh,并使用vi编辑器,编写脚本

#!/bin/sh
sleep 1d 5h     # 每次重启后睡眠1天5小时,即每两天重启一次
startTime="030000"  # 03:00:00 am,即凌晨3点
endTime="040005"    # 凌晨4点零5秒
while true
do
    currentTime=`date +"%H%M%S"`  # 获得当前时间
if [[ $currentTime -ge $startTime && $currentTime -le $endTime ]];  # 循环检查时间
then
    reboot     # 重启
else
    :          # 空命令
fi
    sleep 1h   # 睡眠1小时
done

设置权限 

chmod +x /root/reboot.sh 

设置开机执行,编辑/etc/profile在最后加上 

/root/reboot.sh &

参考文章:http://3sv.ktsee.com/blog.php?tid=4444

发表在 其他 | 移动光猫HG6201M定期重启设置已关闭评论

centos不联网情况下,使用系统镜像作为本地源安装软件

有些项目的服务器是不能访问外网的,比如一些公积金的项目,以及一些其他的涉密程度比较高的项目。这在保证安全性的同时,也该开发带来了非常大的不便,非常的坑爹,比如导致centos中的yum不能使用,在此时我们就需要把那系统镜像文件作为本地源来安装软件

1.创建挂载点

mkdir /media/CentOS

2.挂载到指定的目录中

mount -o loop /home/judeng/centos6.5-x86_64.iso /media/CentOS

3. 禁用默认的网络源

cd  /etc/yum.repos.d/ #进入源存放的目录
mv  CentOS-Base.repo CentOS-Base.repo.bak #备份指定的源,有备无患 如果有多个,则需要将多个改名(备份)

4.编辑本地源配置文件CentOS-Media.repo

使用vim编辑器(vi以及其他编辑器也可以)

[c6-media]                        #随便起的名字,可以不改
name=CentOS                       #也可以不改
baseurl=file:///media/CentOS      #file后是冒号和三个斜杠啊!
gpgcheck=0                        #关掉gpg检查
enabled=1                         #开启,一定要置1
发表在 linux | 留下评论

一个磁盘挂载的shell脚本

每次linux服务器在分配了新的磁盘之后就需要手动去挂载一下,用命令行操作不是很方便,而且操作不当会导致服务器开不了机的严重后果,所以我根据实际的需要修改个编写了一个磁盘挂在的脚本,目前测试没有太大问题,希望可以帮助到有需要的同学们

#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
LANG=en_US.UTF-8
setup_path=/deya
#if [ $1 != “” ];then
#setup_path=$1;
#fi

#检测磁盘数量
sysDisk=`cat /proc/partitions|grep -v name|grep -v ram|awk ‘{print $4}’|grep -v ‘^$’|grep -v ‘[0-9]$’|grep -v ‘vda’|grep -v ‘xvda’|grep -v ‘sda’|grep -e ‘vd’ -e ‘sd’ -e ‘xvd’`
if [ “${sysDisk}” == “” ]; then
echo -e “ERROR!This server has only one hard drive,exit”
echo -e “此服务器只有一块磁盘,我挂不了”
echo -e “告辞”
exit;
fi
#检测指定目录是否已挂载磁盘
mountDisk=`df -h | awk ‘{print $6}’ |grep deya`
if [ “${mountDisk}” != “” ]; then
echo -e “target directory has been mounted,exit”
echo -e “指定目录已被挂载,不执行任何操作”
echo -e “告辞”
exit;
fi
#检测是否有windows分区
winDisk=`fdisk -l |grep “NTFS\|FAT32″`
if [ “${winDisk}” != “” ];then
echo ‘Warning: The Windows partition was detected. For your data security, Mount manually.’;
echo “危险 数据盘为windwos分区,为了你的数据安全,请手动挂载,本脚本不执行任何操作。”
exit;
fi
echo “
+———————————————————————-
| Automatic disk tool
+———————————————————————-
| Test.ver1.0.1
+———————————————————————-
| Auto mount partition disk to $setup_path
+———————————————————————-

#数据盘自动分区
fdiskP(){

for i in `cat /proc/partitions|grep -v name|grep -v ram|awk ‘{print $4}’|grep -v ‘^$’|grep -v ‘[0-9]$’|grep -v ‘vda’|grep -v ‘xvda’|grep -v ‘sda’|grep -e ‘vd’ -e ‘sd’ -e ‘xvd’`;
do
#判断指定目录是否被挂载
isR=`df -P|grep $setup_path`
if [ “$isR” != “” ];then
echo “Error: The $setup_path directory has been mounted.”
return;
fi

isM=`df -P|grep ‘/dev/${i}1’`
if [ “$isM” != “” ];then
echo “/dev/${i}1 has been mounted.”
continue;
fi

#判断是否存在未分区磁盘
isP=`fdisk -l /dev/$i |grep -v ‘bytes’|grep “$i[1-9]*”`
if [ “$isP” = “” ];then
#开始分区
fdisk -S 56 /dev/$i << EOF n p 1 wq EOF sleep 5 #检查是否分区成功 checkP=`fdisk -l /dev/$i|grep "/dev/${i}1"` if [ "$checkP" != "" ];then #格式化分区 mkfs.ext4 /dev/${i}1 mkdir $setup_path #挂载分区 sed -i "/\/dev\/${i}1/d" /etc/fstab echo "/dev/${i}1 $setup_path ext4 defaults 0 0" >> /etc/fstab
mount -a
df -h
fi
else
#判断是否存在Windows磁盘分区
isN=`fdisk -l /dev/$i|grep -v ‘bytes’|grep -v “NTFS”|grep -v “FAT32″`
if [ “$isN” = “” ];then
echo ‘Warning: The Windows partition was detected. For your data security, Mount manually.’;
return;
fi

#挂载已有分区
checkR=`df -P|grep “/dev/$i”`
if [ “$checkR” = “” ];then
mkdir $setup_path
sed -i “/\/dev\/${i}1/d” /etc/fstab
echo “/dev/${i}1 $setup_path ext4 defaults 0 0” >> /etc/fstab
mount -a
df -h
fi

#清理不可写分区
echo ‘True’ > $setup_path/checkD.pl
if [ ! -f $setup_path/checkD.pl ];then
sed -i “/\/dev\/${i}1/d” /etc/fstab
mount -a
df -h
else
rm -f $setup_path/checkD.pl
fi
fi
done
}

while [ “$go” != ‘y’ ] && [ “$go” != ‘n’ ]
do
read -p “Do you want to try to mount the data disk to the $setup_path directory?(y/n): ” go;
done

if [ “$go” = ‘n’ ];then
echo -e “告辞!”
exit;
fi

#执行挂载操作
fdiskP
echo -e “”
echo -e “Done”
echo -e “挂载成功”

将上面的脚本保存成一个文件,赋予一个执行的权限,即可自动挂载磁盘到我们设置好的目录下

上面的代码也可以点击这里下载

发表在 linux shell | 一个磁盘挂载的shell脚本已关闭评论

javascript实现继承的几种方式

最近看到了关于js继承的一些东西,在此做个记录,方便日后查阅。

1.属性拷贝继承

解释:就是将对象成员复制一份给需要继承的对象

例子:

//使用对象字面量的方式创建一个对象
var fatherobj={
    name:'xiaoli',
    age:'18',
    showName:function () {
        console.log(this.name);
    }
};

//创建一个需要继承的子对象
var subObj={};

//属性拷贝
for(var i in fatherobj){
    subObj[i]=fatherobj[i];
}
console.log("fatherObj",fatherobj);
console.log("subObj",subObj);

缺点:如果继承过来的成员是引用类型的话,那么这个引用类型的成员在父对象和子对象之间是共享的,也就是说修改了之后, 父子对象都会受到影响

2. 原型式继承

这是一种借用构造函数的原型对象实现继承的方法

例:

SubClass.prototype = SuperClass.prototype;

存在的问题: 父构造函数的原型对象和子构造函数的原型对象上的成员有共享问题, 只能继承父构造函数的原型对象上的成员, 不能继承父构造函数的实例对象的成员

3. 原型链继承

子构造函数.prototype = new 父构造函数()
//构造父构造函数
function SuperClass() {
    this.name='xiaoli';
    this.age=18;
    this.showName=function () {
        console.log(this.name);
    }
}

//设置父构造函数的原型
SuperClass.prototype.langeage=['chinese'];
SuperClass.prototype.showAge=function () {
    console.log(this.age);
};

//子构造函数
function SubClass() {
}

//继承的实现
SubClass.prototype=new SuperClass();
// 修改子构造函数的原型的构造器属性
SubClass.prototype.constructor = SubClass;

//实例化一个对象
var p1=new SubClass();
console.log(p1.langeage);
console.log(p1.name);

p1.showAge();
//此时我们改变home的时候,父构造函数的原型对象也会变化
p1.langeage.push('english');
console.log(p1.langeage);
var p2=new SubClass();
console.log(p2.langeage);

问题:不能给父构造函数传递参数,父子构造函数的原型对象之间有共享问题

4.构造函数实现的继承

使用call和apply借用其他构造函数的成员, 可以解决给父构造函数传递参数的问题, 但是获取不到父构造函数原型上的成员.也不存在共享问题

//创建父构造函数
function Person(name) {
    this.name=name;
    this.sex=['boy','girl'];
    this.showName=function () {
        console.log(this.name);
    }
}

//创建子构造函数
function Student(name) {
    //使用call来借用Person的构造函数
    Person.call(this,name);
}

//测试
var stu1=new  Student("xiaoli");
stu1.showName();

5. 组合继承

使用 构造函数 + 原型式继承

//创建父构造函数
function Person(name) {
    this.name=name;
    this.sex=['boy','girl'];
    this.showName=function () {
        console.log(this.name);
    }
}
//设置父构造函数的原型对象
Person.prototype.showSex=function () {
  console.log(this.sex);
};

//创建子构造函数
function Student(name) {
    //使用call来借用Person的构造函数
    Person.call(this,name);
}

// 实现继承
Student.prototype=Person.prototype;
Student.prototype.constructor=Student;

//测试
var stu1=new  Student("xiaoli");
stu1.showName();
stu1.showSex();

6. 构造函数 + 深拷贝

function deepCopy(obj1, obj2) {
    for (var key in obj2) {
        // 判断是否是obj2上的实例成员
        if (obj2.hasOwnProperty(key)) {
            // 判断是否是引用类型的成员变量
            if (typeof obj2[key] == 'object') {
                obj1[key] = Array.isArray(obj2[key]) ? [] : {};
                deepCopy(obj1[key], obj2[key]);
            } else {
                obj1[key] = obj2[key];
            }
        }
    }
}

//创建父构造函数
function Person(name) {
    this.name=name;
    this.sex=['boy','girl'];
    this.showName=function () {
        console.log(this.name);
    }
}
//设置父构造函数的原型对象
Person.prototype.showSex=function () {
  console.log(this.sex);
};

//创建子构造函数
function Student(name) {
    //使用call来借用Person的构造函数
    Person.call(this,name);
}

// 使用深拷贝实现继承
deepCopy(Student.prototype,Person.prototype);
Student.prototype.constructor=Student;

//测试
var stu1=new  Student("xiaoli");
stu1.showName();
stu1.showSex();
发表在 javascript | javascript实现继承的几种方式已关闭评论

Javascript正则表达式之lastIndex属性问题

一次写正则的时候遇到了一些问题,是关于就JavaScript的RegExp对象的lastIndex属性的,由于这个很烦人的属性导致代码除了一些问题,在此作一个记录

每个RegExp对象都包含5个属性,source、global、ignoreCase、multiline、lastIndex

source:是一个只读的字符串,包含正则表达式的文本

global:是一个只读的布尔值,看是否带有修饰符g,g表示全局, 默认false

ignoreCase:是一个只读的布尔值,看是否带有修饰符i,i表示是否忽略大小写,默认false

multiline:是一个只读的布尔值,看是否带有修饰符m,m表示是否多行匹配,默认false

lastIndex:是一个可读/写的整数,如果匹配模式中带有g修饰符,这个属性存储在整个字符串中下一次检索的开始位置,这个属性会被如exec( ) 和 test( ) 这样的方法用到

当调用test( )的正则表达式对象具有修饰符g时,因为它从lastIndex指定的位置处开始检索某个字符串,如果它找到了一个匹配结果,那么它就立即设置lastIndex为紧挨着匹配子串的字符位置

var str="JavaScript";
var reg=/JavaScript/g;
console.log(reg.test(str)); //打印 true
console.log(reg.test(str)); //打印 false

同样的正则表达式,却打印的不一样

var str="JavaScript";
var reg=/JavaScript/g;
console.log(reg.test(str)); //打印 true
console.log(reg.lastIndex);
//打印10,因为匹配到了JavaScript,所以设置lastIndex为匹配结果紧挨着的字符位置
console.log(reg.test(str));
//打印 false,因为从lastIndex位置检索字符串,已经没有匹配结果了
console.log(reg.lastIndex);
//打印0,因为没有匹配到结果,所以将lastIndex重置为0

这里注意一点,如果第一次调用test( )匹配结束后,我们手动将lastIndex重置为0,那么第二次调用test( ),同样可以打印true

var str="java JavaScript java";
var reg=/JavaScript/g;
console.log(reg.test(str)); //打印 true
reg.lastIndex=0;
console.log(reg.test(str)); //打印 true

另外我们也可以每次在匹配的时候实例化一个RegExp对象,这样也不会出错,但是这样会增加内存的消耗,所以不推荐这样做

上面说的关于lastIndex的问题,是因为有修饰符g,如果不带有修饰符g,就不用担心这些问题了

发表在 javascript | Javascript正则表达式之lastIndex属性问题已关闭评论