09月13, 2015

博客这几天的折腾

从上次说 博客改版计划 开始,后来几天时间就使用nodejsthinkjs开发完成并上线了,整个架构是:

  • 后端使用thinkjs
  • mysql强力驱动
  • nginx代理域名

主机一直使用的香港的主机,一直比较稳定,不过从上月起主机频繁的重启,后来居然给我换了主机(ip),于是我决定迁移到阿里云,买的配置是1G,1M,1核,但运行起来没有卡顿感觉,挺好,速度也还行,不过需要备案。且前段时间看 ququ大神nginx相关的事,我也想学学玩玩,于是开始了一段很是曲折的路程〜

备案

其实起初我的xuexb.com备过二次案了,但均被注销,被告知的原因是内容和备案的主题相关性不强,其实也是域名备案严打造成的,这次备案从填单子到去实体店照像,整体过程历经11天,还算挺快,并且去实体店里照备案的照片居然不要钱。。。大大的给阿里一个赞。。。并且那个妹子还真漂亮〜

备案通过后我想练习下负载均衡,虽说阿里云有现成的负载均衡,可以一键配置,可是我还是想自己尝试下过程的喜悦。于是我买了2台服务器。

负载均衡

首先我说下我对负载均衡的看法,我认为是通过配置让访问均匀的命中多台不同的服务器,从而使单台的负载降低。我这里使用的是nginx做负载,看资料负载的配置分很多类型,比如轮询、ip_hashurl_hash等,我就使用默认的轮询试试。

2台服务器分别为:

  • 高配A
  • 普配B

她们2台之间有内网通信,这也要归功于阿里云了,毕竟内网比较安全和快的,然后做如下调整:

  • 高配A做为db server,对外的db端口屏蔽,只能通过内网让普配B访问
  • 高配A做为负载的入口,域名解析到这个服务器上
  • 普配B建立web server,通过内网连接高配Adb server,并添加http headerserver-index:1
  • 普配B建立web server端口8001只能被内网的高配A访问,并添加http headerserver-index:0`
  • 高配A建立web server端口8001,只能被自己访问
  • 高配A配置负载入口,启用https,由于高配A上做的事已经够多了,顾把访问的负载比例配置为高配A:普配B = 1:3

ps: 由于不想再买单独的db server(RDS),所以在高配A上做了db server

防火墙配置:

-A INPUT -s 允许ip/32 -p tcp -m tcp --dport 允许端口 -j ACCEPT

高配A负载入口大概的配置是这样的:

# 配置负载名
upstream blog {
 server 127.0.0.1:8001 weight=1;
 server 普配Bip:8001 weight=3;
}
# 主入口 
server {
 server_name www.xuexb.com xuexb.com;
 # 配置https
 listen 443 ssl;
 ssl on;
 ssl_certificate 证书;
 ssl_certificate_key 证书key;
 # 配置重写
 if ( $host != 'xuexb.com' ){
 rewrite ^/(.*)$ https://xuexb.com/1ドル permanent;
 }
 # 添加永久https主机头
 add_header strict-transport-security 'max-age=31536000';
 # 代理开始
 location / {
 proxy_set_header Connection "";
 # 配置代理ip
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header Host $http_host;
 proxy_set_header X-NginX-Proxy true;
 proxy_pass http://blog;
 }
 # 负载不记录日志,否则会出现多一条日志的情况
 access_log off;
}
# 配置http->https
server {
 listen 80;
 server_name www.xuexb.com xuexb.com;
 add_header strict-transport-security 'max-age=31536000';
 rewrite ^(.*) https://xuexb.com1ドル permanent;
}

重启nginx后,刷新多次访问博客,看响应头,已经可以无规则的命中不同的服务器了。但是看2台服务器上的nginx访问日志,来源IP好像有问题,于是...

配置日志

nginxhttp{ }配置里添加日志格式化配置:

# 代理日志格式
log_format porxy '$http_x_forwarded_for - $remote_user [$time_local] '
 ' "$request" $status $body_bytes_sent '
 ' "$http_referer" "$http_user_agent" ';

并对高配A,普配Bweb server的配置修改:

access_log 日志目录 porxy;

这样日志可以正确的命中来源的IP了。但又发现日志文件太大了,nginx又不提供日志切割,于是...

日志切割

思路是编写一个shell脚本,让期在每天定点去移动日志文件,log.sh文件为:

# /bin/bash
mv /日志/blog.log /日志/blog/log_$(date +%Y%m%d).log
kill -USR1 `cat {nginx的pid路径}`

添加定时任务里:crontab -e && * 1 * * * /home/wwwlog/nginx/log.sh

配置crontab为开机启动:

# 检查是否开机启动
$ chkconfig --list crond
=>
crond 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
# 如果2,3,4,5不是启动/on则执行
$ chkconfig crond on

启动服务:

service crond start

至此,博客可以负载的访问,只要高配Adb server不挂,这2个服务器的web server任意一个挂了都没事。

todo

记录些接下来要做的事

  • 添加nginx cache,但要考虑到后台页面不cache
  • 静态资源cdn
  • db server迁移
  • 如何显式的命中某个服务器,比如要生成静态化

本文链接:https://xuexb.com/post/278.html

-- EOF --

发表于 2015年09月13日 12:25:00 ,添加在分类 记事本 下 ,并被添加「 博客 」标签 ,最后修改于 2017年03月29日 21:15:14

提醒: 本文最后更新于 3209 天前,文中所描述的信息可能已发生改变,请谨慎使用。

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。

AltStyle によって変換されたページ (->オリジナル) /