分类
学习笔记

nginx反向代理google

I. 准备工作

首先,需要国外的VPS,推荐搬瓦工。参见

BandwagonHost $3.99 年付 VPS 可以用来搭建 VPN/Shadowsocks

另外需要有自己的域名和ssl噢。

II. 下载和安装nginx

一、编译安装 Nginx

1、首先更新下系统

sudo apt-get update && sudo apt-get upgrade

2、安装的 Nginx 需要的包以及 Git

sudo apt-get install libpcre3 libpcre3-dev zlib1g-dev libssl-dev build-essential git

3、新建立个 Nginx 目录,方便管理

mkdir nginx && cd nginx

下载 Nginx 最新稳定版,用 Git 克隆两个 Nginx 模块,一个是 wen.lu 开源的 ngx_http_google_filter_module,另一个是 Nginx 替换关键词模块 ngx_http_substitutions_filter_module

wget http://nginx.org/download/nginx-1.6.2.tar.gz
tar -xvf nginx-1.6.2.tar.gz
git clone https://github.com/cuber/ngx_http_google_filter_module
git clone https://github.com/yaoweibin/ngx_http_substitutions_filter_module
4、进入 Nginx 目录并创建个 Nginx 临时文件夹

cd nginx-1.6.2
mkdir /var/tmp/nginx

5、使用下面的参数开始编译

./configure
–prefix=/usr –conf-path=/etc/nginx/nginx.conf –pid-path=/var/run/nginx.pid –lock-path=/var/lock/nginx.lock –http-client-body-temp-path=/var/tmp/nginx/client –http-proxy-temp-path=/var/tmp/nginx/proxy –http-fastcgi-temp-path=/var/tmp/nginx/fastcgi –http-scgi-temp-path=/var/tmp/nginx/scgi –http-uwsgi-temp-path=/var/tmp/nginx/uwsgi –with-http_ssl_module –with-http_gzip_static_module
–add-module=/root/nginx/ngx_http_google_filter_module
–add-module=/root/nginx/ngx_http_substitutions_filter_module
PS:如果需要支持 IPv6 请别忘记增加 IPv6 模块 –with-ipv6

6、没问题以后直接用 make 安装

make && make install

III. 配置反代

以下是我的配置示例

server {
 listen 80 ;
 server_name www.liuxiaoting.com;
 return 301 https://www.liuxiaoting.com$request_uri;
}
server {
 listen 443 ssl;
 server_name www.liuxiaoting.com;
 
 ssl on;
 ssl_certificate  /usr/local/nginx/conf/ssl/www.liuxiaoting.com.crt;
 ssl_certificate_key  /usr/local/nginx/conf/ssl/www.liuxiaoting.com.key;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 ssl_prefer_server_ciphers on;
 ssl_ciphers ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM;
 keepalive_timeout 70;
 ssl_session_cache shared:SSL:10m;
 ssl_session_timeout 10m;
 resolver 8.8.8.8;
 location / {
       subs_filter google.com liuxiaoting.com; # 地址重写
        proxy_pass        https://www.google.com;
        proxy_set_header   X-Real-IP  $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   Referer http://$host; }
}

IV. 需要注意

  • sub_filter需要ngx_http_sub_module模块,编译时需要加上对应参数。

Reference:

http://nginx.com/resources/admin-guide/reverse-proxy/

分类
学习笔记

ubuntu中使用rsync+inotify-tools+ssh文件实时同步

在代码服务器(192.168.1.251)上安装inotify,执行如下命令

tar xzvf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure
make
make install
cd ..

或者 apt-get install inotify-tools

在其他服务器上(代码服务器和需要同步的服务器)上安装rsync,命令如下:

tar zxvf rsync-3.0.9.tar.gz
cd rsync-3.0.9
./configure
make
make install

或者 apt-get install rsync

#——以上命令在每台服务器上都需要执行———

在代码服务器与需要同步的服务器之间配置ssh key信任,在代码服务器上生成公钥和私钥
ssh-keygen -t rsa

直接三次回车

将公钥添加到各个需要更新的主机authorized_keys 文件中,在代码更新服务器上再执行
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
如果有提示 输入yes
按提示输入密码回车

然后需要服务器(192.168.1.252)重启ssh
service sshd restart
在代码服务器上以root身份创建inotify_rsync.sh脚本vi /root/inotify_rsync.sh 输入

#!/bin/sh
SRC=/home/guodong.me/    #代码发布服务器目录
DST=/home/guodong.me/    #目标服务器目录
IP="1.1.1.1.1"    #目标服务器IP,多个以空格隔开
USER=root
/usr/bin/inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w%f %e' --exclude "(.swp|.swx|.svn)" -e create,move,delete,close_write,attrib $SRC | while read files
do
for i in $IP
do
    /usr/bin/rsync -vzaqcut /home/guodong.me   [email protected]:/home/wwwroot/   --exclude  Runtime  --delete  -e  "ssh -p 99999"
    echo $files >>/tmp/rsync.log 2>&1 
done
done

相关解释:

uusr/local/bin/inotifywait -mrq –timefmt ‘%Y-%m-%d %H:%M’ –format ‘%T %w%f %e’ –exclude “(.swp|.swx|.svn)” \
-e create,move,delete,close_write,attrib $SRC | while read files

-m 是保持一直监听
-r 是递归查看目录
-q 是打印出事件
-e create,move,delete,close_write,attrib 是指 “监听 创建 移动 删除 写入 权限” 事件

/usr/local/bin/rsync -ahqzt –exclude Runtime –delete $SRC [email protected]$i:$DST
-a 存档模式
-h 保存硬连接
-q 制止非错误信息
-z 压缩文件数据后传输
-t 维护修改时间
-delete 删除于多余文件
–exclude 排除同步的文件

然后赋予脚本可执行权限

chmod +x /root/inotify_rsync.sh

设置开机自启动 echo “/root/inotify_rsync.sh &” >> /etc/rc.local
执行脚本/root/inotify_rsync.sh &

ok ,更新文件测试下吧。

备注

我在部署过程中,由于默认不是22端口,需要定义端口,详见上面示例。

参考文章

 

 

分类
学习笔记

使用定时脚本自动备份VPS数据到Dropbox

一、登录Dropbox并创建一个APP

登录之后,通过这个地址:https://www.dropbox.com/developers/apps
点击Create an app创建一个APP,填写相关信息之后,选择Full Dropbox之后点击Create创建。

二、下载Dropbox-Uploader

下载地址:https://github.com/andreafabrizi/Dropbox-Uploader
下载之后上传至VPS的root目录。

三、赋予执行权限并绑定Dropbox APP

ssh执行,建议使用Xshell。
赋予Dropbox-Uploader.sh执行权限

chmod +x dropbox_uploader.sh

然后绑定APP

./dropbox_uploader.sh info

按提示分别输入App key和App secret,然后输入 Y 确认;
之后会出现如下:

> App key is 1ow34ylqwerk0zn, App secret is 38l3ijtutdpiewn and Access level is Full Dropbox. Looks ok? [y/n]: y

> Token request... OK

Please open the following URL in your browser, and allow Dropbox Uploader
to access your DropBox folder:

--> https://www.dropbox.com/1/oauth/authorize?oauth_toke=xxxxxxxxxxxxxxxxxxxx

 

复制链接在浏览器中打开(可能需要翻墙)并点击Allow绑定APP,然后回到Xshell按Enter。
之后可以执行下面的命令测试上传,提示Done就是绑定成功了。

./dropbox_uploader.sh upload /etc/passwd /backup/passwd.old

四、添加自动备份脚本

在Xshell中执行:

vi backup.sh
#!/bin/bash
DROPBOX_DIR="/backup/$(date +%Y-%m-%d)" #Dropbox上的备份目录
MYSQL_USER="root" #数据库帐号
MYSQL_PASS="123456" #数据库密码
YM_DATA=/usr/local/nginx/conf #nginx配置目录
BACK_DATA=/home/backup #本地备份文件存放目录,手动创建
DATA=/home/wwwroot #网站数据存放目录

#定义数据库的名字和旧数据库的名字
DataBakName=Data_$(date +"%Y%m%d").tar.gz
WebBakName=Web_$(date +%Y%m%d).tar.gz
YMName=YM_$(date +%Y%m%d).tar.gz
OldData=Data_$(date -d -6day +"%Y%m%d").tar.gz
OldWeb=Web_$(date -d -6day +"%Y%m%d").tar.gz
OldYM=YM_$(date -d -6day +"%Y%m%d").tar.gz

#定义Dropbox旧数据的名字(30天前)
Old_DROPBOX_DIR=/backup/$(date -d -30day +%Y-%m-%d) #Dropbox上的备份目录

#删除本地6天前的数据
rm -rf $BACK_DATA/$OldData $BACK_DATA/$OldWeb $BACK_DATA/$OldYM

cd $BACK_DATA

#使用命令导出SQL数据库,并且按数据库分个压缩
for db in `mysql -u$MYSQL_USER -p$MYSQL_PASS -B -N -e 'SHOW DATABASES' | xargs`; do
    (mysqldump -u$MYSQL_USER -p$MYSQL_PASS ${db} | gzip -9 - > ${db}.sql.gz)
done
#压缩数据库文件合并为一个压缩文件
tar zcf $BACK_DATA/$DataBakName $BACK_DATA/*.sql.gz
rm -rf $BACK_DATA/*.sql.gz

#压缩网站数据
cd $DATA
tar zcf $BACK_DATA/$WebBakName ./*

#压缩域名配置数据
cd $YM_DATA
tar zcf $BACK_DATA/$YMName ./*

cd ~
#开始上传
./dropbox_uploader.sh upload $BACK_DATA/$DataBakName $DROPBOX_DIR/$DataBakName
./dropbox_uploader.sh upload $BACK_DATA/$WebBakName $DROPBOX_DIR/$WebBakName
./dropbox_uploader.sh upload $BACK_DATA/$YMName $DROPBOX_DIR/$YMName

#开始删除远程30天前的文件
./dropbox_uploader.sh delete $Old_DROPBOX_DIR/

echo -e "Thank you! all down"

 

按 i 进入编辑模式
适当修改以下内容后,复制粘贴进去

ESC键退出编辑模式,
输入:wq
然后按Enter保存并退出。

五、赋予脚本权限

在Xshell执行

chmod +x backup.sh

六、设置定时任务

执行

crontab -e

在最后加入

00 03 * * * /root/backup.sh

表示每天凌晨三点执行备份脚本。

crontab介绍 http://docs.oracle.com/cd/E24847_01/html/819-6951/sysrescron-12.html

七、最后重启Crontab

service cron restart

重启之后就设置完成了……

如果你不知道服务器当前时间,可以使用下面的命令;
查看当前时间:

date -R

 

例如:

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

 

即修改服务器时区为上海。

分类
学习笔记

SVN配置邮件提醒支持

1、安装svn-notify

$ sudo apt-get install libsvn-notify-perl  libnet-smtpauth-perl

2、安装Perl模块Module::Build

# wget http://search.cpan.org/CPAN/authors/id/D/DA/DAGOLDEN/Module-Build-0.36_11.tar.gz
# tar xvf Module-Build-0.36_11.tar.gz 
# cd Module-Build-0.36_11
# perl Build.PL 
# ./Build 
# ./Build test
# ./Build install
# cd ..

3、安装Perl模块Authen::SASL

# wget http://search.cpan.org/CPAN/authors/id/G/GB/GBARR/Authen-SASL-2.15.tar.gz
# tar xvf Authen-SASL-2.15.tar.gz 
# cd Authen-SASL-2.15
# perl Makefile.PL 
# make test
# make install# cd ..

4、安装Perl模块Net::SMTP_auth

# wget http://search.cpan.org/CPAN/authors/id/A/AP/APLEINER/Net-SMTP_auth-0.08.tar.gz
# tar xvf Net-SMTP_auth-0.08.tar.gz 
# cd Net-SMTP_auth-0.08
# perl Makefile.PL 
# make test
# make install
# cd ..

5、安装Perl模块SVN::Notify

# wget http://search.cpan.org/CPAN/authors/id/D/DW/DWHEELER/SVN-Notify-2.80.tar.gz
# tar xvf SVN-Notify-2.80.tar.gz 
# cd SVN-Notify-2.80
# perl Build.PL 
# ./Build 
# ./Build test
# ./Build install
# cd ..

6、启动邮件服务器

# service sendmail restart
Shutting down sendmail: [FAILED]                                  
Starting sendmail:      [  OK  ]                                        
Starting sm-client:     [  OK  ]                                       

7、配置自动发邮件脚本

修改post-commit脚本,以支持邮件通知功能:

# cd /home/svn/project/hooks/
# vim post-commit

内容如下:

#!/bin/sh
REPOS="$1"
REV="$2"
/usr/bin/svnnotify --repos-path "$1" --revision "$2" --to [email protected] --from [email protected] --handler "HTML::ColorDiff"  --with-diff --smtp localhost --smtp-user root --smtp-pass 5201314318 -c "UTF-8" -g zh_CN -o raw --svnlook /usr/bin/svnlook --subject-prefix '[SVN Update]'
  • to参数代表接收邮件的地址,可以有多个;
  • from参数是虚拟的,代表你的发送地址,一般情况下,这个参数 不重要,但如果接收者的邮件服务器有反垃圾邮件的功能,需要判定源地址的话,这个参数是否合法就显得很重要了。

再给该脚本添加可执行权限:

# chmod +x post-commit

再次提交时,就会给指定邮件地址发信了。

分类
学习笔记

解决MySQL主从同步错误

可以利用SET GLOBAL sql_slave_skip_counter命令来跳过错误,从而回到正常的运行轨道中。

在从服务器键入以下命令:

slave stop;  停止同步

SET GLOBAL sql_slave_skip_counter =1 ; 执行跳过错误, 后面的参数可以理解为 上面SHOW BINLOG命令显示结果的第几行,例如错误出现在第几行就写几。

slave start; 开始同步,问题解决。

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

时,即说明同步又运行起来了。

相关知识库

背景知识1

在主从库维护中,有时候需要跳过某个无法执行的命令,需要在slave处于stop状态下,执行 set global sql_slave_skip_counter=N以跳过命令。常用的且不易用错的是N=1的情况,但N>1时,则不那么顾名思义,本文详细介绍N的意义,及使用注意事项。

背景知识2

MySQL从库从主库上复制binlog文件内容到本地执行。在binlog上命令以event的形式存在,并非一个命令对应一个event。以一个insert语句为例(引擎InnoDB、binglog_format=statement), 在binlog中实际上有三个event,分别为begin\insert\commit 。 命令类型都是Query_log_event.

而set global sql_slave_skip_counter=N的意思,即为在start slave时,从当前位置起,跳过N个event。每跳过一个event,则N–.

与实际情况不符?

看到这里有同学就会问,这是有问题的。如果当前的执行位置是某个insert语句开头,那使用 N=1实际上是从begin\insert\commit的第二个开始执行,这个insert语句还是不能被跳过?

实际上这里还有两个策略:

1、若N=1且当前event为BEGIN, 则N不变,跳过当前event继续。

2、若N=1且当前event处于一个事务之内(BEGIN之后,COMMIT之前),则N不变,跳过当前event继续。

说明:其实上面两个策略合起来就是一句话,当N=1时,会连续跳过若干个event,直到当前所在的事务结束。

当然如果N>1,则每跳过一个event都要N–.

命令举例:

所以我们平时最常用的N=1的情况,都是下一个事务

假设某个Pos之后执行如下命令( 引擎InnoDB、binglog_format=statement),

insert into t values(x1);

begin;

insert into t values(x2);

insert into t values(x3);

commit;

insert into t values(x4);

你的从库stop在Pos上,假设你要跳过前面几个命令直接执行插入x4的操作,则你的N设置为 4或5或6或7均可。(X1语句为3个event)

其他说明:

上面举例中都特别说明了在innodb引擎和statement模式下。其他情况区别如下:

1、若引擎为myisam(等不支持事务的引擎),且在statement下,则binlog中不会有begin和commit,每个命令都是一个event;

2、row模式的binlog里,一个insert语句实际上是两个event(Table_map_event和 Row_log_event), 计算时应与statement不同。

3、在row模式下,不论引擎是否支持事务,一个insert语句都会加上BEGIN和commit,也即变成4个event。

4、基于InnoDB引擎表的insert/delete/update操作都有显式样的BEGIN /COMMIT.

上面举的这个例子中,若为row模式,则要直接执行X4语句需要设置的N为 5~10均可。

小结:

1、set global sql_slave_skip_counter=N中的N是指跳过N个event

2、最好记的是N被设置为1时,效果跳过下一个事务

3、跳过第N个event后,位置若刚好落在一个事务内部,则会跳过这整个事务

4、一个insert/update/delete不一定只对应一个event,由引擎和日志格式决定