1

Nginx葵花宝典之基本概念、命令、反向代理、负载均衡、动静分离、高可用

 2 years ago
source link: https://my.oschina.net/u/3613013/blog/5321360
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

一、基本概念

1.什么是Nginx

Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理server。其特点是占有内存少。并发能力强,其并发能力确实在同类型的网页server中表现较好。

http服务器
Web服务器是指驻留于因特网上某种类型计算机的程序。当Web浏览器(客户端)连到服务器上并请求文件时,服务器将处理该请求并将文件反馈到该浏览器上,附带的信息会告诉浏览器如何查看该文件(即文件类型)。服务器使用HTTP(超文本传输协议)与客户机浏览器进行信息交流,这就是人们常把它们称为HTTP服务器的原因。

代理服务器
通常是指局域网内部的机器通过代理服务器发送请求到互联网上的服务器,代理服务器一般作用在客户端。

反向代理
客户端向反向代理的命名空间中的内容发送普通请求,接着反向代理将推断向何处(原始服务器)转交请求,并将获得的内容返回给客户端。
up-bee0c692b00a40fd33ab19c294097b356b2.png

正向代理
正向代理是一个位于客户端和原始服务器之间的代理服务器,为了从原始服务器取得内容,客户端向代理服务器发送一个请求并指定目标原始服务器。然后代理服务器向原始服务器转交请求并将获得的内容返回给客户端。

反向代理vs正向代理
从安全性来讲,正向代理同意客户端通过它访问随意站点而且隐藏客户端自身,因此你必须採取安全措施以确保仅为经过授权的客户端提供服务。反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。

2.Nginx特点

  • 反向代理:

上面已经说过了。

  • 负载均衡:

当请求过多,单个服务器难以负荷时,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上。

up-3941a76789217f367a91b5634c48511198d.png

up-94b0a388f6eacf468afe158db73ba981e42.png

动静分离:
为了加快网站的解析速度,可以吧动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。具体的内容见本博客后面第五章。

二、安装、常用命令、配置文件

首先你得有一个linux操作系统的环境,要么是你自己的服务器,要么是你自己电脑上的虚拟机,要么是你租的云服务器。以下以centos为例。

安装gcc环境,用来将官网下载的源码进行编译:

yum install gcc-c++

安装 pcre 库:

yum install -y pcre pcre-devel

安装zlib 库:

yum install -y zlib zlib-devel

安装安装 OpenSSL 库:

yum install -y openssl openssl-devel

下载nginx包:

wget -c https://nginx.org/download/nginx-1.12.0.tar.gz

解压nginx包:

tar -zxvf nginx-1.12.0.tar.gz

进入nginx文件夹:

cd nginx-1.12.0

使用默认配置:

./configure

编译安装:

make
make install

到此,nginx算是安装好了。

2.常用命令

以下所有命令都必须进入sbin目录以后才能执行:

# 进入nginx目录
cd /usr/local/nginx/sbin/ 

查看版本号:

./nginx -v

启动nginx:

# 启动nginx
./nginx

启动时报错端口占用,解决:

# 杀死80端口的进程
fuser -k 80/tcp

现在再次启动nginx。

关闭nginx:
./nginx -s stop

重新加载配置文件:

./nginx -s reload

访问nginx:

# 在浏览器中访问以下地址
http://服务器ip:80/

up-b3468c4cde9f5da41898a9ac1f052a2222d.png

3.配置文件

  • 配置文件所在目录:

执行以下命令,就可以访问并修改配置

vim /usr/local/nginx/conf/nginx.conf
  • 配置文件——全局块:

这部分都是些影响nginx全局配置的指令:

#user  nobody;
worker_processes  1;# 配置nginx并发处理量,但是并发也会受硬件、软件的制约

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;
  • 配置文件——events块:

这部分用来配置nginx服务器与用户的网络连接:

events {
    worker_connections  1024;# nginx支持的最大连接数
}
  • 配置文件——http块:
http {
    include       mime.types;
    default_type  application/octet-stream;
	
	location / { # 配置路径跳转
            root   html;
            index  index.html index.htm;
        }
        
    #server {
    #    listen       8000;# 监听接口
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;# 服务器名

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
    
    }    

4.防火墙相关命令

如果linux中开启了防火墙,在windows系统中访问linux系统中的nginx端口默认访问不到,需要修改防火墙配置。

# 查看开放的端口号
firewall-cmd --list-all

# 设置开放的端口号
firewall-cmd --add-service=http --permanent
firewall-cmd --add-port=80/tcp --permanent

# 重启防火墙
firewall-cmd --reload

三、配置——反向代理

1.反向代理实例1

我们想实现的效果是:打开浏览器,访问www.123.com将跳转到linux系统tomcat主页面中去。具体过程如下:

up-17e8395f57fc4cdffab1bae5b15a99ec7ae.png

(1)在windows系统的hosts文件进行域名映射
进入以下路径,并找到hosts文件:

C:\Windows\System32\drivers\etc

打开hosts文件后添加如下配置:

1.15.34.101 www.123.com

(2)安装tomcat

  • 依次执行以下命令下载安装tomcat:
wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.31/bin/apache-tomcat-8.5.31.tar.gz
tar xf apache-tomcat-8.5.31.tar.gz -C /usr/local/
cd /usr/local/
ln -sv apache-tomcat-8.5.31 tomcat
  • 配置环境变量:
# 执行此命令后粘贴下方配置
vim /etc/profile.d/tomcat.sh

# 配置内容
CATALINA_BASE=/usr/local/tomcat
PATH=$CATALINA_BASE/bin:$PATH
export PATH CATALINA_BASE

# 使配置文件生效
source  /etc/profile.d/tomcat.sh
  • 查看tomcat版本状态:
catalina.sh version
  • 启动tomcat:
cd /usr/local/tomcat/bin
./startup.sh
  • 访问tomcat:

由于没配置端口,默认为8080。

# 在浏览器中输入url访问
http://服务器ip:8080/
  • 如何配置端口号
# 进入配置文件夹
cd /usr/local/tomcat/conf

# 打开并修改server.xml配置文件,port属性的值就是当前tomcat服务器的端口号
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

(3)在nginx中进行转发请求的配置

在linux服务器中执行以下命令,打开nginx配置文件:

vim /usr/local/nginx/conf/nginx.conf

然后修改server部分的配置:

server {
        listen       80;# 配置默认端口
        server_name  1.12.34.101; # 配置服务器名为ip

        location / {
            root   html;
            proxy_pass http://1.15.34.101:8080; # 添加这一行
            index  index.html index.htm;
        }
 }

现在,当我们在浏览器中访问www.123.com就会被nginx转发给tomcat了。

up-d4abe893a8157fdfd4888a09d82fe4228af.png

2.反向代理实例2

我们想实现的效果是:使用nginx反向代理,根据访问的路径跳转到不同的tomcat服务器。

nginx监听端口为9001,服务器ip为1.12.34.101

访问http://1.12.34.101:9001/edu/跳转至tomcat服务器1(http://1.12.34.101:8000)
访问http://1.12.34.101:9001/vod/跳转至tomcat服务器2(http://1.12.34.101:8001)

(1)准备tomcat服务器
我们需要两个tomcat服务器,一个8000端口,一个8001端口。

前面一节已经展示了怎么安装tomcat,安装两个tomcat步骤大同小异:

新建两个目录,分别装两个tomcat服务器,可以通过路径文件夹名的不同予以区分
在另个目录下下载、安装tomcat
配置两个服务器的端口号,一个为8000,一个为8001
(2)配置Nginx
nginx配置文件路径上一节已经说过了,这里只给出具体配置。

修改server部分配置:

server {
        listen       9001;# 配置端口
        server_name  1.12.34.101; # 配置服务器名为ip

        location ~ /edu/ {
            proxy_pass http://1.15.34.101:8000; 
        }
		location ~ /vod/ {
            proxy_pass http://1.15.34.101:8001; 
        }
 }

3.location指令说明

location [ = | ~ | ~* | ^~ ] uri {

}

= :用于不含正则表达式的uri前,表示严格匹配
~ :用于正则表达式的uri前,区分大小写
~* :用于正则表达式的uri前,不区分大小写
^~ :用于不含正则表达式的uri前,要求nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。

四、配置——负载均衡

我们想要实现的效果是:在浏览器中访问http://1.12.34.101/edu/a.html,nginx能实现负载均衡效果,将请求平均到8080和8081端口中去。简单来说就是,虽然只有一个请求,但每次发起请求nginx会以相同的概率转发到两个tomcat服务器中去。

1.基本配置步骤

  • 搭建两个tomcat服务器,端口分别为8080和8081。
  • 在两个tomcat服务器里面的webapps目录中,创建edu文件夹,再在edu文件夹中创建a.html页面。
  • 在nginx的配置文件中进行负载均衡的配置:
# 在http模块中添加以下配置,指明要参与负载均衡的服务器
upstream myserver{
	ip_hash;
	server 1.12.34.101:8080 weight=1;
	server 1.12.34.101:8081 weight=1;
}

# 修改server模块
server {
        listen       80;
        server_name  1.12.34.101; 

        location / {
            proxy_pass http://myserver; 
            root html;
            index index.html index.htm;
        }
 }

2.Nginx中负载均衡的分配方式

(1)轮询(默认)
每个请求按照时间顺序逐一分配到不同后端服务器中去,挂了的服务器会被自动剔除。

(2)weight
weight代表权重,默认为1,权重越高,被分配的客户端请求会越多。

upstream myserver{
    server 1.12.34.101:8080 weight=10;
    server 1.12.34.101:8081 weight=10;
}

(3)ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstream myserver{
	ip_hash;
	server 1.12.34.101:8080;
	server 1.12.34.101:8081;
}

(4)fair

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream myserver{
	server 1.12.34.101:8080;
	server 1.12.34.101:8081;
	fair;
}

五、配置——动静分离

什么是动静分离?严格意义上来说就是将动态请求和静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat处理动态页面。

up-a302df90dc30e3d7703c1c5c035653dbcbb.png

实现方式:

  • 主流:纯粹地把静态文件独立成单独的域名,放在独立的服务器上。
  • 将动态文件和静态文件放一起,通过Nginx分开。

基本配置步骤

  • 在linux系统中准备静态资源:
# 创建并进入data目录,再进入data中创建目录www,用来放静态资源
mkdir data
cd data
mkdir www

# 在www中创建a.txt,并随便写入点内容作为测试,保存退出
vi a.txt
  • 修改nginx配置,使得静态资源能被访问:
# 修改server模块
server {
        listen       80;
        server_name  1.12.34.101; 

        location /www/ {
        	root /data/;# 根目录
            proxy_pass http://myserver; 
            index index.html index.htm;
        }
 }
  • 动态资源的准备及Nginx配置:

这部分内容第三、四章已经讲过了,不再赘述。

六、配置——高可用集群

什么叫高可用?简单来说就是,当我们的nginx服务器down机了,整个系统仍然能运转,就说明整个体系是高可用的。

up-a5a061ed79366df843a608ab4b639cb9ac7.png

实现原理:

准备两台nginx服务器,一台主服务器master,一台备份服务器backup,当master挂了,立马切换为backup,使得整个体系仍然能运转。

keepalived软件:两个nginx服务器都需要安装keepalived,它的作用是判断当前nginx服务器是否还存活着。

虚拟ip:我们还需要虚拟ip这么个东西,用来访问nginx服务器,当master挂了,虚拟ip会和backup进行绑定。

up-ea7be9d8f93bf0f78b9f2270a17dbf7800c.png

基本配置步骤

  • 准备两台服务器,在两台服务器都装上nginx和keepalived

假设一台ip为1.12.34.101,另一台为1.12.34.131

# keepalived安装命令:
yum install keepalived -y

# keepalived的配置文件路径为:
/etc/keepalived/keepalived.conf
  • 配置主服务器的keepalived:
# 打开keepalived.conf
vim /etc/keepalived/keepalived.conf

修改配置:

! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL # 主机名字,通过它能访问到主机
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

# 针对检测脚本的配置
vrrp_script chk_http_port{
    script "/usr/local/src/nginx_check.sh" # 脚本所在路径
    interval 2 # 执行脚本的间隔
    weight 2 # 设置当前服务器的权重
}

# 虚拟ip的配置
vrrp_instance VI_1 {
    state MASTER # 主服务器这里写MASTER,备用服务器这里写BACKUP    
    interface eth0 # 绑定的网卡
    virtual_router_id 51 # 主服务器、备用服务器这里的值必须相同
    priority 100 # 优先级,主服务器应该较大,备用服务器应该较小
    advert_int 1 # 服务器心跳频率,每1s跳一次
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16 # vrrp H虚拟地址
        192.168.200.17
        192.168.200.18
    }
}
  • 配置主服务器的脚本nginx_check.sh:

在指定目录下创建脚本文件:

vim /usr/local/src/nginx_check.sh

脚本内容:

#!/bin/bash
A=`ps -C nginx -no-header |wc -l`
if [ $A -eq 0 ];then
	/usr/local/nginx/sbin/nginx 
	sleep 2
	if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
	 killall keepalived
	fi
fi
  • 配置从服务器的keepalived:
# 打开keepalived.conf
vim /etc/keepalived/keepalived.conf

修改配置:

! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

# 针对检测脚本的配置
vrrp_script chk_http_port{
	script "/usr/local/src/nginx_check.sh"
	interval 2 # 执行脚本的间隔
	weight 2 # 权重参数
}

# 虚拟ip的配置
vrrp_instance VI_1 {
    state BACKUP # 备用服务器这里写BACKUP	
    interface eth0 # 网卡要改成服务器对应的网卡
    virtual_router_id 51 # 主服务器、备用服务器这里的值必须相同
    priority 90 # 优先级,主服务器应该较大,备用服务器应该较小
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16 # vrrp H虚拟地址
        192.168.200.17
        192.168.200.18
    }
}
  • 配置主服务器的脚本nginx_check.sh:

同主服务器。

  • 启动两台服务器的nginx和keepalived:

keepalived启动命令:

systemctl start keepalived.service

至此,高可用集群就配置好了,可以自行配置并测试看看效果。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK