找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

983

积分

0

好友

139

主题
发表于 4 天前 | 查看: 18| 回复: 0

在学习Nginx前,建议大家至少拥有以下技能:

Nginx概述

  • Web服务/网站服务: 给用户提供网站功能的服务
  • 本质: 实现http协议功能。用户发出http请求,nginx处理,给用户 http响应

Web服务/网站服务选择

Web服务器选择对比图

Nginx vs Apache 近10年全世界使用率

91bce6154e244c419584e7ea9b65002e.png

Apache vs Nginx比较

  • Apache: 基于select模型的同步IO模型。
  • Nginx: 基于epoll模型的异步IO模型。

举例一:找对象

  • 同步:一个屋子一个屋子去找。
  • 异步:拿出名册,名册上记录了名字和对应的屋子号。

举例二:幼儿园

  • 同步:老师挨个问小朋友是否需要上厕所。
  • 异步:需要上厕所的小朋友主动到指定位置集合,老师定时带这个集合里的小朋友一起去。

Nginx功能特点

企业面试时常需解答的Nginx HTTP服务器特色及优点:

  • 支持高并发:能支持几万并发连接(在静态小文件业务环境下尤其出色)。
  • 资源消耗少:在3万并发连接下,开启10个Nginx线程消耗的内存不到200MB。
  • 反向代理与负载均衡:具备HTTP反向代理及加速缓存功能,内置对后端RS节点服务器的健康检查,相当于专业的Haproxy或LVS的功能。
  • 高效的IO模型:支持异步网络IO事件模型epoll (Linux 2.6+)。

核心功能:

  • Web服务器/网站服务器
  • 反向代理功能
  • 负载均衡功能
  • 缓存功能
  • 其他扩展功能(通过安装插件),例如:负载均衡监控检查、会话保持、直播推流、流量镜像。

静态资源 vs 动态资源

  • 静态资源:一般指页面文件,如 htmljscss,图片,视频,音频等。静态资源Nginx可以自行处理。
  • 动态资源:一般指需要与后端程序交互的文件,如以 .php.jsp.do 结尾的文件。例如用户提交订单、评论等操作,其URL中常带有 ?& 等特殊符号。

Nginx版本与安装

版本选择:建议选择稳定版(Stable Version)或长期维护版本(LTS)。

Nginx 1.20.1 是一个稳定的选择。

安装方式选择
Nginx安装方式对比图

Nginx yum源配置(备用)

# 目前可以直接安装最新稳定版,若不行则配置此yum源
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

Nginx极速上手指南

a) 安装

# 01. 安装nginx
yum install -y nginx

# 02. 检查是否安装成功
rpm -qa | grep nginx

b) Nginx目录结构
提示:不同的安装方式目录结构略有不同,但整体一致。
Nginx目录结构图

[root@oldboy-web01 ~]# rpm -ql nginx
# 日志切割配置
/etc/logrotate.d/nginx

# 配置文件部分
/etc/nginx/mime.types          # Nginx支持的媒体类型(文件类型)
/etc/nginx/nginx.conf          # 主配置文件
/etc/nginx/fastcgi.conf        # nginx与PHP搭配的配置文件 (nginx+php使用fastcgi)
# ... 其他配置文件

# 启动配置文件
/usr/lib/systemd/system/nginx.service

# nginx命令
/usr/sbin/nginx

# Nginx默认的站点目录
/usr/share/nginx/html/
/usr/share/nginx/html/index.html

# 日志目录
/var/log/nginx/
/var/log/nginx/access.log
/var/log/nginx/error.log

c) nginx.conf 核心配置

  • 核心区域:定义运行用户、进程数。
  • events区域:定义每个工作进程的连接数。
  • http区域:主要配置区域。
    • 定义访问日志格式。
    • 指定访问日志位置。
    • 包含其他配置文件 include /etc/nginx/conf.d/*.conf
    • server部分 (建议将每个站点的配置单独放在 conf.d/*.conf 中):
      • listen 80; 监听端口。
      • server_name 域名;
      • root 网站站点目录(网站根目录);
      • index index.html; 指定首页文件(网站入口)。
      • location / 用来匹配URI,location / 是默认规则。

nginx.conf配置图解

实战:搭建第一个站点

a) 站点目录规划
建议将与网站相关的文件放在统一的目录下,例如:

/app/
/app/code/          # 存放代码
/app/code/live      # 直播网站代码
/app/code/game      # 游戏网站代码
/app/data/          # 数据
/app/tools/         # 可直接使用的命令或工具(解压后)
/server/scripts/    # 脚本
/server/tools/      # 工具包(压缩文件)

创建游戏网站目录:

mkdir -p /app/code/game

b) 搭建游戏网站

  1. 准备环境

    mkdir -p /app/code/game
    echo "game.oldboylinux.cn" > /app/code/game/index.html
  2. 修改Nginx配置:不建议将server配置直接写在主配置文件中。

    • 主配置文件 /etc/nginx/nginx.conf 保持简洁,通常包含全局设置和 include 语句。
    • /etc/nginx/conf.d/ 目录下创建子配置文件 game.oldboylinux.cn.conf
      server {
      listen 80;
      server_name game.oldboylinux.cn;
      root /app/code/game;
      location / {
          index index.html;
      }
      }
  3. 检查配置并重启Nginx

    nginx -t                    # 检查配置文件语法
    systemctl start nginx       # 如果未启动,则启动
    systemctl reload nginx      # 如果已运行,重新加载配置
  4. Linux本地测试

    [root@web01 ~]# curl 10.0.0.7
    game.oldboylinux.cn

c) 浏览器通过IP访问测试
浏览器IP访问测试图

d) 配置本地hosts解析,实现域名访问
在客户端(如Windows)的 C:\Windows\System32\drivers\etc\hosts 文件中添加:

10.0.0.7 game.oldboylinux.cn

然后即可在浏览器通过域名 http://game.oldboylinux.cn 访问。

部署多个网站应用

将多个前端开发项目(如小游戏)代码解压到站点目录下:

unzip bird.zip -d /app/code/game/
unzip mine.zip -d /app/code/game/
unzip type-game.zip -d /app/code/game/

通过浏览器访问对应的路径即可,例如 http://game.oldboylinux.cn/bird/

Nginx初步使用:虚拟主机

一个虚拟主机(即一个网站)对应Nginx配置文件中的一个 server 区域。
虚拟主机示意图

生产建议

  1. 不同虚拟主机的配置单独存放。
  2. 虚拟主机配置推荐存放在 conf.d 目录下,并以 .conf 结尾。
  3. 对于不再使用的虚拟主机,可通过修改配置文件后缀名(如改为 .conf.gz)来禁用。

1) 基于域名的虚拟主机
这是最常用的方式。通过不同的域名区分站点。
基于域名的虚拟主机配置图

配置示例 (/etc/nginx/conf.d/ 目录下):

  • game.oldboylinux.cn.conf
    server {
        listen 80;
        server_name game.oldboylinux.cn;
        root /app/code/game;
        location / {
            index index.html;
        }
    }
  • live.oldboylinux.cn.conf
    server {
        listen 80;
        server_name live.oldboylinux.cn;
        root /app/code/live;
        location / {
            index index.html;
        }
    }
  • www.oldboylinux.cn.conf
    server {
        listen 80;
        server_name www.oldboylinux.cn;
        root /app/code/www;
        location / {
            index index.html;
        }
    }

    创建站点目录与首页

    mkdir -p /app/code/{game,live,www}
    for name in game live www; do
    echo "$name.oldboylinux.cn" > /app/code/$name/index.html
    done

    测试

    # Linux下通过curl测试,使用 -H 参数指定Host头模拟不同域名访问
    curl -H "Host:live.oldboylinux.cn" 10.0.0.7
    curl -H "Host:www.oldboylinux.cn" 10.0.0.7

2) 基于端口的虚拟主机
通过不同的端口号区分站点。常用于内部服务或测试环境。

# game.oldboylinux.cn.conf
server {
    listen 82; # 监听82端口
    server_name game.oldboylinux.cn;
    root /app/code/game;
    location / {
        index index.html;
    }
}
# 测试
curl 10.0.0.7:80   # 访问www站点
curl 10.0.0.7:81   # 访问live站点
curl 10.0.0.7:82   # 访问game站点

3) 基于IP的虚拟主机
将服务绑定到特定的IP地址上,限制用户只能通过该IP访问。常与特殊端口组合使用。

server {
    listen 172.16.1.7:8888; # 仅监听172.16.1.7的8888端口
    server_name game.oldboylinux.cn;
    root /app/code/game;
    location / {
        index index.html;
    }
}
curl 172.16.1.7:8888  # 成功
curl 10.0.0.7:8888     # 失败,Connection refused

4) 虚拟主机小结
虚拟主机三种方式对比图

Nginx处理用户请求流程

详细请求处理流程图
Nginx请求处理流程图

处理不存在的域名或IP访问
默认主机处理图
可以配置一个默认的 server 块来处理所有未匹配到的请求:

# /etc/nginx/conf.d/default.conf
server {
    listen 80 default_server; # default_server 标识此为默认主机
    server_name _; # 使用下划线匹配所有未定义的域名
    charset utf8;
    default_type text/plain;
    return 200 "别乱访问网站";
}

Nginx日志管理

Nginx主要有两种日志:

  • access.log: 访问日志,记录所有客户端请求。
  • error.log: 错误日志,记录Nginx运行和请求处理过程中的错误信息。

1) 访问日志

  • 日志格式定义:在主配置文件 http 块中使用 log_format 指令定义。
    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 指令。
    access_log /var/log/nginx/access.log main; # 使用名为‘main’的格式

    access_log指令位置图

  • 关闭访问日志access_log off;
  • 为每个站点配置独立访问日志
    # 在具体的 server 块中配置
    server {
        listen 80;
        server_name www.oldboylinux.cn;
        root /app/code/www;
        access_log /var/log/nginx/www.oldboylinux.cn-access.log main;
        ...
    }

    独立日志配置图

2) 错误日志

  • 日志级别error (记录错误信息),debug (记录非常详细的调试信息,慎用)。
  • 配置:使用 error_log 指令,可在 mainhttpserverlocation 块中设置。
    error_log /var/log/nginx/error.log error; # 主错误日志
    # 为虚拟主机单独配置
    error_log /var/log/nginx/www.oldboylinux.cn-error.log error;

3) 日志切割
防止单个日志文件过大,便于管理和归档。通常使用系统自带的 logrotate 工具。

  • 方案:系统定时任务 + logrotate配置。
  • Nginx的logrotate配置 (/etc/logrotate.d/nginx):
    /var/log/nginx/*.log {
        create 0640 nginx root
        daily                # 每天切割一次
        rotate 10            # 保留10份历史日志
        missingok            # 如果日志文件不存在,不报错
        notifempty           # 如果日志文件为空,不切割
        compress             # 对旧日志进行压缩
        delaycompress        # 延迟一天压缩(即压缩前天及更早的日志)
        sharedscripts        # 所有日志处理完后执行脚本
        postrotate           # 切割后执行的命令
            /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
        endscript
    }
  • 手动立即执行切割测试logrotate -f /etc/logrotate.d/nginx



上一篇:Java并发编程之CopyOnWriteArrayList深度解析:读写分离策略与实战应用
下一篇:Spring动态代理底层机制:ProxyFactory源码解析与代理选型策略
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-17 20:12 , Processed in 0.113455 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表