Nginx安装流程--简单--完整

Nginx

1.简介

  • 产生背景

      1)巨大流量海量的并发访问

      2)单台服务器资源和能力有限

      Nginx正式因为这两个原因才被开发出来。Nginx正式因为具备了处理高并发的负载均衡能力,才会被广泛使用(一般的tomcat服务器的并发量是250左右,但是ngin是5万左右)。目前阿里开发了tngnne完全兼容nginx,而且比nginx还好用。

 

2.负载均衡

  • 高并发

见名知意,高(大量的),并发就是可以使用多个线程或者多个进程,同时处理(就是并发)不同的操作。简而言之就是每秒内有多少个请求同时访问。

  • 负载均衡

负载均衡:将请求/数据【均匀】分摊到多个操作单元上执行,负载均衡的关键在于【均匀】,也是分布式系统架构设计中必须考虑的因素之一。

3.Nginx初探

  • 什么是Nginx

     Nginx是一款轻量级的Web 服务器/反向代理服务器【后面有介绍】及电子邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师Igor Sysoev所开发,其特点是占有内存少,并发能力强,nginx的并发能力确实在同类型的网页服务器中表现非常好。

•2004年10月4日 第一个公开版本0.1.0发布。其将源代码以类BSD许可证的形式发布。

•官方测试nginx能够支撑5万并发链接,并且CPU、内存等资源消耗却非常低,运行非常稳定

 

  • Nginxapache的优缺点

   1.nginx相对于apache的优点:

     轻量级,同样起web 服务,比apache 占用更少的内存及资源高并发,nginx 处理请求是异步非阻塞(如前端ajax)的,而apache 则是阻塞型的,在高并发下nginx能保持低资源低消耗高性能高度模块化的设计,编写模块相对简单

还有,它社区活跃,各种高性能模块出品迅速(十几年时间发展)

   2.apache 相对于nginx 的优点:

    Rewrite重写 ,比nginx 的rewrite 强大模块超多,基本想到的都可以找到少bug ,nginx 的bug 相对较多。(出身好起步高)

3.Nginx 配置简洁, Apache 复杂

 

4.安装nginx

  • 安装依赖

yum -y install gcc openssl-devel pcre-devel zlib-devel

  • 解压文件

tar -zxvf nginx-1.8.1.tar.gz

  • Configure配置

进入解压后的源码目录,然后执行configure命令进行配置

./configure --prefix=/usr/soft/nginx

  • 编译并安装

make && make install

安装好后,会在/usr/soft下生成nginx目录(这是我编译前指定的),这个目录就是nginx的软件了。

5.配置Nginx为系统服务

目的:

配置这个是为了方便管理。以后的启动和停止就不用跑到nginx目录下了

步骤:

  • 在/etc/rc.d/init.d/目录中建立文本文件nginx
  • 在文件中粘贴下面的内容:注意路径保持一致

#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15 
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /etc/nginx/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /var/run/nginx.pid
 
# Source function library.
. /etc/rc.d/init.d/functions
 
# Source networking configuration.
. /etc/sysconfig/network
 
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
 
nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)
 
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
 
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
 
lockfile=/var/lock/subsys/nginx
 
make_dirs() {
   # make required directories
   user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
   options=`$nginx -V 2>&1 | grep 'configure arguments:'`
   for opt in $options; do
       if [ `echo $opt | grep '.*-temp-path'` ]; then
           value=`echo $opt | cut -d "=" -f 2`
           if [ ! -d "$value" ]; then
               # echo "creating" $value
               mkdir -p $value && chown -R $user $value
           fi
       fi
   done
}
 
start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    make_dirs
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}
 
stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}
 
restart() {
    configtest || return $?
    stop
    sleep 1
    start
}
 
reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
    killproc $nginx -HUP
    RETVAL=$?
    echo
}
 
force_reload() {
    restart
}
 
configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}
 
rh_status() {
    status $prog
}
 
rh_status_q() {
    rh_status >/dev/null 2>&1
}
 
case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac

 

  • 修改nginx文件的执行权限

chmod +x nginx

  • 添加该文件到系统服务中去

chkconfig --add nginx

  • 查看是否添加成功

chkconfig --list nginx

  • 启动,停止,重新装载

service nginx start|stop|restart

  • 状态

      ps -ef | grep nginx  

6.Nginx配置

  • Nginx默认配置详解

#进程数,建议设置和CPU个数一样或2倍

worker_processes  1;

#日志级别

error_log  logs/error.log  warning;(默认error级别)

# nginx 启动后的pid 存放位置

#pid        logs/nginx.pid;

events {

#配置每个进程的连接数,总的连接数= worker_processes * worker_connections

    #默认1024

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

#连接超时时间,单位秒

keepalive_timeout  65;

    server {

        listen       80;

        server_name  localhost                 

        #默认请求

   location / {

      root  html;   #定义服务器的默认网站根目录位置

      index  index.php index.html index.htm;  #定义首页索引文件的名称

        }

    #定义错误提示页面

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

       }

}

7.负载均衡配置

  • nginx支持以下负载均衡机制(或​​方法):
  1. 轮询负载均衡 - 对应用程序服务器的请求以循环方式分发
  2. 加权负载均衡 1--10
  3. 最少连接数 - 将下一个请求分配给活动连接数最少的服务器
  4. ip-hash - 哈希函数用于确定下一个请求(基于客户端的IP地址)应该选择哪个服务器。
  • 默认负载均衡配置

使用nginx进行负载平衡的最简单配置可能如下所示:

轮询负载均衡

http {

    upstream shsxt{

        server node01;

        server node02;

        server node03;

    }

 

    server {

        listen 80;

server_name  localhost;

        location / {

            proxy_pass http://shsxt;

        }

    }

}

想要轮训的话必须设置hosts

Vim  /etc/hosts

添加:

192.168.235.101 node01

192.168.235.102 node02

192.168.235.103 node03

  • 加权负载均衡配置

通过使用服务器权重,还可以进一步影响nginx负载均衡算法,谁的权重越大,分发到的请求就越多。

  upstream shsxt {

        server srv1.example.com weight=3;

        server srv2.example.com;

        server srv3.example.com;

  }

  • 最少连接负载均衡配置

在连接负载最少的情况下,nginx会尽量避免将过多的请求分发给繁忙的应用程序服务器,而是将新请求分发给不太繁忙的服务器,避免服务器过载。

 

upstream shsxt {

        least_conn;

        server srv1.example.com;

        server srv2.example.com;

        server srv3.example.com;

    }

  • 会话持久性

上述的循环或最少连接数的负载平衡方法,每个后续客户端的请求都可能被分发到不同的服务器。不能保证相同的客户端总是定向到相同的服务器。

就始终选择相同的服务器而言,就要使客户端的会话“粘滞”或“持久” 。

ip-hash负载平衡机制就是有这种特性。使用ip-hash,客户端的IP地址将用作散列键,以确定应该为客户端的请求选择服务器组中的哪台服务器。此方法可确保来自同一客户端的请求将始终定向到同一台服务器,除非此服务器不可用。

upstream shsxt{

    ip_hash;

    server srv1.example.com;

    server srv2.example.com;

    server srv3.example.com;

}

  • Nginx访问控制

Nginx还可以对IP的访问进行控制,allow代表允许,deny代表禁止.

location / {

deny 192.168.2.180;

allow 192.168.78.0/24;

allow 10.1.1.0/16;

allow 192.168.1.0/32;

deny all;

proxy_pass http://shsxt;

}

从上到下的顺序,匹配到了便跳出。如上的例子先禁止了1个,接下来允许了3个网段,其中包含了一个ipv6,最后未匹配的IP全部禁止访问.

location / {

deny 192.168.2.180;

allow 192.168.235.1;

deny all;

proxy_pass http://shsxt;

}

事实上只要放行虚拟机的地址就可以连上的,虽然不知道有啥用

  • 虚拟主机
  • 何为虚拟主机

就是虚拟机,在电脑上或者服务器上再开一个虚拟的主机。

优点:

由于多台虚拟主机共享一台真实主机的资源,每个虚拟主机用户承受的硬件费用、网络维护费用、通信线路的费用均大幅度降低。网站服务器管理简单,维护方便。

类别:

1、基于域名的虚拟主机,通过域名来区分虚拟主机

2、基于端口的虚拟主机,通过端口来区分虚拟主机

3、基于ip的虚拟主机,很少用。

 

  • 基于域名的虚拟主机

基于域名是指,域名不一样

 

http {

    upstream shsxt{

        server node01;

        server node02;

}

upstream bjsxt{

        server node03;

     }

 server {

        listen 80;

//访问sxt2.com的时候,会把请求导到bjsxt的服务器组里

server_name  sxt2.com;

        location / {

            proxy_pass http://bjsxt;

        }

}

    server {

        listen 80;

//访问sxt1.com的时候,会把请求导到shsxt的服务器组里

server_name  sxt1.com; 

        location / {

            proxy_pass http://shsxt;

        }

}

}

 

注意:基于域名的虚拟机主机 在模拟应用场景时,需要在windows系统的hosts文件里配置域名映射。(C:\Windows\System32\drivers\etc\hosts

打开以后添加:

192.168.235.101 bjsxt1.com

192.168.235.101 shsxt1.com

 

将sxt1和sxt2的域名映射到nginx服务器IP上。

想要观察是否配置正确的话,就改变一下nginx的index文件看一下

vim /usr/soft/nginx/html/index.html

启动nginx后,分别访问sxt1.com ,sxt2.com

当访问sxt1.com的时候,nginx将请求分发给了tomcat1.当访问sxt2.com的时候,nginx将请求分发给了tomcat2.这时就是正确的

 

  • 基于端口的虚拟主机

http {

    upstream shsxt{

        server node01;

        server node02;

}

upstream bjsxt{

        server node03

    }

 server {

//当访问nginx的80端口时,将请求导给bjsxt组

        listen 8080;

        server_name localhost;

        location / {

            proxy_pass http://bjsxt;

        }

}

server {

 //当访问nginx的81端口时,将请求导给shsxt组

        listen 81;

        server_name localhost;

        location / {

            proxy_pass http://shsxt;

        }

}

}

当访问nginx的80端口时,请求被分发给了tomcat1

当访问nginx的81端口时,请求被分发给了tomcat22

 

  • 正向代理和反向代理
  • 正向代理

举个栗子:我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。像我们经常通过vpn访问国外的网站,此时就是正向代理。

客户端必须设置正向代理服务器,当然前提是要知道正向代理服务器的IP地址,还有代理程序的端口。

  • 反向代理

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器

反向代理隐藏了真实的服务端,当我们请求 www.baidu.com 的时候,就像拨打 10086 一样,背后可能有成千上万台服务器为我们服务,但具体是哪一台,你不知道,也不需要知道,你

只需要知道反向代理服务器是谁就好了,www.baidu.com 就是我们的反向代理服务器,反向代理服务器会帮我们把请求转发到真实的服务器那里去。Nginx 就是性能非常好的反向代理服务器,用来做负载均衡。

  • Nginx的session的一致性问题

默认情况下,你访问服务器,每次访问的服务器都有可能是不一样的,这就是所谓的HTTP协议的无状态。

session常见的现实形势是会话cookie,即未设置过时间的cookie,这个cookie的生命周期为浏览器的会话期间,只要关闭浏览器,cookie就消失了。Session的生命周期是与服务器的链接期间,链接断开,session消失

  • Session共享

所谓的共享就是一致性,也就是说所有服务器都可以连接到session从而跳转到用户以前访问的服务器。

  • Session一致性解决方案
  1. Session复制

Tomcat本身就具有复制session功能

  1. 共享session

需要专门管理session的软件,memcached缓存服务可以和tomcat整合,帮助tomcat共享管理session。

  • 安装memached

1)安装memcached内存数据库

 yum –y install memcached

2)web服务器连接memcached的jar包拷贝到tomcat的lib

3)配置tomcat的conf目录下的context.xml

 

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

    memcachedNodes="n1:192.168.17.9:11211"

    sticky="true"

    lockingMode="auto"

    sessionBackupAsync="false"

    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"

sessionBackupTimeout="1000" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />

 

注意:配置memcachedNodes属性,配置memcached数据库的ip和端口,默认11211,多个的话用逗号隔开.

目的是为了让tomcat服务器从memcached缓存里面拿session或者是放session

4)修改tomcat的index,jsp,取session看一下

<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>

<html lang="en">

SessionID:<%=session.getId()%>

</br>

SessionIP:<%=request.getServerName()%>

</br>

<h1>tomcat1</h1>

</html>

 

5启动

memcached -d -m 128m -p 11211 -l 192.168.235.101 -u root -P /tmp/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值