day7[看牛B架构师是如何架设自己的Linux开发环境]听课笔记

主题:如何让多个程序搭建在一个服务器上,搭建一个适合于架构师使用的开发与实现环境(linux)

课程主要解决的编程中遇到的问题:

  1. 当项目越来越大的时候,项目的设计越来越复杂,一个线上的项目往往可能会涉及到多种语言,比如php+node.js,ruby+node.js,java/python等
  1. 即使同一种语言从版本的升级语法上会有一些变化,甚至连程序设计思想与原则可能都会发生变化.
  2. 类似:python和ruby这两个语言在linux运维中使用非常广泛,很多自动化运维脚本都是用python2.x与ruby1.x编写的,然而现在社区中活跃的新版本却是python3.x与ruby2.x
    那么本节课就是为了解决这些问题的...
当然有这些问题也有相对成熟的解决方案
  1. 现在很多云计算厂商,利用虚拟化技术,容器技术,采用服务器化方式进行开发,比如现在流行的docker+微服务架构就是其中的佼佼者.
  1. 要完成这种规模的商业项目架构设计,架构师经常需要进行程序的测试和验证设计,可要在笔记本上完成这样的部署,无论是利用虚拟化技术还是容器技术,都显得太笨重了,架构师需要的是一个全能的开发,部署与运维环境,环境需要与产品环境高度一致,而且还应该更轻便,节省性能,方便管理

我们如何让一台服务器同时支持多种的web服务器,比如如何同时让我们的测试机上面能跑起php,nodejs,ruby on rails,如果有必要的话再加一个tomcat来跑jsp也是可以的

通常情况下,如果在一台服务器上启动多个http服务,我们必须给这些服务分配不同的端口,否则就会端口冲突,然而标准的网页服务走的是80端口,在浏览器中输入一个网址,不指定端口那么默认请求就会发送到80端口.
这样说来,如果同时在多个端口开启web服务器基本不需要做太多额外的事情,只要去各个服务器软件中修改配置文件,把端口调整为其它大于1000且不重复的端口号,这样web服务器就能跑起来了.
接着需要解决一个棘手的问题,通常我们设计的restfulAPI接口以及默认的用户访问,都是直接把http请求发送至80端口的,80端口只有一个,自然是只能有一个程序去监听这个端口的,不过这个解决起来也简单,之所以说简单是因为很多http服务器程序都支持http代理功能.我们这里即将介绍利用nginx反向代理实现多个web服务器共享80端口:
具体实现步骤:

  1. 先让nginx在80端口启动,nginx启动成功后再让其他服务器在别的端口启动服务.为了保险起见,自己可以先测试下,各个服务在不同的端口是否正常工作.
  2. 然后我们就需要为各个服务创建虚拟主机,由于多个服务跑在一台机器上,所以为了能有所区分,我们得给这些服务分别绑定不同的域名,如果是在本机测试,域名绑定的工作可以选择在自己笔记本的宿主机操作系统里面修改hosts文件.
    这一步完成以后,我们在nginx的配置中增加虚拟主机配置,为了方便管理,每一个虚拟主机的配置最好是能有一个独立的文件存放
  3. 虚拟主机反向代理配置:
server {
        listen 80;
        server_name test.ydma.cn;
location / {
          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://127.0.0.1:9001;
        }       
}
# 如果是在ubuntu中,这个文件应该放在/etc/nginx/sites-available里面,然后再通过ln -s 
# 做一个软连接放在sites-enabled文件夹中
# 之所以nginx能找到这个配置文件是因为在nginx.conf主配置文件中有这么两行配置
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
我们可以看到上面的配置文件中 由nginx监听主机名为 server_name test.ydma.cn ,
端口号 listen 80;
location设置为 proxy_pass http://127.0.0.1:9001;
也就是说把访问test.ydma.cn:80的请求交给127.0.0.1的9001端口去处理
 proxy_set_header的配置是为了将http请求的头部信息做相应的改写,如果没有这些设置,转发后的请求得到的请求信息就
是nginx服务的信息,而不是外部用户的信息
把这个文件复制几分,只需要改写server_name以及proxy_pass后的端口号,那么我们就可以让nodes 、ruby on rails 、apache、
等多个web服务同时共用80端口跑起来了。

多个web服务跑起来了,共用80端口了,这样服务与服务之间就可以通过标准的http协议做webservice调用了

可现在还不是高兴的时候,因为麻烦的还在后头,在项目开发过程中,我们用到的各种工具和软件,通常会有依赖,比如hadoop,我们以hadoop2.x为例,它依赖jdk7,我们制作的一款机器学习软件大量使用java函数式编程,需要jdk8,那么我们怎么样解决这个问题呢

通常解决方案

同时安装两个版本到不同路径,比如/opt/java/jdk/1.7.x/目录下安装java7,/opt/java/jdk/1.8.x/下安装java8,然后可以在linux中配置用户级别环境变量JAVA_HOME,通常环境变量应该写在文件 ~./bashrc 或者~/.bash_profile中,然后再修改系统的PATH变量,指向JAVA_HOME下的bin目录,这样我希望用户默认环境下是
java8那么我就把环境变量JAVA_HOME切换到java8的安装目录就可以了,这样我们自己写的机器学习工具就能在我的用户权限下跑起来了。

如果我的机器学习程序需要访问hadoop中的数据怎么办?hadoop2.x需要的是jdk7,而且要和我的java8程序一起在同一台机器中使用。是不是依葫芦画瓢,然后其它语言多版本的问题都可以这样结局呢?事情远远比我们想象中复杂,比如python,我们为了使用现在社区中一些新的python工具,必须把python升级到3.x版本,但操作系统中有些操作也需要python,比如当前ubuntu中用的是2.7,如果我们升级了python,系统的有些功能会无法正常使用。ruby情况与python类似,由于ruby项目高度活跃,我们很可能需要同时使用3个以上甚至更多的ruby版本在一个系统中,不止如此,还需要能灵活的管理我们的环境和版本。

更好的解决思路

有一个很好的设计思路能解决这个问题,无论你希望有多少个版本并存在操作系统且无冲突。
原理如下:
首先,我们需要能把语言各个版本环境统一管理,也就是说把所有我们需要的版本都下载下来,集中存放
然后我们建立一个该语言环境的目录加入PATH,为语言环境以及bing中的命令建立替身,所有敲的命令以及执行的脚本默认都指向替身而不是命令本身,比如正常情况下如果敲python命令,系统会去path中查找python文件,然后执行,由于通过path找到的python是替身而不是命令本身,我们可以利用替身帮我们做一些事情,我们可以指明某个文件夹必须使用某个版本的python,这样替身接到命令调用时就会先判断,这个文件夹是否有指明版本,如果有指定,就再去调用指定版本的python去执行命令,当然如果没有指定文件夹,那么python就判断,当前登陆的用户有没有指定python版本,如果没有指定就再判断,有没有指定默认全局python版本,这样一来,我可以精确的去控制每一个文件夹,每一个用户,以及整个操作系统应该是用的python版本,
同样的原理也适用于其它编程语言,而且也有这样的开源项目来帮助我们做这样的事情。
最早这样管理环境的是ruby,ruby工程师发明了很多项目管理工具,早期的rvm就是管理版本环境与依赖的,功能比较强大,而另一个轻型解决方案叫做rbenv就是用我上面讲的办法来实现复杂的环境的管理.
由于有了rbenv这样好用的工具管理ruby,因此就有人利用rbenv进行改造,诞生了pyenv来管理python,还有phpenv等等。

分享结束!

你可能感兴趣的:(day7[看牛B架构师是如何架设自己的Linux开发环境]听课笔记)