在介绍如何搭建一个web生产环境的之前,我们先了解一下,如何选择系统和相关软件,还有一个web生产环境需要满足哪些要求,只要把这些内容了解清楚,那么再搭建过程中就会找到你自己的思路,而不是一成不变。


一:系统的选择

       适合做web生产环境的服务器系统版本有很多,我们要怎样从这些系统中选出适合自己的的一种呢?那么就要满足以下几个条件:

  1. web应用的语言环境,如果你手中的web应用端是.net,那么直接选择win的系统,如果web应用端是php或者jsp,那么就要从以下几点继续考虑了。

  2. 对系统的认真程度,作为中小型企业或者个人用户在选择服务器系统时,一般都是两个选择,一种是我们最常用的windows,一种是用户逐步上涨的linux,那么再选择属于我们自己的系统时,就要考虑我们对系统的了解了。很多人选择linux,问他为什么。他说,linux更安全,不会中病毒,不会中***,不死机。windows病毒***太多了,太容易受到恶意***了。在这里我可以说这种盲目的选择是错误的。任何系统都有破绽,都会中病毒,或者受到恶意***。

  3. 对成本的要求,windows与linux最大的区别就是一个是不开源的项目,一个是开源项目,很简单。

    windows有成熟的系统服务支持,价格昂贵,那有人说了,我把server破解了,一样用啊,也不收费,我自己维护。那我想有这样想法的童鞋,有一大部分都选择了linux,因为linux属于开源的项目,有很多精英团队在共同开发linux,很多服务都有开源提供下载,网上相关资料也很多,这就为我们在系统和服务支持上面节省了大量的资金。


    从上面我自己啰哩啰嗦总结的这三点,我选择是的linux -centos操作系统,就不多说了,继续往下走。


二:web服务器的选择

  我们linux下面常用的web服务器有apache nginx tomcat resin  等等web服务器,这里我们选择nginx+tomcat的组合 来搭建我们的生产环境。

  原因这里简单的说几点:nginx处理速度要快于apache占用内存资源也少,这点毋庸置疑。

                        nginx所有的模块都是静态编译的,而且对fcgi有非常好的支持。

                        nginx支持epoll模式,而apache却不支持。

  nginx作为web服务器的优势显而易见,但是他不支持动态处理,因为我们这里的环境是java,所以接下来选择与nginx的组合是老牌的tomcat,tomcat是大家普遍公认的java处理服务器,虽然它也支持静态处理,但是效果也比nginx差很远。所以我们采用组合,让他们的强项结核在一起,更好的发挥web服务器的性能。


三:上面介绍了软件方面,接下来说硬件选择。

   如果有条件,在资金允许的情况下,品牌服务器是首选,我也只购买过dell的R720服务器,不多做评论,只说下我选择dell服务器的理由:

  1. 在IBM HP DELL之间 同等配置 DELL属于价格最便宜的。

  2. DELL服务器可以根据自己实际需求来选择硬件。

  3. 我们这边的DELL的售后我接触过,比较放心。

基于上面几点简单的有力,我选择了DELLR720机架服务器

那么再选择CPU 内存 raid卡 等硬件上需要怎么选择呢?

  1. CPU对mysql数据库的起至关重要的作用,核心多少,性能高低,决定了数据库查询快慢

  2. 内存这里建议选择大内存,内存还是比较便宜的16G或者32G都要普及了。

  3. 硬盘选择,这里我建议选择4块15000转的硬盘,具体每块磁盘空间大小根据实际需求决定,这么选择的好处是,RAID 可选×××多,可以选择RAID10或者选择RAID5,而且也处于灾备考虑,若是在RAID5情况下 坏掉了一块硬盘,那么就拔掉一块,一时半会来不及换新硬盘也不会影响到我们服务器的正常运行。

  4. 阵列卡的选择,若是选择硬阵列卡的话就有缓存问题,再有对存储读取方面有需求的话,可以选择缓存较大的。

  5. 电源选择我觉得为了安全起见就选2块,一块电源就几百块钱,买个放心。

   其他的也不多说了。有了硬件上的支持,最后一个选择就是带宽线路的支持了。有的投入是该省的省,但有的则是该花的花啊。

   如果你的站点很火爆,人气很旺,增长量很快,充足的带宽是多么重要啊,可不要成为大炮打蚊子,有了好服务器发挥不好出效果。


好了,选来选去的,也选完了,接下来就是安装配置服务器的环节了,下面也会图文并茂的介绍一下整个过程.


四:搭建web生产环境

   系统环境:最小化安装centos6.3_64

   jdk版本:jdk1.6,选择和开发时一样的版本

   nginx版本:nginx.1.2.5.tar.gz

   tomcat版本:tomcat7

   mysql版本:mysql.5.5.11.tar.gz


   如果服务器之前有硬防火墙的话,可以关闭linux系统自带的iptables和selinux

   最后也会简单介绍一下。

在安装这些软件之前,我们通过yum 来安装一些必要的工具,这里就不多解释了,不装的话,后面安装软件就会报错。

yum install gcc gcc-c++ make cmake wget libtool perl-devel ncurses-devel libxml2-devel
zlib-devel

1.    安装jdk

tar -xvf jdk1.6.tar.gz
mv jdk1.6.tar.gz /usr/local/jdk
接下来加入环境变量
vi /etc/profile
在最后添加上:
export JAVA_HOME=/usr/local/jdk
export PATH=$PATH:$JAVA_HOME/bin
保存退出:
source /etc/profile  刷新一下系统变量,这样可以不用重启服务器
java -version 查看一下 jdk版本

2.    安装tomcat

tar -xvf tomcat.6.0.36.tar.gz
mv apache-tomcat-6.0.36 /usr/local/tomcat
启动tomcat:
/usr/local/tomcat/bin/startup.sh

   tomcat这就安装完成了,测试一下,在地址栏输入http://ip地址:8080

   出现这个页面代表安装和启动没有任何问题

   tomcat的配置文件在是/usr/local/tomcat/conf/server.xml 因为这里不需要修改,所以就不多介绍了,网上相关资料也很多,多利用搜索引擎,查资料,很有帮助。

3.    安装Nginx

3.1 安装Nginx所需要的pcre-devel库

tar -xvf pcre-8.02.tar.gz
cd pcre-8.02
make && make install
cd /lib64
ln -s libpcre.so.0.0.1 libpcre.so.1

   如果不做这个链接的话 启动nginx会报错 就是找不到这个libpcre.so.1

3.2 安装Nginx-1.2.5

tar -xvf nginx-1.2.5.tar.gz
cd nginx-1.2.5
./configure --prefix=/usr/local/nginx \  指定nginx的安装目录
--with-http_stub_status_module \  启用nginx的status功能,可以监控nginx当前状态
--with-http_gzip_static_module \  支持在线实时压缩输出数据流
--with-google_perftools_module \  支持TCMalloc对Nginx性能的优化
make && make install

   这里安装了TCMalloc模块来对Nginx优化 所以要先安装这个开源工具,请看:

   http://yanzhe.blog.51cto.com/blog/5279577/1182055

   安装完成后,再回头来编译。

3.3 配置Nginx 详细介绍

   修改Nginx安装目录的conf/nginx.conf 文件

vi /usr/local/nginx/conf/nginx.conf

3.31 Nginx的全局配置

user nobody nobody; 指定了Nginx Worker进程运行用户及用户组,此处是默认值
worker_processes 4;  指定了Nginx开启的进程数,如果多核CPU,就设置与CPU的核心数量一样多
error_log logs/error.log notice; 定义了全局错误日志 级别为notice
pid    logs/nginx.pid; 指定了nginx进程id存储文件的位置
worker_rlimit_nofile 65535;  用于绑定worker进程和CPU
events{   用来设定Nginx的工作模式以及连接数上限
use epoll;  Nginx的工作模式,对于linux系统 epoll模式为首选
worker_connections 60000; 每个进程的最大连接数  下面公式:
}

   max_clients=processes*connections

   最大连接数=进程数*每个进程最大连接数

   在作为反向代理时  还要除以4

   进程的最大连接数受linux系统进程的最大打开文件数限制,修改方法:  

vi /etc/security/limits.conf

   修改以下内容:

   worker_connections的设置才能生效。

3.32 Nginx对HTTP服务器相关属性配置

http{
include conf/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
log_format download '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_range" "$sent_http_content_range"';
client_max_body_size  20m;
client_header_buffer_size 32k;
large_client_header_buffers  4 64k;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 60;
client_header_timeout 10;
client_body_timeout 10;
send_timeout  10;
}

   下面详细介一下以上配置的意思:

   include    将外部的文件引入,减少主配置文件的复杂度

   default_type  默认类型为二进制流

   log_format   指定了Nginx日志的输出格式

   client_max_body_size 允许客户端请求的最大的单个文件字节数

   client_header_buffer_size 客户端请求头headerbuffer大小

   large_client_header_buffers 客户端请求中较大的消息头的 个数 与 大小

   sendfile 开启了高效文件传输模式

   tcp_nopush 设置为on 防止网络阻塞

   tcp_nodelay 设置为on 防止网络阻塞

   keepalive_timeout 客户端连接保持活动的超时时间 超时后服务器关闭连接

   client_header_timeout 客户端请求头超时时间 超时后Nginx返回Request time out(408)错误

   client_body_timeout 客户端请求主体超时时间 超时后Nginx返回Request time out(408)错误

   send_timeout 两个连接活动之间的时间,如果超过这个时间客户端没任何活动,Nginx将会关闭连接

3.33 HTTP GZIP模块配置

gzip on;
gzip_min_length 1k;
gzip_buffers  4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types  text/plain application/x-javascript text/css application/xml;
gzip_very on;

   下面详细介绍一下以上配置的意思:

   gzip  设置开启gzip压缩,实时压缩输出数据流

   gzip_min_length  允许压缩的页面最小值,页面字节数从header头的Content-Length中获取

   建议设置成大于1K的字节数,小于1K可能会越压缩越大

   gzip_buffers 申请 4个 单位 为16k的内存作为压缩结果流缓存

   gzip_http_version 设置识别HTTP协议版本 默认1.1  几乎所有浏览器都支持gzip压缩

   gzip_comp_level 指定gzip的压缩比例 数值越小 压缩比越小 处理速度也快,反之越慢 也消耗CPU

   gzip_types  用来指定压缩的类型

   gzip_vary 开启前段的缓存服务器缓存经过gzip压缩的页面

3.34 负载均衡配置

upstream tomcats{
ip_hash;
server 192.168.1.200:8080;
server 192.168.1.201:8080 down;
server 192.168.1.202:8080 max_fails=3 fail_timeout=20s;
}

   下面详细介绍一下以上配置的意思:

   Nginx的负载均衡模块目前支持4种调度算法,其中 后两项属于第三方调度算法


   轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端有宕机,系统将自动剔除,不影响

   Weight 指定轮询的权值,Weight值越大 分配到的访问几率越高,应用于后端服务器性能不均的情况

   ip_hash    来自同一个IP的访客将固定访问一个服务器,解决了动态网页存在session的问题

   fair   根据页面大小和加载时间长短进行负载均衡,Nginx本身不支持fair,需要下载upstream_fair模块

   url_hash  每个URL定向到同一个服务器,可以进一步提高缓存服务器的效率 也必须安装Nginx的hash软件包

   负载均衡调度中的状态:

   down,表示当前的server暂时不参与负载均衡

   backup,预留备份机器,其他所有的非backup机器出现故障或者繁忙的时候,才会请求backup机器

   max_fails 允许请求失败的次数   超过最大次数,返回proxy_next_upstream

   fail_timeout 经理了max_fails次数失败后,暂停服务的时间  两个状态可以一起用


   注意:在ip_hash调度时,负载均衡调度状态不能是weight 和backup

3.35 server虚拟主机的配置

server{
listen 8080;  端口根据自己后端服务器情况而定
server_name 192.168.1.200  www.abc.com;  可以是IP  也可以通过域名
index  index.html  index.htm  index.jsp;   设定访问默认首页的地址
root /www/abc 虚拟机的网页根目录
charset gb2312; 用于设置网页的编码格式
access_log logs/abc.access.log main;   访问日志存放路径  用main指定输出格式
}

3.36 URL 匹配的详细配置

   location 支持正则表达式,也支持条件判断,用户可以通过location实现动静态分离

   所有静态文件(html jpg)等都留下来自己处理  所有jsp动态文件交予tomcat处理

   所有扩展名为.gif、.jpg、.png、,swf的静态文件都交给Nginx处理

location ~ .*\.(gif|jpg|png|swf)$ {
root /web/abc;  网站根目录
expires 30d;    指定静态文件的过期时间 这里是30天
}

   将网站根目录下的 upload目录 和 html目录 下的所有文件都交给nginx处理

location ~ ^/(upload|html)/ {
root /web/abc;  网站根目录
expires 30d;    指定静态文件的过期时间 这里是30天
}

   将虚拟主机下的所有.jsp后缀名的文件都交给本机的8080端口处理

location ~ .*.jsp$ {
index index.jsp;
proxy_pass http://localhost:8080;
}

3.37 错误信息返回页面配置

error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location =  /50x.html {
root html;  指定 返回错误后 从哪找错误页面
}

   根据上面对nginx配置文件详细的介绍,相信能掌握如何配置nginx 负载均衡 动静态分离 等web服务器相关的技术信息。根据自己的实际情况,将静态的文件交给nginx处理,将动态的文件交给tomcat处理,负载大了,也可以使用nginx来进行负载均衡,也可以通过多个tomcat启动来负载均衡,相关资料:http://yanzhe.blog.51cto.com/5279577/1177091

   配置完成Nginx后,可以通过/usr/local/nginx/sbin/nginx -t 来检验配置有没有错误。有错误的地方,会告诉你错误位置,如果没有错误,则会出现下图所示:

   Nginx的启动和关闭

/usr/local/nginx/sbin/nginx  这样就启动了Nginx
ps -ef |grep nginx  如图:

kill 7665  这样就关闭了nginx

   到此nginx的详细介绍就介绍完了,继续下面的mysql安装

4.    安装mysql数据库

4.1创建mysql安装目录

mkdir -p /usr/local/webserver/mysql/

4.2创建数据存放目录

mkdir -p /data/mysql/

4.3创建用户和用户组与赋予数据存放目录权限

groupadd mysql
useradd -g mysql mysql
chown mysql.mysql -R /data/mysql/

4.4下载解压mysql 5.5.11

wget http://mirrors.sohu.com/mysql/MySQL-5.5/mysql-5.5.11.tar.gz
tar zxvf mysql-5.5.11.tar.gz
cd mysql-5.5.11

4.5编译mysql-5.5.11

cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql/  \
-DMYSQL_DATADIR=/data/mysql  \
-DMYSQL_UNIX_ADDR=/data/mysql/mysqld.sock  \
-DWITH_INNOBASE_STORAGE_ENGINE=1  \
-DENABLED_LOCAL_INFILE=1 \-DMYSQL_TCP_PORT=3306  \
-DEXTRA_CHARSETS=all \-DDEFAULT_CHARSET=utf8  \
-DDEFAULT_COLLATION=utf8_general_ci  \
-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock  \
-DMYSQL_USER=mysql \-DWITH_DEBUG=0
make && make install

4.6复制配置文件

cp support-files/my-medium.cnf /etc/my.cnf
cp support-files/mysql.server /etc/init.d/mysqld
chmod 755 /etc/init.d/mysqld

4.7初始化数据库

cd /usr/local/mysql/scripts
./mysql_install_db --user=mysql \
--basedir=/usr/local/webserver/mysql \
--datadir=/data/mysql/ &

4.8启动mysql服务

/etc/init.d/mysqld start
ps -ef |grep mysql 命令查看是否启动

4.9登录mysql数据库

/usr/local/webserver/mysql/bin/mysql -u root -p

   通过命令行登录管理MySQL服务器 初始密码为空

4.10去掉匿名登录

delete from mysql.user where user="";

4.11如果有需要远程连接mysql的话如下操作:

use mysql ;
insert into user set host='%',user='root',password='';

4.12给本地和远程主机用户设置密码

use mysql ;
set password for 'root'@'localhost'=PASSWORD("123456");
set password for 'root'@'%'=PASSWORD("123456");
FLUSH PRIVILEGES;

5. 下面给出的是在linux系统中对Nginx应用而进行的系统内核参数的优化。

net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
net.core.somaxconn = 262144
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30

   将上面的内核参数值 加入到/etc/sysctl.conf文件中,然后执行如下命令使之生效  

mkdir -p /usr/local/webserver/mysql/

   下面对上面的参数进行介绍一下:

   net.ipv4.tcp_max_tw_buckets 用来设定timewait的数量 默认是180000,这里改为6000

   net.ipv4.ip_local_port_range 用来设定允许系统打开的端口范围最小值1024

   net.ipv4.tcp_tw_recycle 用来设置启动timewait快速回收。

   net.ipv4.tcp_tw_reuse 用来设置开启重用,允许将time-wait sockets重新用于新的tcp连接

   net.ipv4.tcp_syncookies 用来开启syn cookies,当出现syn等待队列一处时,启用cookies处理

   net.core.somaxconn 默认是128,参数用于调节系统同时发起的tcp连接数,在高并发的请求中,默认的值可能会导致连接超时或者重传,因此,需要结合并发请求数来调节此值。

   net.core.netdev_max_backlog 表示当每个网络接口接受数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数目。

   net.ipv4.tcp_max_orphans  用于设定系统中最多有多少个tcp套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤立连接将立即被复位并打印出警告信息。这个限制值是为了防止简单的DOS***。不能过分依靠这个限制甚至人为减小这个值,更多的情况下应该增加这个值。

   net.ipv4.tcp_max_syn_backlog 用于记录那些尚未收到客户端确认信息的连接请求的最大值。对于有128MB内存的系统而言,次参数默认值是1024,对小内存的系统则是128

   net.ipv4.tcp_synack_retries 参数的值决定了内核放弃连接之前发送SYN+ACK包的数量

   net.ipv4.tcp_syn_retries 表示在内核放弃简历连接之前发送SYN包的数量

   net.ipv4.tcp_fin_timeout 决定了套接字保持在FIN-WAIT-2 状态的时间。默认值是60秒。正确设置这个值非常重要,有时即使一个负载很小的web服务器,也会出现大量的死套接字而产生内存溢出的风险。

   net.ipv4.tcp_keepalive_time 表示当keepalive启动的时候,tcp发送keepalive消息的频度。默认值是2(单位是小时)。


       介绍到这里,web生产环境的搭建也介绍完了,真正的系统生产环境不是靠几篇文章,靠安装几个软件就能搞定的,需要技术人员通过在应用中不段的积累丰富自己的经验,这样才能搭建出更好的系统环境,俗话说是骡子是马拉出来溜溜,自己也动手试试吧。