简介

Nginx是什么

Nginx("engine x")是一个HTTP Web服务器同时也支持 IMAP/POP3 代理服务。Nginx 以其高并发处理能力和低资源消耗而闻名,广泛应用于各种 Web 应用和网络服务中。

官网链接

Nginx能做什么

  1. 静态资源服务器

    • 提供静态文件(HTML、CSS、JavaScript、图片等)的高效访问

    • 支持缓存控制,提高静态资源的加载速度

  2. 反向代理

    • 将客户端请求转发到后端服务器,隐藏后端服务器的真实地址

  3. 负载均衡

    • 支持多种负载均衡算法,如轮询、最少连接、IP 哈希、加权轮询等

    • 健康检查,自动移除不健康的服务

  4. 动静分离

    • 将动态、静态的资源请求分开,提升性能和可维护性

  5. 访问控制

    • 支持 IP 黑白名单,允许或拒绝特定 IP 地址的访问

    • 支持 HTTP 基本认证,保护特定资源

  6. 日志记录

    • 记录客户端的请求信息(访问日志)

    • 记录服务器的错误信息(错误日志)

  7. 限流

    • 限制客户端的连接数、请求速率等

应用场景

  1. Web服务器

  2. 反向代理服务器

  3. API网关

  4. 媒体服务器

下载安装

官网下载链接

进入下载页面后,一般选择下载一个稳定版即可:

nginx_download.png

  • Windows版本

    • 进入下载页面,选择nginx/Windows-x.xx.x 下载

    • 解压压缩包

    • over

  • Linux版本

# 下载需要安装的Nginx版本
curl -O https://nginx.org/download/nginx-1.26.2.tar.gz

# 解压
tar -zxvf nginx-1.26.2.tar.gz

# 进入解压后文件夹
cd nginx-1.26.2

# 配置安装目录
./configure --prefix=/usr/local/nginx

# 注意:nginx采用模块化设计,有一部分功能需要安装时开启方可使用;更多模块请查看官方文档(https://nginx.org/en/docs/)
./configure --prefix=/usr/local/nginx --with-http_gzip_static_module

# 编译安装
make && make install
  • Docker

# 下载nginx镜像
docker pull nginx

# 启动
docker run --name myNginx -d nginx

# 指定端口映射
docker run --name myNginx -p 80:80 -d nginx

# 指定配置文件
docker run --name myNginx  -v /host/path/nginx.conf:/etc/nginx/nginx.conf -d nginx
  • docker-compose

新建一个nginx-docker-compose.yml

version: '3.0'

services:
  nginx:
    image: nginx #运行的镜像
    container_name: myNginx #容器名
    ports:
      - "80:80" #端口映射
    volumes:
      - ./host/path/nginx.conf:/etc/nginx/nginx.conf #数据卷映射
    restart: unless-stopped # 重启策略: 始终重启

基本操作

  • Windows和Linux版本基本命令介绍

# 进入nginx安装目录(Windows版本的nginx还需要多个.exe)
# 启动
./nginx

# 停止
./nginx -s stop
./nginx -s quit

# 重载配置文件
./nginx -s reload

# 检查配置文件是否正确
./nginx -t
  • docker和doker-compose方式安装基本命令

请参考本站另外一篇文章:Docker常用命令记录

配置文件介绍

nginx默认配置文件

# ----------------------全局配置区域-------------------
#user  nobody;
worker_processes  1; # 指定工作进程的数量

error_log  logs/error.log; # 指定错误文件位置
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;# 指定进程pid文件位置
# ----------------------全局配置区域-------------------

# ----------------------事件配置区域-------------------
events {
    worker_connections  1024;# 每个工作进程的最大连接数
}
# ----------------------事件配置区域-------------------

# ----------------------HTTP配置区域-------------------
http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }
    }
}
# ----------------------HTTP配置区域-------------------

可以看出来,配置文件主要分为三个配置区域:

全局区域

主配置块是配置文件的最外层,包含全局配置指令。这些指令影响整个 Nginx 服务器的行为。

事件区域

事件块配置 Nginx 的事件处理模型,主要用于调整并发连接的处理性能。

HTTP区域

HTTP 块是 Nginx 配置中最常用的块,包含所有与 HTTP 协议相关的配置。

  • server区域

server块用于配置不同的虚拟主机,每个虚拟主机可以有不同的域名、端口和配置。

  • location区域

location块用于配置 URL 路径的处理规则,可以包含各种指令来控制请求的处理方式。

常用配置示例

反向代理

http {

    server {
        # nginx监听的端口
        listen 80;

        # 绑定的域名,如果有的话
        server_name zhengzl.cn;

        # 反向代理配置
        location / {
            # 转发到需要代理的服务
            proxy_pass http://192.168.1.100:8080;
        }
    }
}

静态服务器

http {

    server {
        # nginx监听的端口
        listen 80;

        # 绑定的域名,如果有的话
        server_name zhengzl.cn;

        # 禁止目录浏览
        autoindex off;

        location / {
            # 具体的静态资源目录
            root /app/static;
        }
    }
}

负载均衡

http {

    # 需要负载均衡的服务列表
    upstream services {
        # 负载均衡算法:round_robin(默认轮询);least_conn(最少连接数);ip_hash(通过ip进行hash分配);
        round_robin; 
        
        # 负载均衡的服务
        server 192.168.1.100:8080 weight=3 max_fails=3 fail_timeout=30s;
        server 192.168.1.101:8080 weight=2 max_fails=3 fail_timeout=30s;
        server 192.168.1.102:8080 weight=1 max_fails=3 fail_timeout=30s;
    }

    server {
        # nginx监听的端口
        listen 80;

        # 绑定的域名,如果有的话
        server_name zhengzl.cn;

        # 反向代理配置
        location / {
            # 转发到需要代理的服务
            proxy_pass http://services;
        }
    }
}

动静分离

http {

    server {
        # nginx监听的端口
        listen 80;

        # 绑定的域名,如果有的话
        server_name zhengzl.cn;

        # 禁止目录浏览
        autoindex off;

        # 匹配静态资源请求
        location ~* \.(html|css|js|png|jpg|jpeg|gif|ico)$ {
            # 具体的静态资源目录
            root /app/static;
        }

        # 处理动态请求
        location / {
            # 后端服务器地址
            proxy_pass http://192.168.1.100:8080;  
        }
    }
}

GZIP压缩

http {

    # 开启 Gzip 压缩
    gzip on;

    # 设置 Gzip 压缩级别,1-9,数字越大压缩比越高,但性能消耗也越大
    gzip_comp_level 6;

    # 设置 Gzip 缓冲区大小
    gzip_buffers 16 8k;

    # 设置 Gzip 压缩的最小文件大小
    gzip_min_length 1k;

    # 设置需要压缩的 MIME 类型
    gzip_types text/plain application/javascript application/json application/xml text/css text/javascript image/svg+xml;

    # 设置是否压缩代理服务器响应
    gzip_proxied any;

    # 设置是否压缩 HTTP/1.1 协议的响应
    gzip_http_version 1.1;

    # 设置是否在响应头中添加 Vary: Accept-Encoding
    gzip_vary on;

    server {
        # nginx监听的端口
        listen 80;

        # 绑定的域名,如果有的话
        server_name zhengzl.cn;

        # 禁止目录浏览
        autoindex off;

        location / {
            # 具体的静态资源目录
            root /app/static;
            
            # 如果已存在已有的.gz压缩文件则直接使用,而不实时压缩
            gzip_static on;
        }
    }
}

携带真实IP

http {

    server {
        # nginx监听的端口
        listen 80;

        # 绑定的域名,如果有的话
        server_name zhengzl.cn;

        # 反向代理配置
        location / {
            # 转发到需要代理的服务
            proxy_pass http://192.168.1.100:8080;

            # 反向代理时携带客户端的ip信息
            proxy_set_header HOST $host;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

访问控制

http {

    server {
        # nginx监听的端口
        listen 80;

        # 绑定的域名,如果有的话
        server_name zhengzl.cn;

        # 禁止目录浏览
        autoindex off;

        location / {
            # 允许指定的ip访问
            allow 127.0.0.1;

            # 拒绝其余所有ip访问
			deny all;
  
            # 具体的静态资源目录
            root /app/static;
        }
    }
}

限流

http {
    # 设置一个限流配置
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

    server {
        # nginx监听的端口
        listen 80;

        # 绑定的域名,如果有的话
        server_name zhengzl.cn;

        # 反向代理配置
        location / {
            # 使用限流规则
            limit_req zone=one burst=5 nodelay;

            # 转发到需要代理的服务
            proxy_pass http://192.168.1.100:8080;
        }
    }
}