Nginx实战(基础篇)

一、Nginx 简介

1.1 Nginx的几种发行版

Nginx常用的有如下四种版本:

  • Nginx开源版,该版本比较纯净,但不适合做二开
  • Nginx pro商业版
  • Tengine 淘宝内部使用的Nginx,一般项目可以使用该版本的Nginx
  • OpenResty(Nginx+Lua),如果需要对Nginx进行扩展,可优先选择这个,支持使用Lua脚本对Nginx进行功能扩展

1.2 安装Nginx

nginx: download下载Nginx,也可以使用如下命令下载:

wget https://nginx.org/download/nginx-1.24.0.tar.gz

然后,解压:

tar -zxvf file.tar.gz

检查环境和配置:

./configuration --prefix=/usr/local/nginx
# 这里prefix的含义是指定nginx的安装目录

进行编译和安装:

make & make install

1.3 将Nginx安装为系统服务

创建服务脚本
vi /usr/lib/systemd/system/nginx.service
服务脚本内容

[Unit]
Description=nginx
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true

[Install]
wantedBy=multi-user.target�

重新加载系统服务
systemctl daemon-reload
然后就可以使用systemctl start nginx来启动nginx服务。

二、Nginx基础配置

2.1 虚拟主机 vhost

可以利用虚拟主机在一台Nginx服务器上配置多个站点,充分发挥服务器性能。
Nginx中配置虚拟主机主要利用server来实现,如下所示:

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.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       8080;
        server_name  localhost;
        location / {
            root   /www;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

配置虚拟主机的原则是 server_name + port 必须是唯一的,server_name 也可以使用域名来进行配置,如下所示:

http {
    ...
    server {
        listen       80;
        server_name  zolmk.tech;
        ...
    }
    server {
        listen       80;
        server_name  vod.zolmk.tech;
        ...
    }
}

2.2 server_name 的多种匹配方式

http.server 标签中的 server_name有多种匹配方式可以使用,它们分别是:

  • 全限定域名或IP:即使用完整名称进行匹配
  • 通配符匹配:即使用 * 进行匹配
  • 正则匹配:即使用正则表达式进行匹配

正则表达式匹配示例:

http {
    ...
    server {
        listen       80;
        server_name  zolmk.tech;
        ...
    }
    server {
        listen       80;
        server_name  ~^[0-9]*\.vod\.zolmk\.tech$;
        ...
    }
}

在 nginx 中,location 和 server_name 等使用正则表达式进行匹配时,必须在正则表达式前面加~,以表示后面的内容为正则表达式。

2.3 反向代理和正向代理

正向代理:一般指内网用户通过正向代理来访问外网,代理网关是内网和外网连接的桥梁。
反向代理:与正向代理不同的是代理网关充当的角色,在反向代理中,代理网关的作用是隐藏内部服务细节,向用户提供统一的接口,代理网关起到中转请求的作用。

Nginx中,可以通过如下方式配置正向代理:

server {
	...
	# 配置dns服务器
	resolver 8.8.8.8;
	location / {
		# $scheme表示协议类型
		proxy_pass $scheme://$host$request_uri;
		...
	}
}

Nginx中,可通过如下方式配置反向代理:

upstream httpds {
	server 192.168.1.110;
	server 192.168.1.112;
}
server {
	...
    location / {
            proxy_pass  http://httpds;
    }
}

这里起作用的主要是 proxy_pass 和 upstream 关键字,在 server.location 里面的 proxy_pass 表示该 location 路径下使用代理模式, 它的值 http://+别名 ,这里的别名和 upstream 后面紧跟的别名一一对应,upstream 关键字用来指定一组相同的服务。

2.4 负载均衡

Nginx 支持的负载均衡主要有:轮询、权重、最少连接数、uri哈希、ip哈希。通常我们会使用轮询和权重的方式来进行负载均衡。

轮询方式:

upstream httpds {
	server 192.168.1.110;
	server 192.168.1.112;
}
server {
	...
    location / {
            proxy_pass  http://httpds;
    }
}

权重方式:

upstream httpds {
	server 192.168.1.110 weight=8;
	server 192.168.1.112 weight=2;
}
server {
	...
    location / {
            proxy_pass  http://httpds;
    }
}

ip哈希:

upstream httpds {
	ip_hash;
	server 192.168.1.110;
	server 192.168.1.112;
}

uri哈希:

upstream httpds {
	hash $request_uri;
	server 192.168.1.110;
	server 192.168.1.112;
}

cookie值哈希:

upstream httpds {
	hash $cookie_jssessionid;
	server 192.168.1.110;
	server 192.168.1.112;
}

上述cookie值哈希需要确保cookie中包含jssessionid字段。

在 upstream.server 中还有几个关键字可以配置,分别是 down 和 backup,down 表示该服务不可用,backup 表示仅当其他资源都不可用时,再使用该资源;当其他资源可用时,不会使用它。

upstream httpds {
	server 192.168.1.110 weight=8 down;
	server 192.168.1.112 weight=2;
	server 192.168.1.112 weight=2 backup;
}
server {
	...
    location / {
            proxy_pass  http://httpds;
    }
}

2.5 动静分离

动静分离中的“动”和“静”分别指动态资源和静态资源,动静分离指将服务中的静态资源存放在Nginx所在的服务器,当客户端请求静态资源时,Nginx直接返回给用户,加速了静态资源的传输效率。

动静分离一般是通过 server.location 进行配置,示例如下:

server {
        ...
        location ~*/(css|js|img) {
            root html;
        }
}

location后的值中,'~'后面的星号表示忽略大小写。上述配置使用了正则表达式来匹配 /css /js /img 路径。

2.6 URL rewrite

url重写在一些想要隐藏敏感路径的情况下非常有用,它需要配合正则表达式来使用,示例如下:

location / {
	...
	rewrite ^/(.*).(htm|html|txt)$ /$1.$2 break;
}

rewrite的格式为 rewrite 需要重写的url 重写后的url ,用括号来进行分组,通过$数字来获取分组。

2.7 防盗链

防盗链可以防止服务器内部的静态资源被随意在其他地方使用,它是通过http请求头中的referer属性来实现的,当浏览器在发出请求的时候,如果该请求是通过页面链接引起的,那么浏览器会在请求头中加入referer,它的值为当前页面的根url,Nginx服务器可以通过配置来验证referer的值是否符合预期,如果不符合,则返回自定义内容,如果符合,返回预期内容。

防盗链配置规则:

valid_referers none | blocked | server_names | strings ...
  • none:用来处理referer为空的情况
  • blocked:检测referer被防火墙或代理服务器删除或伪装的情况
  • server_names:可以配置多个server_name进行验证

Nginx配置示例如下:

location ~*/(css|js|img) {
	valid_referers www.zolmk.tech zolmk.tech;
    if ($invalid_referer){
	    return 403;
    }
    root html;
}�

这里验证无效的referer后,不仅可以返回错误码,还可以使用url rewrite技术,返回指定的内容。

location ~*/(css|js|img) {
	valid_referers www.zolmk.tech zolmk.tech;
    if ($invalid_referer){
	    rewrite ^/ /img/x.png break;
    }
    root html;
}�

上面的配置将所有的未通过验证的referer的url进行了重写,将返回 /img/x.png 的内容。

2.8 Nginx 高可用——keepalived

微服务通过集群的方式部署和使用Nginx进行负载均衡配置实现了服务的高可用,假如Nginx代理服务器挂掉,用户无法访问被代理的微服务,此时服务就变为不可用状态。
为了实现Nginx高可用,需要引入一个keepalived程序,它的功能和它的名字一样,就是用来检测服务是否存活的,具有相同配置的不同主机上的keepalived程序称为一个组,keepalived程序管理着一个虚拟IP(vip),组内同一时刻仅有一台主机可持有该vip。也就是说,具有相同配置的keepalived之间相互通信,当keepalived程序检测到持有vip的主机挂掉后,它将从存活的主机中选择一台来将vip添加到该主机的网卡上。持有vip的主机对外提供服务。

1. 安装 keepalived

  • centos可用通过命令yum install keepalived进行安装,配置文件地址为/etc/keepalived/keepalived.conf
  • Keepalived for Linux下载编译安装,安装方式和安装Nginx类似
    2. 配置 keepalived
    最小的 keepalived 配置如下:
! Configuration File for keepalived

global_defs {
	! 路由id,同一组需配置相同
   router_id LB_111
}

vrrp_instance VI_1 {
	! state=MASTER | BACKUP 如果为MASTER,则表示为主节点,如果为BACKUP,则表示备用节点
    state MASTER
    ! 这里填写网卡名称,可以通过 ip addr 命令获取
    interface enp0s3
    ! 虚拟路由id,同一组需配置相同
    virtual_router_id 51
    ! 当前节点获得vip的优先级,优先级越高,获得vip的概率越大
    priority 100
    ! 检测时间间隔,多久检测一次主节点是否存活
    advert_int 1
    ! 鉴权信息,同一组需配置相同
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    ! 虚拟的ip地址,该地址由keepalived管理
    virtual_ipaddress {
        192.168.1.111
    }
}�

最少配置两台机器作为Nginx网关服务器,一台做master,一台做backup,配置keepalived后,当主节点挂掉后,keepalived会自动将虚拟ip加入到备用节点的网卡上,类似于IP漂移。

2.9 http + ssl

首先假设我们已经通过阿里云等平台申请到了Nginx可以使用的证书、私钥文件(xx.pem、xx.key),在Nginx中配置https非常简单,示例如下:

server {
    listen 443 ssl;
    server_name  localhost;
    ssl_certificate xx.pem;
    ssl_certificate_key xx.key;
    ...
}
server{
    listen 80;
    server_name localhost;
    return 301 https://$server_name$request_uri;
}�

上面配置ssl时使用了相对路径,所以需要将xx.pem和xx.key放入nginx/conf文件夹中。上述配置将http请求转换为https请求。

posted @ 2023-09-27 18:54  zolmk  阅读(11)  评论(0编辑  收藏  举报