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请求。


__EOF__

本文作者ZOLMK
本文链接https://www.cnblogs.com/zolmk/p/17733464.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   zolmk  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示