nginx入门


前言:整理一下学习nginx基础的一些笔记


Nginx简介

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

Nginx安装

预先安装额为的依赖

1
2
yum -y install pcre-devel 
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel

下载安装包

官网:http://nginx.org/

1.在 /usr/local/ 下创建 nginx ⽂件夹并进⼊

1
2
3
cd /usr/local/
mkdir nginx
cd nginx

2.将 Nginx 安装包拖到 /usr/local/nginx并解压

1
tar -xvf nginx-1.18.0.tar.gz 

解压完之后, /usr/local/nginx ⽬录中会出现⼀个 nginx-1.18.0 的⽬录

3.编译安装nginx

1
2
3
cd nginx-1.17.10
./configure
make && make install

4.启动服务

1
/usr/local/nginx/sbin/nginx

5.在浏览器访问

:在 windows 系统中访问 linux 中 nginx,默认不能访问的,因为防火墙问题

  1. 关闭防火墙 (不建议使用这种方法)
  2. 开放访问的端口号,80 端口

查看开放的端口号

1
firewall-cmd --list-all 

设置开放的端口号

1
2
firewall-cmd --add-service=http --permanent
firewall-cmd --add-port=80/tcp --permanent

重启防火墙

1
firewall-cmd --reload

再次访问就可以了

常用的命令

进入nginx目录中

1
cd  /usr/local/nginx/sbin 

1、查看 nginx 版本号

1
./nginx -v 

2、启动nginx

1
./nginx 

3、停止 nginx

1
./nginx  -s  stop 

4、重新加载 nginx

1
./nginx -s reload

配置文件

配置文件位置,nginx 安装目录下,其默认的配置文件都放在这个目录的 conf 目录下。

1
cd /usr/local/nginx/conf/


以下主配置文件nginx.conf,把注释内容去掉后

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
worker_processes  1;

events {
worker_connections 1024;
}


http {
include mime.types;
default_type application/octet-stream;

sendfile on;

server {
listen 80;
server_name localhost;

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

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}

根据上述文件,我们可以很明显的将 nginx.conf 配置文件分为三部分:

第一部分:全局块
从配置文件开始到 events 块之间的内容,主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配 置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以 及配置文件的引入等。

比如上面第一行配置的:

1
worker_processes  1;

这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约 。

第二部分:events 块
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。 这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。

1
2
3
events {
worker_connections 1024;
}

第三部分:http 块
这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。

需要注意的是:http 块也可以包括 http全局块、server 块。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
http {
include mime.types;
default_type application/octet-stream;

sendfile on;

server {
listen 80;
server_name localhost;

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

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}

1.http全局块
http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
2.server块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了 节省互联网服务器硬件成本。

每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。

而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。

  1. 全局 server 块
    最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。

  2. location 块
    一个 server 块可以配置多个 location 块。
    这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称 (也可以是IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓 存和应答控制等功能,还有许多第三方模块的配置也在这里进行。


    反向代理

    反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只 需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返 回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器 地址,隐藏了真实服务器 IP 地址。


    配置实例一:使用 nginx 反向代理,访问 一个域名或IP 直接跳转到指定路径

    1
    2
    3
    4
    5
    6
    7
    8
    server {
    listen 80;
    server_name 访问的域名或ip;

    location / {
    proxy_pass http://ip:port
    index index.html index.htm;
    }

    配置实例二:使用 nginx 反向代理,根据访问的路径跳转到不同路径的服务中。

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80;
server_name 访问的域名或ip;

location ~ /edu/ {
proxy_pass http://ip:port
index index.html index.htm;
}
location ~ /vod/ {
proxy_pass http://ip:port
index index.html index.htm;
}

location 指令说明:
语法

1
2
3
location     [= | ~ | ~* | ^~ ]   uri  {  

}
  1. = :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配 成功,就停止继续向下搜索并立即处理该请求。
    1. ~:用于表示 uri 包含正则表达式,并且区分大小写。
    2. ~*:用于表示 uri 包含正则表达式,并且不区分大小写。
    3. ^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字 符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。

==注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识==

负载均衡

客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服 务器处理完毕后,再将结果返回给客户端。

这种架构模式对于早期的系统相对单一,并发请求相对较少的情况下是比较适合的,成 本也低。但是随着信息数量的不断增长,访问量和数据量的飞速增长,以及系统业务的复杂度增加,这种架构会造成服务器相应客户端的请求日益缓慢,并发量特别大的时候,还容易造成服务器直接崩溃。很明显这是由于服务器性能的瓶颈造成的问题,那么如何解决这种情 况呢?

我们首先想到的可能是升级服务器的配置,比如提高 CPU 执行频率,加大内存等提高机 器的物理性能来解决此问题,但是我们知道摩尔定律的日益失效,硬件的性能提升已经不能 满足日益提升的需求了。最明显的一个例子,天猫双十一当天,某个热销商品的瞬时访问量 是极其庞大的,那么类似上面的系统架构,将机器都增加到现有的顶级物理配置,都是不能 够满足需求的。那么怎么办呢? 上面的分析我们去掉了增加服务器物理配置来解决问题的办法,也就是说纵向解决问题 的办法行不通了,那么横向增加服务器的数量呢?这时候集群的概念产生了,单个服务器解 决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们 所说的负载均衡 。

在nginx.conf中进行配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
http{
......
upstream myserver{
#举个栗子
server 192.168.234.131:8080;
server 192.168.234.131:8081;
}
......

server{
location / {
proxy_pass http://myserver;
#每个从Nginx分发的请求,连接到后台的连接如果超过10秒,则视为连接失败,Nginx会将此请求分发到另一台服务器
proxy_connect_timeout 10;
}
}
}

负载均衡算法

1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。

2、weight
weight 代表权,重默认为 1,权重越高被分配的客户端越多
指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。
例如:

1
2
3
4
upstream myserver{
server 192.168.234.131:8080 weight=10;
server 192.168.234.131:8081 weight=5;
}

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

1
2
3
4
5
upstream myserver{
ip_hash;
server 192.168.234.131:8080;
server 192.168.234.131:8081;
}

4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。

1
2
3
4
5
upstream myserver{
fair;
server 192.168.234.131:8080;
server 192.168.234.131:8081;
}

动静分离

Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和 静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种。

一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;

另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。

通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使 浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资 源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可, 所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件, 不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送 一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304,如果有修改,则直接从服务器重新下载,返回状态码 200。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server {
  listen 80;
  server_name 192.168.25.35; # 当接收到http请求时,首先host和这里的server_name进行匹配,如果匹配上,则走这个虚拟主机的location路由

  #所有js,css相关的静态资源文件的请求由Nginx处理
location ~.*\.(js|css)$ {
root /opt/static-resources; #指定文件路径
expires 12h; #过期时间为12小时
}
#所有图片等多媒体相关静态资源文件的请求由Nginx处理
location ~.*\.(html|jpg|jpeg|png|bmp|gif|ico|mp3|mid|wma|mp4|swf|flv|rar|zip|txt|doc|ppt|xls|pdf)$ {
root /opt/static-resources; #指定文件路径
expires 7d; #过期时间为7天
}

#其他的url则转发到 http://192.168.25.35:8080
  location / {
    proxy_pass http://192.168.25.35:8080;
#或也可以指定目录,举个栗子
#root /opt/dynamic;
  }

}

Nginx 配置高可用的集群 (主从模式)

首先开启两台虚拟机分别是192.168.234.131和192.168.234.132,在两台虚拟机上安装nginx和keepalived。

keepalived简介

Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。

keepalived安装

1
yum install -y keepalived

安装之后,在 etc 里面生成目录 keepalived,有文件 keepalived.conf

主从配置

修改/etc/keepalived/keepalivec.conf 配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
global_defs { 
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服务器地址
smtp_connect_timeout 30
router_id LVS_DEVEL #标示虚拟路由的id
}

vrrp_script chk_http_port {

script "/usr/local/src/nginx_check.sh" #(检测脚本路径)
interval 2 #(检测脚本执行的间隔)
weight 2

}

vrrp_instance VI_1 {
state MASTER # 备份服务器上将 MASTER 改为 BACKUP
interface ens33 //查看自己的网卡名称修改为它
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 #VRRP发送advertisment数据包的间隔时间
authentication {
auth_type PASS #类型是明文密码,官方推荐使用明文密码
auth_pass 1111 #明文密码内容,互为高可用的主机之间的密码也应该相同
}
virtual_ipaddress {
192.168.234.50 // VRRP H 虚拟地址
}
}

在/usr/local/src 添加检测脚本nginx_check.sh
如果主节点的Keepalived服务正常运行,而Nginx运行异常,那么后端的Web服务器无法收到请求。nginx Web服务的守护脚本用于当检测Nginx的服务是否正常运行,如果不是正常运行,应该停掉Keepalived的服务,这样才能自动切换到备节点上。

1
2
3
4
5
6
7
8
9
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then #如果nginx停止
/usr/local/nginx/sbin/nginx #重新启动nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then #如果重新启动失败,停止keepalived
killall keepalived
fi
fi

把两台服务器上 nginx 和 keepalived 启动
启动 nginx:

1
./nginx 

启动 keepalived:

1
systemctl start keepalived.service 

测试

在浏览器地址栏输入 虚拟 ip 地址 192.168.234.50

把主服务器(192.168.234.131)keepalived 停止,再输入 192.168.234.50

1
systemctl stop keepalived.service

Nginx 配置高可用的集群 (双主模式)

和上述步骤一样,在修改keepalived.conf时增加一段新的配置,此时192.168.234.131即为 Keepalived 的主节点也为备节点,192.168.234.132节点同样即为 Keepalived 的主节点也为备节点。

192.168.234.131的keepalived.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
global_defs { 
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
router_id LVS_DEVEL
}
vrrp_script chk_http_port {

script "/usr/local/src/nginx_check.sh" #(检测脚本路径)
interval 2 #(检测脚本执行的间隔)
weight 2

}

vrrp_instance VI_1 {
state MASTER
interface ens33 //网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.234.50 // VRRP H 虚拟地址
}
}
vrrp_instance VI_2 {
state BACKUP
interface ens33 //网卡
virtual_router_id 52 # 主、备机的 virtual_router_id 必须相同
priority 50 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.234.60 // VRRP H 虚拟地址
}
}

192.168.234.132的keepalived.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
global_defs { 
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
router_id LVS_DEVEL
}
vrrp_script chk_http_port {

script "/usr/local/src/nginx_check.sh" #(检测脚本路径)
interval 2 #(检测脚本执行的间隔)
weight 2

}

vrrp_instance VI_1 {
state BACKUP
interface ens32 //网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 50 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.234.50 // VRRP H 虚拟地址
}
}
vrrp_instance VI_2 {
state MASTER
interface ens32 //网卡
virtual_router_id 52 # 主、备机的 virtual_router_id 必须相同
priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.234.60 // VRRP H 虚拟地址
}
}

测试可以发现我们访问 keepalived 中配置的两个 虚拟IP 都可以正常调度,当我们停止任意一台 keepalived节点,同样还是正常访问;到此,keepalived+nginx 高可用集群(双主模式)就搭建完成了。

评论