Nginx 配置指南

news2024/11/28 22:31:27

一、Nginx 简介

1.1 概述

Nginx 是一款高性能、轻量级的开源 Web 服务器和反向代理服务器,以其可靠性、丰富的功能和简单的配置而闻名。由 Igor Sysoev 开发,最初用于解决 C10K 问题,与传统的 Web 服务器相比,Nginx 采用异步事件驱动架构,能够处理大量并发连接,并以低资源消耗提供高性能服务。

1.2 应用场景

Nginx 广泛应用于各种 Web 服务场景,包括:

  • 静态资源服务: 高效地提供图片、CSS、JavaScript 等静态文件。

  • 反向代理: 作为应用程序服务器的前置代理,隐藏真实服务器、负载均衡、缓存内容等。

  • 负载均衡: 分配请求到多个后端服务器,提高系统可用性和性能。

  • 动态内容服务: 与应用程序服务器配合,处理动态请求,如 PHP、Python、Java 等。

  • 安全防护:  实现访问控制、HTTPS 加密、防止 DDoS 攻击等安全功能。

二、Nginx 的优势

  • 高性能: 擅长处理并发连接,适合高流量网站。

  • 稳定性: 即使在高流量环境下也能保持稳定。

  • 模块化: 支持多种模块扩展,如安全、缓存、负载均衡等。

  • 轻量级: 占用资源少,易于部署和维护。

  • 简单易用: 配置语法简洁,易于上手。

三、Nginx 安装

3.1 Windows 安装
  1. 从 Nginx 官网下载 Windows 版本的压缩包。

  2. 解压压缩包到目标目录。

  3. 运行 nginx.exe 启动 Nginx。

    图片

3.2 Linux 安装

推荐使用包管理器安装 Nginx,以 CentOS 为例:

# 安装 Nginx
sudo yum install nginx
# 启动 Nginx
sudo systemctl start nginx

3.3 Mac 安装

推荐使用 Homebrew 包管理器安装 Nginx:

# 安装 Nginx
brew install nginx
# 启动 Nginx
brew services start nginx

四、Nginx 常用命令

4.1 测试配置文件
# 测试默认配置文件
nginx -t

# 测试指定配置文件
nginx -t -c /path/to/nginx.conf

4.2 启动、重启、关闭
# 启动 Nginx
./nginx

# 指定配置文件启动
./nginx -c /path/to/nginx.conf

# 重启 Nginx
nginx -s reload

# 快速关闭 Nginx
nginx -s stop

# 平稳关闭 Nginx
nginx -s quit

4.3 开机自启动
# 设置开机自启动 (Linux)
sudo systemctl enable nginx

# 取消开机自启动 (Linux)
sudo systemctl disable nginx

# 使用 brew services 管理 (Mac)
brew services start nginx
brew services stop nginx
brew services restart nginx

4.4 查看和停止 Nginx 进程
# 查看 Nginx 进程
ps -ef | grep nginx

# 关闭指定进程
kill -s QUIT <进程号>

# 快速停止 Nginx
kill -TERM <主进程号>

# 强制停止 Nginx
pkill -9 nginx

五、Nginx 配置文件

5.1 配置文件结构

Nginx 配置文件采用分层结构,主要包括以下几个部分:

  • 全局块 (main):  配置影响 Nginx 全局的指令,如 worker 进程数、pid 文件路径、错误日志等。

  • events 块: 配置 Nginx 网络连接相关的设置,如最大连接数、事件驱动模型等。

  • http 块:  包含 HTTP 相关的配置,如虚拟主机、代理、缓存、日志等。

  • server 块:  定义虚拟主机,每个 server 块对应一个域名或 IP 地址。

  • location 块:  定义请求的路由规则,以及针对不同 URL 的处理方式。

5.2 常用指令
5.2.1 全局块
  • user <用户名> <用户组>:  指定运行 Nginx worker 进程的用户和用户组。

  • worker_processes <数量>:  设置 worker 进程的数量,通常建议设置为 CPU 核心数。

  • error_log <路径> <级别>:  设置错误日志的路径和级别。

  • pid <路径>:  设置 Nginx 主进程 PID 文件的路径。

5.2.2 events 块
  • worker_connections <数量>:  设置每个 worker 进程的最大连接数。

  • use <模型>:  选择事件驱动模型,如 epoll、kqueue、select 等。

  • multi_accept <on|off>:  设置是否允许同时接收多个网络连接。

5.2.3 http 块
  • include <路径>:  包含其他配置文件。

  • default_type <MIME 类型>:  设置默认的 MIME 类型。

  • charset <字符集>:  设置默认的字符集。

  • sendfile <on|off>:  开启或关闭高效文件传输模式。

  • gzip <on|off>:  开启或关闭 gzip 压缩。

5.2.4 server 块
  • listen <端口>:  监听的端口号。

  • server_name <域名>:  虚拟主机的域名。

  • root <路径>:  设置网站根目录。

  • index <文件名>:  设置默认首页文件名。

5.2.5 location 块
  • location <匹配规则> {}:  定义匹配规则和处理方式。

  • proxy_pass <地址>:  反向代理到指定地址。

  • rewrite <规则> <地址>:  URL 重写规则。

  • return <状态码>:  返回指定状态码。

5.3 常用内置变量

Nginx 提供了许多内置变量,可以用于配置指令和日志格式中,以下列举一些常用的变量:

  • $args: 获取请求 URL 中的 query string 参数。

  • $arg_<参数名>: 获取指定名称的 query string 参数值。

  • $cookie_<cookie 名>: 获取指定名称的 cookie 值。

  • $http_<请求头名>: 获取指定名称的请求头值。

  • $host: 获取请求的域名或 IP 地址。

  • $uri: 获取请求的 URI,不包含 query string。

  • $request_uri: 获取完整的请求 URI,包含 query string。

  • $request_method: 获取请求方法,如 GET、POST 等。

六、Nginx 高级配置

6.1 反向代理

反向代理是 Nginx 最常用的功能之一,可以将客户端请求转发到后端服务器,并返回服务器的响应。

示例配置:

http {
  server {
    listen 80;
    server_name example.com;

    location / {
      proxy_pass http://backend_server;
    }
  }
}

常用指令:

  • proxy_pass: 设置反向代理的目标地址。

  • proxy_set_header: 设置转发到后端服务器的请求头。

  • proxy_redirect:  修改后端服务器返回的 Location 头信息。

  • proxy_cache:  开启反向代理缓存。

6.2 负载均衡

负载均衡可以将客户端请求分发到多个后端服务器,提高系统的可用性和性能。

示例配置:

http {
  upstream backend {
    server backend1.example.com weight=2;
    server backend2.example.com;
  }

  server {
    listen 80;
    server_name example.com;

    location / {
      proxy_pass http://backend;
    }
  }
}

常用指令:

  • upstream: 定义后端服务器组。

  • server:  定义后端服务器地址。

  • weight: 设置服务器权重。

  • ip_hash:  基于客户端 IP 地址进行负载均衡。

  • least_conn:  将请求转发到连接数最少的服务器。

6.3 静态资源缓存

Nginx 可以缓存静态资源,如图片、CSS、JavaScript 等,以减少带宽消耗和提高响应速度。

示例配置:

http {
  proxy_cache_path /tmp/cache levels=1:2 keys_zone=my_cache:10m max_size=1g;

  server {
    listen 80;
    server_name example.com;

    location ~* \.(gif|jpg|jpeg|png|css|js)$ {
      proxy_cache my_cache;
      proxy_pass http://backend_server;
    }
  }
}

常用指令:

  • proxy_cache_path:  设置缓存路径和参数。

  • proxy_cache:  启用缓存。

  • expires:  设置缓存过期时间。

6.4 HTTPS 配置

Nginx 可以配置 HTTPS 协议,为网站提供安全连接。

示例配置:

server {
  listen 443 ssl;
  server_name example.com;

  ssl_certificate /path/to/certificate.crt;
  ssl_certificate_key /path/to/private.key;

  location / {
    # ...
  }
}

常用指令:

  • listen 443 ssl:  监听 443 端口并启用 SSL。

  • ssl_certificate:  指定 SSL 证书文件路径。

  • ssl_certificate_key:  指定 SSL 私钥文件路径。

七、Nginx 性能优化

7.1 优化 worker 进程数

将 worker 进程数设置为 CPU 核心数可以提高 CPU 利用率。

7.2 调整缓冲区大小

根据实际情况调整缓冲区大小可以减少磁盘 I/O 操作。

7.3 启用 gzip 压缩

压缩静态资源可以减少网络传输量。

7.4 使用缓存

缓存静态资源和动态内容可以减少服务器负载。

7.5 优化日志级别

降低日志级别可以减少磁盘 I/O 操作。

八、Nginx 安全配置

8.1 限制请求速率

防止恶意流量攻击,可以通过设置限制请求速率来保护服务器。

8.2 使用 HTTPS

HTTPS 协议可以加密数据传输,提高网站安全性。

8.3 设置访问控制

可以通过设置 IP 白名单或黑名单来限制特定 IP 地址的访问。

九、Nginx 常见问题与解决方案

9.1 Nginx 无法启动

可能原因:

  • 配置文件错误:这是最常见的原因之一,可以使用 nginx -t 命令检查配置文件语法是否正确。

  • 端口冲突:检查 Nginx 监听的端口是否被其他程序占用。

  • 权限问题:确保 Nginx 进程有权限访问配置文件、日志文件以及网站目录。

解决方案:

  • 根据错误提示修改配置文件,并使用 nginx -t 命令验证配置是否正确。

  • 修改 Nginx 监听的端口,或关闭占用该端口的其他程序。

  • 使用 chown 命令修改文件或目录的属主和属组,或使用 chmod 命令修改文件或目录的权限。

9.2 403 Forbidden 错误

可能原因:

  • 权限问题:Nginx 进程没有权限访问网站目录或文件。

  • 索引文件缺失:网站目录下缺少默认索引文件,例如 index.html、index.php 等。

  • 目录浏览功能未启用:如果希望允许用户浏览目录,需要在配置文件中启用 autoindex on 指令。

解决方案:

  • 修改网站目录或文件的权限,确保 Nginx 进程有读取权限。

  • 在网站根目录下创建默认索引文件。

  • 在配置文件中添加 autoindex on 指令,启用目录浏览功能。

9.3 500 Internal Server Error 错误

可能原因:

  • 后端服务器故障:检查后端服务器是否正常运行。

  • PHP 代码错误:检查 PHP 代码是否存在语法错误或逻辑错误。

  • PHP 内存限制:如果 PHP 脚本需要处理大量数据,可能会超出 PHP 内存限制,导致 500 错误。

解决方案:

  • 检查后端服务器的运行状态,并尝试重启后端服务器。

  • 检查 PHP 错误日志,找到错误代码并修复。

  • 修改 PHP 配置文件 php.ini,增加 memory_limit 的值。

9.4  Nginx 高负载

可能原因:

  • 流量过大:网站访问量过大,超出 Nginx 服务器的处理能力。

  • 配置不当:Nginx 配置参数设置不合理,例如 worker 进程数过少、缓存设置不当等。

  • 资源瓶颈:服务器硬件资源不足,例如 CPU、内存、网络带宽等。

解决方案:

  • 优化 Nginx 配置,例如增加 worker 进程数、启用缓存、压缩数据传输等。

  • 升级服务器硬件配置,例如增加 CPU 核心数、内存容量、网络带宽等。

  • 使用负载均衡技术,将流量分发到多台服务器上。

9.5  Nginx 安全问题

可能原因:

  • 版本过低:旧版本的 Nginx 可能存在安全漏洞。

  • 配置不当:例如未禁用不必要的模块、未限制访问来源等。

  • 弱口令:使用弱口令容易被暴力破解。

解决方案:

  • 及时升级 Nginx 到最新版本。

  • 遵循安全配置建议,例如禁用不必要的模块、限制访问来源、设置访问控制等。

  • 使用强口令,并定期修改密码。

十、Nginx 模块

Nginx 的强大之处在于其模块化架构,允许开发者根据需要加载不同的模块来扩展功能。以下是几个常用的 Nginx 模块:

10.1 ngx_http_core_module

这是 Nginx 的核心模块,默认情况下已编译进 Nginx,提供了 HTTP 协议的基本功能,例如:

  • 处理 HTTP 请求和响应

  • 管理虚拟主机

  • 配置日志记录

  • 设置访问控制

10.2 ngx_http_access_module

该模块用于控制客户端对 Nginx 服务器的访问权限,例如:

  • 基于 IP 地址允许或拒绝访问

  • 基于用户名和密码进行身份验证

10.3 ngx_http_rewrite_module

Rewrite 模块提供了强大的 URL 重写功能,可以根据预设的规则修改请求的 URI,例如:

  • 实现 URL 跳转

  • 隐藏网站文件结构

  • SEO 友好化 URL

10.4 ngx_http_proxy_module

Proxy 模块是实现反向代理的核心模块,它允许 Nginx 将请求转发到后端服务器,并处理后端服务器的响应,例如:

  • 负载均衡

  • 缓存后端服务器的响应

  • 添加/修改请求头

10.5 ngx_http_fastcgi_module

FastCGI 模块用于连接 Nginx 与 FastCGI 进程,例如 PHP-FPM,处理动态内容,例如:

  • 转发请求到 FastCGI 进程

  • 配置 FastCGI 进程池

10.6 ngx_http_gzip_module

Gzip 模块用于压缩 HTTP 响应内容,减少网络传输量,提高网站访问速度。

10.7 ngx_http_ssl_module

SSL 模块用于配置 HTTPS 协议,实现网站的安全访问。

十一、Nginx 实战

11.1 搭建静态资源服务器
server {
    listen 80;
    server_name static.example.com;
    root /var/www/static;

    location / {
        index index.html;
    }
}

说明:

  • listen 80:监听 80 端口,即 HTTP 默认端口。

  • server_name static.example.com:设置虚拟主机域名。

  • root /var/www/static:设置网站根目录。

  • index index.html:设置默认索引文件为 index.html。

11.2 配置反向代理
upstream backend {
    server backend1.example.com weight=5;
    server backend2.example.com;
}

server {
    listen 80;
    server_name www.example.com;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

说明:

  • upstream backend:定义一个名为 backend 的后端服务器组。

  • server backend1.example.com weight=5:将 backend1.example.com 添加到后端服务器组,并设置权重为 5。

  • server backend2.example.com:将 backend2.example.com 添加到后端服务器组,默认权重为 1。

  • proxy_pass http://backend:将请求转发到名为 backend 的后端服务器组。

  • proxy_set_header Host $host:设置请求头 Host 为客户端请求的域名。

  • proxy_set_header X-Real-IP $remote_addr:设置请求头 X-Real-IP 为客户端的真实 IP 地址。

11.3 配置 HTTPS
server {
    listen 443 ssl;
    server_name www.example.com;

    ssl_certificate /path/to/certificate.crt;
    ssl_certificate_key /path/to/private.key;
    location / {
        root /var/www/html;
        index index.html;
    }
}

说明:

  • listen 443 ssl:监听 443 端口,即 HTTPS 默认端口,并启用 SSL。

  • ssl_certificate /path/to/certificate.crt:设置 SSL 证书路径。

  • ssl_certificate_key /path/to/private.key:设置 SSL 私钥路径。

十二、总结

本文档提供了一个全面的 Nginx 配置指南,涵盖了从基础概念到高级应用的各个方面。希望这份指南能够帮助您更好地理解和使用 Nginx,构建高性能、安全可靠的 Web 服务。

附录:

  • Nginx 官方网站:http://nginx.org/

  • Nginx 文档:http://nginx.org/en/docs/

  • Nginx 模块:http://nginx.org/en/docs/http/modules/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2062348.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用stream()流合并两个列表

List<Author>结构如下&#xff1a; List<Reader>结构如下&#xff1a; 需求&#xff1a;将Author列表和Reader列表根据相同id合并到一个列表中 private static void mergeList() {List<Author> authors Author.getAuthors();List<Reader> readers …

阅读、分析和维护高质量开源软件有感——小计一笔

目录 一、问题分析 软件开发问题分析 动机 学什么 目的 二、要求 阅读 理解 运用 分析 评估 认知 三、案例选择 MiNotes”开源软件 方式 实践支撑软件工具 操作流程 应该学到的知识 学习过程 四、任务与输出 1.阅读开源软件 2.标注开源软件 3.分析开源…

iLogtail 开源两周年:感恩遇见,畅想未来

早在上世纪 60 年代&#xff0c;早期的计算机&#xff08;例如 ENIAC 和 IBM 的大型机&#xff09;在操作过程中会输出一些基本的状态信息和错误报告&#xff0c;这些记录通常通过打印机输出到纸带或纸卡上&#xff0c;用于跟踪操作流程和调试&#xff0c;最早期的日志系统借此…

前端必备:高效处理树形数据与数组的实用函数

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vuet篇专栏内容:Vue-树形数据处理|数组:实用函数封装 大家好&#xff0c;依旧青山&#xff0c;在开发项目过程中&a…

3、springboot时代背景

一、微服务 二、分布式 三、云原生 原生应用如何上云。 Cloud Native 上云的困难 服务自愈弹性伸缩服务隔离自动化部署灰度发布流量治理...... 上云的解决

人工智能算法工程师(中级)课程21-深度学习中各种优化器算法的应用与实践、代码详解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程21-深度学习中各种优化器算法的应用与实践、代码详解。本文将介绍PyTorch框架下的几种优化器&#xff0c;展示如何使用PyTorch中的优化器&#xff0c;我们将使用MNIST数据集和一个简单…

云游戏畅玩黑神话悟空:使用 NVIDIA 4090 体验极致画质

​ 黑神话悟空 爽啦&#xff01;没有好配置又想玩《黑神话&#xff1a;悟空》的朋友们都爽啦&#xff01;自己没有好的 GPU&#xff0c;体验《黑神话&#xff1a;悟空》时画质不好玩的不舒心&#xff1f;厚德云来帮你解决问题&#xff01;厚德云上线了《黑神话&#xff1a;悟空…

机器学习第五十三周周报 MAG

文章目录 week53 MAG摘要Abstract1. 题目2. Abstract3. 预测标准3.1 问题提出3.2 数据预处理3.3 模型架构MAG3.4 时域故障模式识别3.5 故障检测器 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.4 实验结果4.5 结果分析 5. 结论小结参考文献 week53 MAG 摘要 本周阅读…

【ASPLOS2024】RECom:通过编译器技术加速推荐模型推理,论文中选并获得荣誉奖项!

2024年5月&#xff0c;关于推荐模型自动编译优化的论文《RECom: A Compiler Approach to Accelerate Recommendation Model Inference with Massive Embedding Columns》在系统领域顶会ASPLOS 2024上中选并进行了展示&#xff0c;并被授予了Distinguished Artifact Award 荣誉&…

基于springboot的招聘系统的设计与实现

TOC springboot614基于springboot的招聘系统的设计与实现--论文 研究背景 近年来&#xff0c;由于计算机技术和互联网技术的快速发展&#xff0c;使得所有企事业单位内部都是数字化、信息化、无纸化的发展趋势&#xff0c;随着趋势的发展&#xff0c;各种决策系统、辅助系统…

springboot安全在线学习平台---附源码131019

摘 要 这是采用springboot技术&#xff0c;SQL Server数据库实现的一个基于网络的在线学习系统。系统具有用户登录和注册、普通用户、课程分类、课程、购买表、课程上传等功能。在线学习是通过提供电子课件&#xff0c;让学生可以进行在线学习&#xff0c;并支持电子课件下载的…

windows主机查询url请求来自哪里发起的

最近使用fiddler抓包&#xff0c;看到一直有http://conna.gj.qq.com:47873 的请求&#xff0c; 对此进行溯源&#xff0c;确定是不是被攻击了。 在dos里查询端口进程&#xff1a;netstat -ano | findstr :47873 查到来自8020的进程id 查看此进程应用&#xff0c;发现竟然是…

postgresql 集群文档

https://www.cnblogs.com/Alicebat/p/14148933.html [命令] Pacemaker 命令 pcs cluster &#xff08;管理节点&#xff09; – Eternal Center PostgreSQL实战之物理复制和逻辑复制&#xff08;五&#xff09;_postgresql 流复制和物理复制-CSDN博客 https://jingyan.baidu…

UE5.4 - 下载和安装

一. 简介 虚幻引擎&#xff08;Unreal Engine&#xff09;是由 Epic Games 公司推出的一款功能强大的游戏开发引擎。它于 1998 年推出第一代&#xff0c;其口号是 “全球最开放、最先进的实时 3D 创作工具”。 虚幻引擎被广泛应用于游戏产业&#xff0c;创作出了众多知名的 3…

企业级WEB应用服务器TOMCAT从讲解到实战一篇解决

一 .WEB技术 1.1 HTTP协议和B/S 结构 操作系统有进程子系统&#xff0c;使用多进程就可以充分利用硬件资源。进程中可以多个线程&#xff0c;每一个线程可以 被CPU调度执行&#xff0c;这样就可以让程序并行的执行。这样一台主机就可以作为一个服务器为多个客户端提 供计算服…

教程:postman的平替hoppscotch,又叫postwoman,hoppscotch的docker-compose安装过程

目录 1. 背景2. 前期准备2.1 准备docker-compose文件&#xff0c;两个版本&#xff0c;一个3合1&#xff0c;一个分开2.1.1 3合1版本&#xff08;推荐&#xff09;2.1.2 独立版本 2.2 准备安装nginx-proxy-manager&#xff08;可选&#xff09;2.2 准备.env文件2.2.1 默认ip的.…

爬虫案例5——爬取东方财富网的港股数据

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正 任务&#xff1a;从东方财富网中爬取港股的代码&#xff0c;名称&#xff0c;最近价格&#xff0c;涨跌幅&#xff0c;今开&#xff0c;最高等数据 目标网页地址&#xff1a;https://data.eastmone…

科技大厂对AI的垄断

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

探索HTML中的“iframe”标签——WEB开发系列12

现代网页开发中&#xff0c;​​<iframe>​​ 标签是一个非常重要的工具。允许我们在一个网页中嵌入另一个网页&#xff0c;对于展示外部内容、应用嵌套或实现复杂的布局设计都非常有用。来一起探讨如何使用 ​​iframe​​ 标签&#xff0c;包括设置高度和宽度、移除边框…

记录 升级到Gradle 8.4.2 遇到的坑

序言 最近将Gradle从4.0.1 升级到 8.4.2 遇到了很多坑&#xff0c;记录下来帮助有缘人 升级gradle 修改根目录的build.gradle dependencies {classpath com.android.tools.build:gradle:8.4.2classpath org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.0}修改gradle-wrapper.…