Skip to content

Nginx 五大核心功能全解析

1. 安装 nginx

Nginx 作为高性能的 HTTP 和反向代理 web 服务器,有测试超出 nginx 能够轻松支持 50000 个并发连接。nginx 的安装建议通过三个步骤来实现:1. 编译工具与库文件 2. PCRE(为了支持 Rewrite 功能) 3. nginx 主程序

1.1 安装编译工具以及库文件

bash
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel

1.2 安装 PCRE(为了支持 Rewrite 功能)

bash
# 下载安装包
cd /usr/local/src/
wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
# 解压安装包
tar zxvf pcre-8.35.tar.gz
# 进入安装目录
cd pcre-8.35
# 编译安装
./configure
make && make install

1.3 安装 nginx

bash
# 下载 nginx
cd /usr/local/src/
wget http://nginx.org/download/nginx-1.22.0.tar.gz
# 解压
tar zxvf nginx-1.22.0.tar.gz
cd nginx-1.22.0
# 编译安装
./configure --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.35
make
make install
# 启动 nginx
/usr/local/webserver/nginx/sbin/nginx -s reload

2. nginx 核心功能——反向代理

反向代理应该是 Nginx 做的最多的一件事了,反向代理(Reverse Proxy)方式是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并从内部服务器上得到的結果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器,而代理服务器能够做外部网络访问的真实服务器不能直接被外部网络访问,所以需要一个代理服务器,而代理服务器能够被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。

反向代理示意图

反向代理代码示意

nginx.conf 配置文件中,使用 proxy_pass 指令将请求转发到代理服务器

nginx
# 访问 http://file.dreams.com.cn 时,代理到 http://127.0.0.1:8080
server {
    listen 80;
    server_name file.dreams.com.cn;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $server_name;
        # 代理目标地址
        proxy_pass http://127.0.0.1:8080;
    }
}

3. nginx 核心功能——负载均衡

Nginx 负载均衡是一种廉价、灵活的实现服务器高可用的方式。用户有多台服务器时,根据规则随机的将请求分到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。

负载均衡轮询示意图

负载均衡的核心是 upstream 模块,代码示例如下:

nginx
upstream backserver {
    server 172.16.0.7:8080;
    server 172.16.0.8:8080;
}

server {
    listen 80;#....
    server_name file.dreams.com.cn;
    location / {
        # 代理的目标地址
        proxy_pass http://backserver; # 通过 http://file.dreams.com.cn 转送到 http://backserver
    }
}

负载均衡模式——轮询(默认)

请求按时间顺序逐一分发到不同的负载均衡服务器,如果负载均衡服务器down掉,会自动剧除,处理请求颜序:ABABAB...

nginx
upstrean backserver {
    server 172.16.0.7:808;
    server172.16.0.8:8089;
}

负载均衡模式——weight(权重)

加权轮询模式,圆形越粗越忙,人为指定轮询几率,weight 和访问比例成正比,处理请求顺序:AABBAAAAB...

nginx
upstream backserver {
    server 172.16.0.7:8080 weight=2;
    server 172.16.0.8:8080 weight=1;
}

负载均衡模式——ip_hash

每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题,后端服务器不是状态的,就需要使用 ip_hash 确保同一个用户的访问固定到后端服务器。

nginx
upstream backserver {
    ip_hash;
    server 172.16.0.7:8080;
    server 172.16.0.8:8080;
}

负载均衡模式——fair(第三方)

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

nginx
upstream backserver {
    server 172.16.0.7:8080;
    server 172.16.0.8:8080;
    fair;
}

负载均衡模式——url_hash(第三方)

按访问 url 的 hash 结果来分配请求,使每个 url 定向到同一个后端服务器。

nginx
upstream backserver {
    server 172.16.0.7:8080;
    server 172.16.0.8:8080;
    hash $request_uri;
    hash_method crc32;
}

4. nginx 核心功能——动静分离

Nginx 动静分离是指在 web 服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开不同系统访问的架构设计方法,提升整体服务访问性能和可维护性。反向代理的时候,如果是静态资源,就直接从 Nginx 发布的路径去读取,而不需要从后台服务器获取了。

注意: 一般在集群环境,动静分离都结合负载均衡来使用

动静分离代码示例如下:

nginx
upstream backserver {
    server 172.16.0.7:8080
    server 172.16.0.8:8080
}

server {
    listen 80;# ....
    server_name file.dreams.com.cn;
    location / {
        root /data/web;
        index index.html index.htm;
    }
    # 所有静态资源都由 nginx 处理
    location ~* \.(png|gif|jpg|jpeg|mp4|mp3|css|js)$ {
        root /data/web;
    }
    # 所有动态资源都由后端 tomcat 服务器集群处理
    location ~* \.(jsp|do|php)$ {
        proxy_pass http://backserver;
    }
}

5. nginx 核心功能——正向代理

Nginx 正向代理简单来说,就是客户端通过访问目标服务端,再由目标服务端来转发流量访问互联网,这样可以达到隐藏客户端真实 IP 的效果。

注: 可以理解为客户端通过 Nginx 做了一层代理,代理访问互联网

正向代理代码示例如下:

nginx
server {
    listen 8999;

    resolver 114.114.114.114; # dns 解析服务器

    location /{
        proxy_pass $scheme://$host$request_uri; # proxy_pass 用来代理的网站,
        # $scheme 是客户端请求的协议(如 http)
        # $host 是客户端请求的域名(如 baidu.com)
        # $request_uri 是客户端访问的 url 地址(如 /baidu?s=29)。
        # 它们拼接成就是 http://baidu.com/baidu?s=29
    }
}

6. nginx 核心功能——热启动(附 SSL 证书配置方法)

当我们修改完配置文件后,不用停止 Nginx,就可以实现配置生效。

热启动代码示例如下:

bash
# Centos 重新读取配置的命令是:
/nginx -s reload

# Windows 重新读取配置的命令是:
nginx.exe -s reload

nginx 证书配置核心代码如下:

nginx
server {
    # SSL 使用 443 端口
    listen 443 ssl;
    # SSL 证书绑定的域名
    server_name www.dreams.com;
    # 证书文件
    ssl_certificate /usr/local/nginx/conf/fullchain.crt;
    ssl_certificate_key /usr/local/nginx/conf/cert.key;

    ssl_session_cache shared:SSL:1m; # 启用 SSL Session 缓存
    ssl_session_timeout 5m; # 缓存 SSL 握手产生的密钥和加密密钥的时长

    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; # 使用较为安全的协议集
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 推荐使用的 TLS 协议的类型
    ssl_prefer_server_ciphers on; # 加密套件优先选择服务器的加密套件

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

Released under the MIT License.