“test-jb-setup”
企业对外提供
反向代理是相对于我平常所说的代理而言的。 在企业内部,通过一台专门的服务器连接外部网络,即互联网,这台服务器就是代理服务器。它汇聚所有设备的上网请求进行转发,不需要每台设备都配置专用的拨号账号,节约资源。
(企业内部用户) --> 代理服务器 --> (外部网站)
企业内部有很多系统,如果都对外开放,需要很多连接入口,而通过统一的代理服务器,可以只对外开放这一台服务器,由它把把外部用户的请求,转发到具体的应用系统。从数据的流向来看,它和用户代理上网正好相反,所以反向代理。
(外部用户) --> 代理服务器 --> (内部应用系统)
四、Nginx之反向代理 五、Nginx之负载均衡 六、Nginx之页面缓存 七、Nginx之URL重写 八、Nginx之读写分离
就配置而言,nginx提供了很简单的方式,提供一个关键字 upstream
upstream cluster01
# 定义一个cluster01的集群
{
server 192.168.1.12:80 weight = 3;
server 192.168.1.13:80 weight = 3;
server 192.168.1.14:80 weight = 3;
# 这个集群里面有3个服务器,
}
server {
listen 80;
server_name test;
location /{
proxy_pass http://cluster01
# 请求会分发到集群去
}
}
可以通过weight来设置权重,默认是1,数字大的优先级高
可以通过max_fails和fail_timeout配置,如
server 192.168.1.13:80 max_fails=3 fail_timeout=30s;
可以增加backup关键字,如
server 192.168.0.2 backup
可以增加ip_hash参数,nginx会把ip地址hash,形成一个唯一的散列值,用来和后台服务器匹配。
upstream cluster01 {
ip_hash;
server 192.168.1.12:80 weight = 3;
server 192.168.1.13:80 weight = 3;
server 192.168.1.14:80 weight = 3;
}
接ip_hash问题,如果已经有客户端连到某个服务器了,但是需要临时移除,这个时候可以加一个参数down,表示这个服务器不再接受新的请求,但是老的请求继续处理。
upstream cluster01 {
ip_hash;
server 192.168.1.12:80 weight = 3;
server 192.168.1.13:80 weight = 3 down;
server 192.168.1.14:80 weight = 3;
}
ip_hash只是一种负载均衡方法,还有几种其他的方法,有机会再更新
有了上面的配置,我们知道如何将请求转发给真实的地址。但是有个问题,目标系统如果通过CGI变量remote_addr,获取的是nginx这个服务器的地址。而不是用户的真实地址,解决办法也很简单。通过proxy_set_header把请求头带到目标服务器
location /{
proxy_pass http://cluster01
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;
}
}
在python里面,后台拿到的时候,这个变量会变成全大写的一个变量HTTP_X_REAL_IP。 如果想要设置这个地址,在Flask,可以在请求处理前设置。
@app.before_request
def pre_request_logging():
# 解决nginx的地址问题,要不然处理短信登录限制就不行了
if 'HTTP_X_REAL_IP' in request.environ:
request.environ['REMOTE_ADDR'] = request.environ['HTTP_X_REAL_IP']
“test-jb-setup”
现在我们已经可以运行nginx,并让nginx来提供一些能力。
通常而言,对于大型系统而言,大并发,大用户量请求,由1台服务器来处理是不现实的,单台服务器的硬件资源有限,很容易就会出现瓶颈。这个时候我们就希望能通过不同的服务器,提供相同的功能,来分担压力,均衡负载。 负载均衡更多的是分担计算能力。
现实情况下,对于分布式系统而言,服务器异常是很正常的事情。和负载均衡类似。所以我们需要在服务器失效的时候,能够快速恢复对外服务。负载均衡意味着相同功能的服务器一直处于活动状态。而失效转移更多的是指几台功能相同的服务器,当一台出现故障时,能快速切换到另外一台服务器。而这台服务器可能只是处于等待状态,原来并不提供功能。
总而言之,为了区分功能相同的服务器,就有了cluster的概念,即群集。群集中的服务器功能一致,统一管理。
就配置而言,nginx提供了很简单的方式,提供一个关键字 upstream
upstream cluster01
# 定义一个cluster01的集群
{
server 192.168.1.12:80 weight = 3;
server 192.168.1.13:80 weight = 3;
server 192.168.1.14:80 weight = 3;
# 这个集群里面有3个服务器,
}
server {
listen 80;
server_name test;
location /{
proxy_pass http://cluster01
# 请求会分发到集群去
}
}
可以通过weight来设置权重,默认是1,数字大的优先级高
可以通过max_fails和fail_timeout配置,如
server 192.168.1.13:80 max_fails=3 fail_timeout=30s;
可以增加backup关键字,如
server 192.168.0.2 backup
可以增加ip_hash参数,nginx会把ip地址hash,形成一个唯一的散列值,用来和后台服务器匹配。
upstream cluster01 {
ip_hash;
server 192.168.1.12:80 weight = 3;
server 192.168.1.13:80 weight = 3;
server 192.168.1.14:80 weight = 3;
}
接ip_hash问题,如果已经有客户端连到某个服务器了,但是需要临时移除,这个时候可以加一个参数down,表示这个服务器不再接受新的请求,但是老的请求继续处理。
upstream cluster01 {
ip_hash;
server 192.168.1.12:80 weight = 3;
server 192.168.1.13:80 weight = 3 down;
server 192.168.1.14:80 weight = 3;
}
ip_hash只是一种负载均衡方法,还有几种其他的方法,有机会再更新
root和alias的区别
“test-jb-setup”
##准备工作 为nginx运行的专门的指定用户下
groupadd -r nginx
useradd -r -g nginx -M nginx
##源码安装
wget http://nginx.org/download/nginx-1.6.2.tar.gz
nginx官网提供了3种版本下载:
* Mainline :开发版
* Stable:最新稳定版,生产环境上建议使用的版本
* Legacy:以前的稳定版
tar zxvf nginx-1.6.2.tar.gz -C /local/nginx/
cd /local/nginx/nginx-1.6.2
比如好启用ssl,就要带ssl模块,如果要监控nginx,就启用stub,如果要启用smtp等邮件服务,就带上mail模块
./configure \
--prefix=/usr/local/nginx \ # 设置路径前缀
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-pcre
* 编译安装
make && make install
启动
测试运行
public class HelloWorld {
public static void main(String args[]) {
System.out.println("Hello World!");
}
}
vi /etc/init.d/nginx
内容如下:
#!/bin/bash
#description: Nginx Service Control Script
case "$1" in
start)
/usr/local/nginx/nginx
;;
stop)
/usr/bin/killall -s QUIT nginx
;;
restart)
$0 stop
$0 start
;;
reload)
/usr/bin/killall -s HUP nginx
;;
*)
echo "Usage:$0 {start|stop|restart|reload}"
exit 1
esac
exit 0
##rpm安装 目前从网络上能找到的大部分是源码方式安装。实际上正式环境并不推荐采用源码安装的方式,个人理解是因为通常不具备编译环境和相关包,可能还会有潜在的影响?
rpm -ivh xxx.rpm
在CentOS 7上安装了几台nginx,有一次安装失败了。提示信息如下
[root@libunwind-1.1]# yum install nginx
Loaded plugins: langpacks
Resolving Dependencies
--> Running transaction check
---> Package nginx.x86_64 1:1.6.3-7.el7 will be installed
--> Processing Dependency: nginx-filesystem = 1:1.6.3-7.el7 for package: 1:nginx-1.6.3-7.el7.x86_64
--> Processing Dependency: nginx-filesystem for package: 1:nginx-1.6.3-7.el7.x86_64
--> Processing Dependency: libxslt.so.1(LIBXML2_1.0.18)(64bit) for package: 1:nginx-1.6.3-7.el7.x86_64
--> Processing Dependency: libxslt.so.1(LIBXML2_1.0.11)(64bit) for package: 1:nginx-1.6.3-7.el7.x86_64
--> Processing Dependency: gd for package: 1:nginx-1.6.3-7.el7.x86_64
--> Processing Dependency: GeoIP for package: 1:nginx-1.6.3-7.el7.x86_64
--> Processing Dependency: libxslt.so.1()(64bit) for package: 1:nginx-1.6.3-7.el7.x86_64
--> Processing Dependency: libprofiler.so.0()(64bit) for package: 1:nginx-1.6.3-7.el7.x86_64
--> Processing Dependency: libgd.so.2()(64bit) for package: 1:nginx-1.6.3-7.el7.x86_64
--> Processing Dependency: libexslt.so.0()(64bit) for package: 1:nginx-1.6.3-7.el7.x86_64
--> Processing Dependency: libGeoIP.so.1()(64bit) for package: 1:nginx-1.6.3-7.el7.x86_64
--> Running transaction check
---> Package GeoIP.x86_64 0:1.5.0-9.el7 will be installed
---> Package gd.x86_64 0:2.0.35-26.el7 will be installed
--> Processing Dependency: libXpm.so.4()(64bit) for package: gd-2.0.35-26.el7.x86_64
---> Package gperftools-libs.x86_64 0:2.4-5.el7 will be installed
--> Processing Dependency: libunwind.so.8()(64bit) for package: gperftools-libs-2.4-5.el7.x86_64
---> Package libxslt.x86_64 0:1.1.28-5.el7 will be installed
---> Package nginx-filesystem.noarch 1:1.6.3-7.el7 will be installed
--> Running transaction check
---> Package gperftools-libs.x86_64 0:2.4-5.el7 will be installed
--> Processing Dependency: libunwind.so.8()(64bit) for package: gperftools-libs-2.4-5.el7.x86_64
---> Package libXpm.x86_64 0:3.5.10-5.1.el7 will be installed
--> Finished Dependency Resolution
Error: Package: gperftools-libs-2.4-5.el7.x86_64 (epel)
Requires: libunwind.so.8()(64bit)
You could try using --skip-broken to work around the problem
You could try running: rpm -Va --nofiles --nodigest
从字面理解,少了一个libunwind.so.8。被gperftools依赖,问题是同样的环境,其他机器安装没这个问题,这个包是自动装的,所以比较奇怪。解决方案有2个:
耽误了一下午时间,应该早点果断下手
“test-jb-setup”
##语言
语言到争论由来已久,也将一直持续下去。
从学软件开始,大多数人都不会只接触一种语言。
个人较早接触到语言争论是Delphi和VC,后来牵涉到VCL和MFC到先进性比较。当时有一个必将知名到网站vchelp,从我映像中记得他是做Delphi,然后工作中涉及VC,才转到。当时这个争论到帖子引来很多人从各个角度和方面对两种语言和框架做来深入到探讨,也算是难得一次理性交流。虽然最后流行出来必将知名的回复只有一个,其他人到发言也非常精彩。现在回想起来,还是。
计算机语言到发明是为了解决计算机到问题,给我们提供一种方式去使用计算机资源到手段。
最早是机器语言,学术性太强,人类不可读。随着技术发展,逐级积累出一些经验,形成一些共同的东西。于是有了在这个基础之上的汇编语言,已经有一定可读性。
后面有了各种高级语言,有些针对专业领域,有些是通用。不管如何,语言是历史发展过程必然会产生的工具。
孰优孰劣的讨论,如果能深入,对参与讨论的人,是大有裨益的,只是度上很难把握
##数学和算法##
语言解决问题到范畴,开发维护性都似乎需要考虑到
js,python,delphi
最早学C还是在学校,那时候用TC,后来工作用到是VC。很长一段时间里面,IDE和语言、框架一直没分太清楚,可能是因为特定语境下面混淆问题也不大。
C++是语言,VC是IDE,MFC是框架
Object Pascal是语言,Delphi是IDE,VCL是框架
不过后来Borland也把Delphi称为语言了
初学时,很大的困惑源自IDE里面到各种设置,虽然IDE是为了提高效率,为人性化做来很多工作,但是对我这样到初学菜鸟来说,确实很大到压力。既然IDE是生产力工具,学习IDE的使用就显得尤为重要,效率的提高也是很显著的。
长期使用IDE会带来一个问题,没有IDE的情况下,或者特殊的情况,比如生产环境紧急需要做点什么,临时需要调整点什么,可能无从下手。 所以开始反思本源的东西。