Nginx使用

Nginx

Nginx简介

Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的。Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
Nginx 使用基于事件驱动架构,使得其可以支持数以百万级别的 TCP 连接。高度的模块化和自由软件许可证使得第三方模块层出不穷(这是个开源的时代啊)。Nginx 是一个跨平台服务器,可以运行在 Linux、Windows、FreeBSD、Solaris、AIX、Mac OS 等操作系统上。这些优秀的设计带来的极大的稳定性。

Nginx基于Docker安装和运行

  1. 拉取镜像
    docker pull nginx:latest
  2. 运行nginx容器
    docker run -id --name nginx -p 80:80 nginx
  3. 重启nginx容器
    docker restart 容器id
  4. 关闭nginx容器
    docker stop 容器id

Nginx原理及配置文件

  1. 启动nginx容器
    docker run -it nginx
    docker ps 查看nginx容器id
  2. 拷贝容器中nginx配置文件到宿主机 /home/nginx/conf目录
    docker cp 容器id:/etc/nginx /home/nginx/conf
  3. 停止之前启动的nginx容器
    docker stop 容器id
  4. 挂载nginx配置目录启动nginx
    docker run -id --name=myNginx -v /home/nginx/conf:/etc/nginx -p80:80 nginx
基本配置
# 配置worker进程运行用户
user nginx; 
# 配置worker进程数量。根据硬件条件来配置,一般是和CPU数量一致,后者是CPU数量的2倍,能达到最佳性能。
worker_processes 1; 
# 配置全局错误日志文件及日志级别[debug | info | notice | warn | error | crit]
error_log  /var/log/nginx/error.log warn;
# 配置进程pid文件
pid   /var/run/nginx.pid;
events配置
# events配置工作模式和连接数
events {
	# 配置每个worker进程连接上限
    worker_connections  1024;
}

**说明:**nginx支持的连接总数:worker_processes * worker_connections

Http配置
http {
	# 配置nginx支持哪些多媒体类型
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream; # 默认文件类型

	# 日志格式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

   # 配置访问日志,并使用上面的格式
    access_log  /var/log/nginx/access.log  main;

	# 开启高效文件传输模式
    sendfile        on;
    # 开启防止网络阻塞模式,开启 的话消耗资源大
    #tcp_nopush     on;
	# 长连接超时时间,单位s
    keepalive_timeout  65;
    #gzip  on; # 开启gzip压缩输出
	
	# 子配置文件(包含另外一个配置文件)
    include /etc/nginx/conf.d/*.conf;
}

Server配置
虚拟主机配置

server {
    listen       80; # 监听端口
    server_name  localhost; # 配置服务器

    #charset utf-8; # 配置字符集
    #access_log  /var/log/nginx/host.access.log  main; #配置本虚拟主机访问日志

	# 匹配请求,/ 表示请求路径,会被location匹配到并处理
    location / {
        root   /usr/share/nginx/html; # root是配置服务器的网关根目录位置
        index  index.html index.htm; # 配置首页文件
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    # = 号表示完全匹配
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    # fastcgi 示范配置
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}


Nginx实现反向代理

什么是代理服务器
代理服务器,客户机在发送请求时,不会直接发送给目的主机。而是先发送给代理服务器,代理服务器接受客户机请求之后,再向主机发出请求并接受目的主机返回的数据,存放在代理服务器的硬盘中,然后将内容发送给客户机。

为什么要使用代理服务器

  1. 提高访问速度(CDN)
    由于目标主机返回的数据会存放在代理服务器的硬盘中,因此下一次客户再访问相同的站点数据时,会直接从代理服务器的硬盘中读取,起到了缓存的作用,尤其对于热门站点能明显提高访问速度。
  2. 防火墙作用
    由于所有的客户机请求都必须通过代理服务器访问远程站点,因此可以在代理服务器上设限,过滤某些不安全信息。
  3. 通过代理服务器访问不能访问的目标站点
    互联网上有许多开放的代理服务器,客户机在访问目标站点受限时,可以通过不受限制的代理服务器访问目标站点。

什么是正向代理
正向代理,架设在客户机和目标主机之间,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的Http请求发送到代理服务器中。(需要在客户机端设置)

什么是反向代理
反向代理服务器架设在服务器端,通过缓冲经常被请求的页面来缓解服务器的工作量,将客户机请求转发给内部网络上的目标服务器;并将服务器上得到的结果给Internet上请求连接的客户端,此时代理服务器与目标主机一起对外表现为一个服务器。

Nginx实现负载均衡

网站流量上升,并发量大的时候,网站会出现访问延迟,甚至失败的问题。这时候,就需要用到负载均衡,即我们以前部署的是单一服务器,现在部署多台服务器形成集群,把流量分发到集群中不同的机器上,这个就是负载均衡技术要做的事情。

nginx实现负载均衡
配置 nginx.conf,在http模块下添加配置,必须在server上方配置:

upstream www.ls.com {
	server 172.17.0.2:8080 weight=5;
	server 172.17.0.3:9090 weight=10;
}

upstream是配置nginx与后端服务器负载均衡非常重要的一个模块,并且它还能对后端的服务器的健康状态进行检查,若后端服务器中的一台发生故障,则前端的请求不会转发到发生故障的服务器。
www.ls.com 是域名,这里需要配置成你需要的。
weight是权重配置,权重越高分配到的概率就越高。
在http下的server模块

location / {
	proxy_pass  http://www.ls.com;
	index index.html index.htm;
}

proxy_pass 配置upstream对象即可;这样就可以实现负载均衡。

负载均衡策略
轮询(默认)、weight权重、ip_hash、less_conn 最少连接。
ip_hash策略是根据用户客户端的IP的hash值来分配具体的服务器,这样每个访问客户端都会固定访问某一个服务器,这样可以解决session丢失问题,很多网站都采用这种策略来搞负载均衡,主要是考虑到session问题。
ip_hash 参考配置:

upstream www.ls.com {
	ip_hash;
	server 172.17.0.2:8080;
	server 172.17.0.3:9080;
}

less_conn: web请求会被分发至连接数最少的服务器上。

另外还有通过第三方插件实现的一些策略。

Nginx负载均衡备份和宕机
备份backup配置:其他非backup机器挂掉后,才会请求backup机器。
案例:

upstream www.ls.com {
	server 172.17.0.2:8080;
	server 172.17.0.3:9080 backup;
}

宕机配置 配置down的服务器不参与负载均衡:

upstream www.ls.com {
	server 172.17.0.2:8080;
	server 172.17.0.3:9080 down;
}

这两个配置很多时候用于运维,维护某个机器的时候用。

Nginx实现动静分离

什么是动静分离?
动静分离是指在web服务器架构中,将静态页面与动态页面、静态接口内容与动态接口内容分开不同系统访问的架构设计方法,进而提升整个服务访问性能和可维护性。

我们可以将静态的html页面,css样式,js文件,以及图片这些静态资源放在Nginx服务器中,然后把动态请求显示的文件放在类似Tomcat这样的web容器中。这样做方便系统维护,提升系统访问性能。

配置静态路由,upstream配置:

upstream static.feng.com {
        server 172.17.0.5:80;
}

配置静态路由,server配置:

server {
    location ~ .*\.(gif|jpg|jpeg|png|bmp|wf)$ {
        proxy_pass http://static.feng.com;
    }


    location ~ .*\.(js|css)?$ {
        proxy_pass http://static.feng.com;
    }

    location ~ .*\.(html)?$ {
        proxy_pass http://static.feng.com;
    }
}

做为静态资源服务器的nginx(172.17.0.5:80)的server配置:

server {
    listen       80;
    server_name  static.feng.com;
    location / {
        root   /home/nginx; # 静态资源目录
        index  index.html index.htm;
    }
}

本地hosts配置

172.17.0.5 static.feng.com

Nginx实现虚拟主机

虚拟主机概念比较广,可以是虚拟硬件来实现多网站、多应用运行,也可以是通过一些代理服务器来实现单机多网站的运行:例如,我们一个服务器可以配置三个网站,通过三个域名访问。

Nginx可以通过反向代理来实现虚拟主机。

Nginx+keepalived实现高可用集群

keepalived 简介

Keepalived是集群管理中保证集群高可用的一个服务软件,通过使用keepalived,我们可以使nginx集群高可用。

keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。虚拟路由冗余协议,可以认为是实现路由高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就会认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。

keepalived主要有单个模块,分别是core、check和vrrp。core模块为keepavlied的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。

centos7 安装nginx

rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum install -y nginx

启动nginx并设置开机自动运行
systemctl start nginx.service
systemctl enable nginx.service
Nginx关闭命令
systemctl stop nginx.service
Nginx重启命令
systemctl restart nginx.service
关闭防火墙
systemctl stop firewalld 临时关闭
systemctl disable firewalld 永久关闭
systemctl status firewalld 查看防火墙状态
使用find查找nginx安装目录:
find / -name nginx

keepalived安装
yum install -y keepalived
keepalived常用命令
systemctl start keepalived.service
systemctl stop keepalived.service
systemctl restart keepalived.service
keepalived查看日志
tail -f /var/log/messages
查找安装目录
find / -name keepalived

keepalived+nginx高可用配置

我们首先要搞两台机器,每个机器都安装有keepalived以及Nginx,为了演示得更逼真,nginx也要反向代理搞两个tomcat实现负载均衡;所以这两台机器都在搞个docker和tomcat。

首先我们配置keepalived:
打开第一台机器的 /etc/keepalived 目录的keepalived.conf配置文件,打开:

# ! 和# 号在这里都是注解
! Configuration File for keepalived

# 全局配置
global_defs {
# keepalived宕机的时候,发送邮件通知
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   # 通知邮件发件人
   notification_email_from Alexandre.Cassen@firewall.loc
   # 邮件服务器地址
   smtp_server 192.168.200.1
   # 超时时间
   smtp_connect_timeout 30
   # 路由id (重点参数)局域网keppalived主机身份标识信息(每台唯一)
   router_id LVS_DEVEL
   # 默认是不跳过心跳检查。检查收到的VRRP通告中的所有地址可能会比较耗时,设置此命令的意思是:如果通告与接收的上一个通告来自相同的master路由器,则不执行心跳检查(跳过心跳检查)。
   vrrp_skip_check_adv_addr
   # 表示严格遵守VRRP协议,一般注释掉。下列情况会阻止启动keepalived:1. 没有VIP地址,2.单播邻居;3.在VRRP版本2中有IPV6地址。
   # vrrp_strict
    #小数类型,单位秒,在一个网卡上每组gratuitous arp消息之间的延迟时间,默认为0,一个发送的消息=n组 arp报文
   vrrp_garp_interval 0
   #小数类型,单位秒, 在一个网卡上每组na消息之间的延迟时间,默认为0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
 #主LVS是MASTER,从主机时此项要改为BACKUP,要大写
    state MASTER
    interface eth0   #指定该实例用户vrrp的网卡,用于发送vrrp。ifconfig 查看网卡,LVS监控的网络接口
     #同一实例下virtual_router_id必须相同,MASTRE/BACKUP 设置值要一样
    virtual_router_id 51
    #定义优先级,数字越大,优先级越高,把此份Conf拷贝到另一台机器上时,设置的priority值要比MASTRE权重值低
    priority 100
     #MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
    advert_int 1
    authentication {
    #验证类型和密码,有PASS和AH两种,一般用PASS,据说AH有问题,认证密码主备服务器之间一定要一致,否则出错
        auth_type PASS
        auth_pass 1111
    }
     #设置虚拟IP,可以有多个地址,每个地址占一行,不需掩码。注意:这个 ip 必须与我们在 lvs 客户端设定的vip相一致
    virtual_ipaddress {
        192.168.200.16
    }
}
# virtual_server 实现的是类似于nginx负载均衡的功能
# virtual_server 192.168.200.100 443 

说明:主备服务器配置文件区别:

      01. router_id       配置不同
	  02. state BACKUP    配置不同
	  03. priority        配置不同

脑裂现象
测试的时候,发现主机和备机同时绑定了虚拟ip,这就是所谓的脑裂现象。
运行ip addr 查看虚拟ip绑定情况

eth0
       valid_lft 306019073sec preferred_lft 306019073sec
    inet 172.16.101.99/32 scope global eth0
       valid_lft forever preferred_lft forever

发现主机和备机同时绑定了这个ip。
使用tcpdump抓包,监控一下 eth0
tcpdump -i eth0 vrrp -n
备份机结果

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
21:03:09.392315 IP 172.16.101.172 > 224.0.0.18: VRRPv2, Advertisement, vrid 5, prio 50, authtype simple, intvl 1s, length 20

发现备份机一直往 224.0.0.18(vrrp组播地址)发送报文。理论上来说,主机处于活跃状态的时候,备份机接收到报文之后是不会发送组播消息的,这个很明显就是备份机没有收到主机的组播报文。
查看 firewalld状态,发现主备机都是关闭的。
systemctl status firewalld

考虑到服务器使用的是阿里云的ECS,就决定去看看ECS是否支持组播功能。找到了《ECS使用限制》这篇文档https://help.aliyun.com/document_detail/25412.html?source=5176.11533457&userCode=r3yteowb&type=copy

点明它不支持多播协议。如果需要使用多播,建议改为使用单播点对点方式。

想想也对,keepalived在组播模式下所有的信息都会向224.0.0.18的组播地址发送,产生众多的无用信息,并且会产生干扰和冲突,所以需要将其组播的模式改为单播。这是一种安全的方法,避免局域网内有大量的keepalived造成虚拟路由id的冲突。单播模式需要关闭vrrp_strict,严格遵守vrrp协议这个选项单播需要在VIP实例配置段加入单播的源地址和目标地址。
添加以下配置,注意下面配置在主备机上ip配置项要互换下,主机上这样配置:

    unicast_src_ip 172.20.27.10         #配置单播的源地址
    unicast_peer { 
    172.20.27.11                        #配置单播的目标地址
    }

备机上ip互换这样配置:

    unicast_src_ip 172.20.27.11        #配置单播的源地址
    unicast_peer { 
    172.20.27.10                       #配置单播的目标地址
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值