如何架设自己的Linux开发环境

背景

  • 众所周知,当项目越来越大的时候,项目的设计也会越来越复杂,一个线上运营的商业项目往往会涉及到多种编程语言与技术的使用,比如php+nodejs,ruby+nodejs,java、python等。比如在不同目录下python脚本,使用不同版本python运行;解决版本兼容的问题,一个服务器构架多套使用不同编程语言的WEB服务(node,python,php,java)。

问题

  • 不同语言环境是在不断发展之中,php从4.9到5.2再到7.0中间有着巨大的变化,代码存在着大量的不兼容。
    java 1.x到java 6、7 再到java8不止是语法上的变化,甚至连程序设计的思想与原则都发生了改变。
  • python和ruby,这两个语言在linux运维中使用非常广泛,很多自动化运维脚本都是用python2.x与ruby1.x编写的,然而现在社区中活跃的新版本确是python3.x和ruby2.x。

方案

  • 现在的很多云计算厂商,利用虚拟化技术、容器技术,采用服务化方式进行开发,比如现在流行的docker+微服务架构就是其中的佼佼者,关于更多容器技术与云计算的话题
  • 要完成这种规模的商业项目架构设计,架构师常需要进行程序测试与验证设计,可要在笔记本上完成这样的部署,无论是利用虚拟化技术(虚拟机)还是容器技术,都显得太重了,架构师需要的应该是一个全能的开发、部署与运维环境,环境需要与产品环境高度一致,而且还应该轻便,节省性能,方便管理。

场景

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

  • 通常情况下,如果在一台机器中启动多个http服务,我们必须给这些web服务分配不同的端口,否则就会端口冲突。然而标准的网页服务走的是80端口,在浏览器中输入一个网址,不指定端口号,者这个请求就会发送到80端口

  • 这样说来,如果同时在多个端口开启web服务基本不需要做太多额外的事情,只要去各个服务器软件中修改配置文件,把端口号调整为其它大于一千的端口且不重复,这样web服务就能跑起来了。接着我们需要解决一个棘手的问题,通常我们设计的restfulAPi接口以及默认的用户访问,都是直接把http请求发送至80端口的,80端口只有一个,自然是只能有一个程序去监听这个端口,不过这个解决起来也很简单。

问题与解决思路

问题1: 一台服务器共用80端口提供web服务

** 利用 **:nginx反向代理实现多个web服务共享80端口

  1. 第一步,先让nginx在80端口启动,nginx启动成功后再让其它服务器在别的端口启动服务。为了保险期间,自己可以先测试一下,各个服务在不同端口是否工作正常。
  2. 然后我们就需要为各个服务创建虚拟主机,由于多个服务跑在一台机器上,所以为了能有所区分,我们得给这些服务分别绑定不同域名,如果是在本机测试,域名绑定的工作可以选择在自己笔记本的宿主机操作系统里面修改hosts文件
  3. 这一步完成以后,我们在nginx的配置中增加虚拟主机配置,为了方便管理,每一个虚拟主机的配置最好是能有一个独立的文件存放
  4. 虚拟主机反向代理配置
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;
    }
        
    location ~ \.jsp$ {#后缀为jsp的网址访问规则
        proxy_pass http://jsp;
    }

    location ~ \.js$ {#后缀为js的网址访问规则
        proxy_pass http://nodejs;
    }
    location ~ \.php$ {#后缀为php的网址访问规则
        proxy_pass http://php;
    }
}

备注:在ubuntu中,这个文件应该放在/etc/nginx/sites-available里面,然后再通过ln -s 做一个软连接放在sites-enabled文件夹中,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端口跑起来了。

完整配置:

server {
    listen       3001;
    server_name  localhost;

    root /web/www/html/a;
    index index.php index.html index.htm;

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }

    location ~ \.php$ {
        root           /web/www/html/a;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;  #出现下载问题
        include        fastcgi_params;
    }

}

server {
        listen       80;   #设置监听的端口
        server_name  local.a.com; #设置监听的域名
        location / {
            index  index.html index.htm index.php;
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://127.0.0.1:3001; #设置跳转的域名和端口
            #autoindex  on;
        }
}

问题2:在项目开发过程中,我们用到的各种工具和软件,通常会有依赖,比如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的安装目录就可以了,这样我们自己写的机器学习工具就能在我的用户权限下跑起来了。

  • 问题复杂度

  • 事情远远比我们想象中复杂,比如python,我们为了使用现在社区中一些新的python工具,必须把python升级到3.x版本,但操作系统中有些操作也需要python,比如当前ubuntu中用的是2.7,如果我们升级了python,系统的有些功能会无法正常使用。

  • ruby情况与python类似,由于ruby项目高度活跃,我们很可能需要同时使用3个以上甚至更多的ruby版本在一个系统中,不止如此,还需要能灵活的管理我们的环境和版本。

  • linux中的很多软件都会有启动脚本,如果在启动脚本中设定完整的java运行路径,就可以用指定的java版本来运行程序了,像hadoop这样的大型开源项目,已经一早就为我们准备了运行时环境设置的途径。

设计思路

有一个很好的设计思路能解决这个问题,无论你希望有多少个版本并存在操作系统且无冲突。

  • 首先,我们需要能把语言各个版本环境统一管理,也就是说把所有我们需要的版本都下载下来,集中存放

  • 然后我们建立一个该语言环境的目录加入PATH,为语言环境以及bing中的命令建立替身,所有敲的命令以及执行的脚本默认都指向替身而不是命令本身,比如正常情况下如果敲python命令,系统会去path中查找python文件,然后执行,由于通过path找到的python是替身而不是命令本身,我们可以利用替身帮我们做一些事情

  • 我们可以指明某个文件夹必须使用某个版本的python,这样替身接到命令调用时就会先判断,这个文件夹是否有指明版本,如果有指定,就再去调用指定版本的python去执行命令,当然如果没有指定文件夹,那么python就判断,当前登陆的用户有没有指定python版本,如果没有指定就再判断,有没有指定默认全局python版本,这样一来,我可以精确的去控制每一个文件夹,每一个用户,以及整个操作系统应该是用的python版本

  • 同样的原理也适用于其它编程语言,而且也有这样的开源项目来帮助我们做这样的事情。
    最早这样管理环境的是ruby,ruby工程师发明了很多项目管理工具,早期的rvm就是管理版本环境与依赖的,功能比较强大,而另一个轻型解决方案叫做rbenv就是用上面讲的办法来实现复杂的环境的管理(phpenv,pyenv等)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容