这是本人的服务器部署笔记.文章名称叫"部署笔记1"的原因是之后我对这个进行了改进之后,会有"部署笔记2","部署笔记3"...循序渐进,估计应该是这样的:)

  1. 概述与设计
  2. nginx安装
  3. nginx基本使用
  4. nginx的配置
  5. tomcat的安装与配置
  6. 部署程序
  7. 待续

概述与设计

主机使用阿里云主机,配置不高,但前期应该够用,以后有需要的话再升级.

主要的业务逻辑是用java实现,并用tomcat承载,但大家知道tomcat并不适合作为大量的静态资源的访问的服务器,这个工作交给nginx正好,所以用nginx作为反向代理,把业务逻辑交给tomcat,而其它一些资源访问的工作nginx自己直接处理并返回.设计如下:

http(s)://happyaa.com/resource/... => 静态资源文件,nginx直接自己处理
https://happyaa.com/hpaasvc/... => 主业务逻辑交给tomcat(使用安全连接)
http://happyaa.com/hpaasvc/... => 重定向到https,对于hpaasvc,必须使用安全连接
http(s)://happyaa.com/... => 其它,交给tomcat处理

大家可能已经注意到了,对于业务逻辑这一块,我使用了安全连接,这个安全连接也是由nginx提供的,而tomcat不会直接暴露给客户端访问,一来nginx的并发能力比tomcat强很多,这样有利于性能的提高,二来可以通过配置nginx来挡掉很多非法访问,让tomcat更加专注于业务.后面还可以考虑用nginx提供缓存等,总之前端服务器就是nginx无疑了.

nginx安装

我的操作系统是CentOS,在安装nginx之前先yum update一下:
#yum update
更新一些库和必要的支持,完了之后去下载一个nginx的最新版,如今我责编的版本是1.7.7:
#wget http://nginx.org/download/nginx-1.7.7.tar.gz
解压缩
#tar -zvxf nginx-1.7.7.tar.gz
#cd nginx-1.7.7
nginx有很多很多编译配置项,但由于我这是第一篇笔记,所以我基本上都使用了默认的配置:
#./configure --with-http_ssl_module --with-http_gzip_static_module
我只加了两个选项,--with-http_ssl_module表示使用ssl模块,--with-http_gzip_static_module表示使用gzip模块,其它更详细的配置就要参考nginx的文档了:http://nginx.org/en/docs/configure.html

如果没configure成功(会显示XXX not found),那是因为有些依赖没有被正确安装.那么先安装一下这些依赖条件,通常是pcre,zlib这些,这么一下就基本上可以了:
#yum install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel

#make
#make install

可执行文件就会被安装在: /usr/sbin/nginx (默认配置)

nginx基本使用

启动nginx:
#cd /usr/local/nginx/sbin/
#./nginx

如果运行的时候不带-c参数,那就采用默认的配置文件,即/etc/nginx/nginx.conf

查看运行进程状态:
# ps aux | grep nginx

打开浏览器,访问http://localhost/看看nginx的默认页面:

停止nginx:
#./nginx -s stop

重启nginx(配置文件变动后需要重启才能生效):
#./nginx -s reload

检查配置文件是否正确:
#./nginx -t

查看nginx的pid:
cat /usr/local/nginx/logs/nginx.pid

查看nginx版本
$ ./nginx -v

回头看编译配置
# ./nginx -V

nginx的配置

nginx的功能基本上都是通过配置实现的,如今我们只需要符合我们前面提到的那些功能的配置即可.下面是我的ngxin配置文件,大部分都是默认的,只需要注意粗体字部分.我都在上面加了一些注释.(限于我这个初级用户的水平,有些可能不太准确,要详细了解的话还是得到官网去查文档:http://nginx.org/en/docs/,或者自行google)

#工作进程所用的用户,我这里用了root用户,其实不太好,更好的做法是创建一个专门的用户
user root;
#工作进程数,通常主机的CPU核心数是多少,这里就写多少
worker_processes 2; events {
#最大网络连接数
worker_connections 1024;
} http {
include mime.types;
#默认的响应的MIME类型
default_type application/octet-stream;
#允许使用系统的sendfile()函数,据说这样能提高性能,我是不太了解
sendfile on;
#连接保持的时间
keepalive_timeout 65;
#配置普通http连接
server {
listen 80;
server_name happyaa.com;
#将对 http://happyaa.com/... 的访问转向后端的 http://localhost:8080/...
location / {
#见注解1
proxy_set_header Host $host;
#见注解2
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://localhost:8080/;
}
#对http://happyaa.com/resource/... 的访问将会返回主机上的 /resource/... 文件资源
location /resource {
alias /resource;
expires 1h;
}
#对http://happyaa.com/hpaasvc/...的访问将重定向至https://happyaa.com/hpaasvc/...
location /hpaasvc {
rewrite ^(.*)$ https://$host$1 permanent;
}
}
#配置https安全连接
server {
listen 443 ssl;
server_name happyaa.com;
ssl on;
#证书文件位置: /usr/local/nginx/conf/cert/happyaa.com.crt
ssl_certificate cert/happyaa.com.crt;
#密钥文件位置: /usr/local/nginx/conf/cert/happyaa.com.key
ssl_certificate_key cert/happyaa.com.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
#将对 https://happyaa.com/... 的访问转向后端的 http://localhost:8080/...
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://localhost:8080/;
}
#对https://happyaa.com/resource/... 的访问将会返回主机上的 /resource/... 文件资源
location /resource {
alias /resource;
expires 1h;
}
}
}

注解1:如果不加上"proxy_set_header Host $host;"这么一行,那么对http://happyaa.com/hpaasvc/的访问,就会被Tomcat理解为"http://localhost:8080/hpaasvc/",可以通过这个方法检验:request.getRequestURL().加上这么一句话之后,就相当于修改了http头中的host字段,用happyaa.com取代localhost.这样重定向的时候才不会有问题.

注解2:X-Forwarded-For和X-Forwarded-Proto都是我们要附加的http的头,这些头本来也没有什么特殊意义,但配合Tomcat使用之后意义就来了.比如我们对https://happyaa.com的访问,对于tomcat来说,就变成了http://happyaa.com,会把https转为http,这个不难理解,因为我们是通过nginx这个反向代理来访问Tomcat的,nginx和Tomcat之间是http,没有s的,这么一来,就会导致重定向错误,假如你在使用https的时候,尝试重定向到"/test"这个path去,实际上浏览器就会去访问http://happyaa.com/test,这个不是你想要的结果;另外,由于我们访问Tomcat是通过反向代理,那么Tomcat所理解的客户端的其实并不是真实的浏览器客户端,而是nginx,这样真实的客户端地址Tomcat就不知道了……这就是这两个头的目的,X-Forwarded-For传递原始客户端真实地址,X-Forwarded-Proto传递原始的scheme(http或者https),接着还需要对Tomcat进行相应的配置,下面会提到.

证书可以去找一个权威证书颁发机构获取,也可以自己弄一张自签的,但自签的证书浏览器不认,当然也可以到wosign.org去获取一个免费的——我就这么干的.证书相关的概念,可以通过我这篇文章来了解:http://www.cnblogs.com/guogangj/p/4118605.html

tomcat的安装与配置

关于tomcat的安装,我之前有写过相关的东西,可以通过这个看到:http://www.cnblogs.com/guogangj/p/3725371.html#tomcatsetup

现在的tomcat的安装和配置跟之前没太大差别,只有这三点差别:
1, 不需要弄https了,https交给了nginx,tomcat就不需要弄了;
2, 要禁止外部直接访问tomcat,我是通过RemoteAddrValve这个阀来控制的.
3, 另外再弄一个RemoteIpValve阀,用来处理nginx传递过来的X-Forwarded-For和X-Forwarded-Proto.关于这个的详情,可以[点此查看].

配置如下:

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<!-- ... -->
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127.0.0.1" deny=""/>
<Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto" protocolHeaderHttpsValue="https"/>
</Host>

我是将这个阀加在了Host节点中.这样所有的外部的直接对tomcat的访问都会直接获得403错误.

部署程序

没什么太多好说的,差不多就这些步骤:
1, 创建数据库;
2, 调整程序自身的配置文件;
3, 上传war包;
4, blah blah blah...

打开happyaa.com:

抓包看看,http头中的server是什么?应该是nginx.而且现在应该是http和https都可以用的,一般情况下可以用http,但如果网络连的是公共区域的WIFI,不太放心的话,还是要用https的.我发觉虽然没有做什么额外的优化,但访问网页的速度貌似快了很多,这并不是心理作用,nginx确确实实能提高速度,至于为什么,我这里摘录知乎上的一段话:

对于后端是动态服务来说,比如Java和PHP。这类服务器(如JBoss和PHP-FPM)的IO处理能力往往不高。Nginx有个好处是它会把Request在读取完整之前buffer住,这样交给后端的就是一个完整的HTTP请求,从而提高后端的效率,而不是断断续续的传递(互联网上连接速度一般比较慢)。同样,Nginx也可以把response给buffer住,同样也是减轻后端的压力。

原文地址: http://www.zhihu.com/question/19761434

待续

nginx除了是一个非常优秀的反向代理服务器之外,还有其它很多功能,比如缓存,这是大幅度提高网站性能的一个关键性的东西,配置且不算很复杂,不过我现在暂时不弄了,就我们现在这点负荷,先不考虑了.高德纳不是说过么?过早的优化是万恶之源.

HappyAA服务器部署笔记1(nginx+tomcat的安装与配置)的更多相关文章

  1. HappyAA服务器部署笔记2(nginx的静态资源缓存配置)

    我近期对服务器进行了少量改进,虽然之前使用了nginx反向代理之后性能有所提高,但仍然不够,需要使用缓存来大幅度提高静态资源的访问速度. 服务器上的静态资源主要有这些:png, jpg, svg, j ...

  2. 企业级自动化部署方案——ansible实现tomcat自动安装和配置

    共耗时10多个小时 思路一 总体设计 ansible-playbook目录结构 [root@ansible ~]# tree /etc/ansible/roles/tomcat /etc/ansibl ...

  3. 高性能web服务器(热死你)Resin Linux的安装、配置、部署,性能远超Nginx支持Java、PHP等

    高性能web服务器(热死你)Resin Linux的安装.配置.部署,性能远超Nginx支持Java.PHP等 一.    安装resin 1.  下载resin: 下载地址:http://cauch ...

  4. Nginx+Tomcat的服务器端环境配置详解

    这篇文章主要介绍了Nginx+Tomcat的服务器端环境配置详解,包括Nginx与Tomcat的监控开启方法,需要的朋友可以参考下 Nginx+tomcat是目前主流的Javaweb架构,如何让ngi ...

  5. Nginx+Tomcat+MemCached 集群配置手册

    系统实施文档 Nginx+Tomcat+MemCached 集群配置手册 目    录 第1章   概述 1.1   目标 互联网的快速发展带来了互联网系统的高负载和高可用性, 这要求我们在设计系统架 ...

  6. CentOS 6.5 下Nginx服务的安装与配置

    参考网站: http://www.cnblogs.com/zhuhongbao/archive/2013/06/04/3118061.html http://www.cnblogs.com/jilia ...

  7. TomCat的安装与配置方法

    经过自己的研究,各种烦,所以要写个博客,帮助大家安装这个软件. 一.安装TomCat(因为大家都安装了jdk,所以就不写了) 1.下载TomCat 网址如下:http://tomcat.apache. ...

  8. 1、Web容器的理解&amp;Tomcat的安装与配置

    Web容器的理解 <Java Web开发实战经典——基础篇>一书中对Web容器这一概念阐述得很好,借用其观点对Web容器加以理解: 想要运行一个Java Web的程序,则必须有相应的Web ...

  9. Tomcat+JDK安装和配置

    Tomcat+JDK安装和配置 一.打开FlashFXP软件,建立连接,选择需要的包,右击传输到 /home/guest中 二.进入到:cd /home/guest中,对tomcat包进行解压 三.将 ...

随机推荐

  1. 修改hive分区表,在分区列前增加一个字段

    本文主要为了测试,在有数据的分区表中增加新的一个非分区字段后,新数据加入表中是否正常. 原始数据 1;zhangsan 2;zhangsan 3;zhangsan 4;lisi 5;lisi 6;li ...

  2. MYSQL之高级查询

    PHP高级查询 分组查询.联合查询.连接查询.子查询 版权声明:本文为博主原创文章,未经博主允许不得转载.

  3. 《深度探索c++对象模型》chapter1关于对象对象模型

    在c++中,有2种class data member:static和nostatic,以及3钟class member function:static,nostatic和virtual.已知下面这个c ...

  4. jQuery+PHP实现的砸金蛋中奖程序

    准备 我们需要准备道具(素材),即相关图片,包括金蛋图片.蛋砸碎后的图片.砸碎后的碎花图片.以及锤子图片. HTML 我们页面上要展现的是一个砸金蛋的台子,台上放了编号为1,2,3的三个金蛋,以及一把 ...

  5. 学习Python编程的11个精品资源

    本文由 伯乐在线 - atupal 翻译自 Alex Ivanovs.欢迎加入技术翻译小组.转载请参见文章末尾处的要求. 用 Python 写代码并不难,事实上,它一直以来都是被声称为最容易学习的编程 ...

  6. 酒店管理系统ER图

  7. AHB协议整理 AMBA

    本文对AHB协议作了简单整理,整理自两篇文章: AHB总线协议 AHB重点难点总结 1. 简介 AHB总线规范是AMBA总线规范的一部分,AMBA总线规范是ARM公司提出的总线规范,被大多数SoC设计 ...

  8. 使用zip压缩文件夹方法

    最近使用MapGis对.MPJ工程文件文件裁剪后,要对裁剪后的图形文件.ML,.MT,.MP,.MPJ文件打包,在网上找到7zip,Zlib的库,虽然都有源码,但是Zlib库中的使用没找到文件压缩的函 ...

  9. 能判断是电脑端还是手机端的javascript

    <script language="javascript"> //平台.设备和操作系统 var system ={ win : false, mac : false, ...

  10. linux 下 etc常用配置信息

    这些都是比较有实用性的系统配置,收藏下,以备不时之需!以下是etc下重要配置文件解释: 1./etc/hosts  #文件格式: IPaddress hostname aliases #文件功能: 提 ...