资讯动态

Nginx Web服务器从零搭建:安装配置、反向代理与性能优化实战

发布时间:2026/8/4 15:36:00 来源:尧图企业网站定制
1. 从零到一为什么选择 Nginx 作为你的第一个 Web 服务器如果你刚开始接触服务器运维或者后端开发面对“搭建一个网站”这个任务可能会有点懵。ApacheTomcat还是 IIS我的建议是从 Nginx 开始。这不是因为 Nginx 最简单恰恰相反它功能强大且高效但它的配置逻辑清晰文档完善一旦上手你会对 Web 服务的运作机制有更深刻的理解。更重要的是它几乎成了现代互联网架构的“标准件”从个人博客到千万级并发的应用都能看到它的身影。今天我就以一个老运维的视角带你手把手在 Linux 上把 Nginx 跑起来并把它变成一个真正可用的 Web 服务器而不仅仅是安装成功。为什么是 Nginx简单说几个核心点。首先它是事件驱动、异步非阻塞的架构。你可以把它想象成一个极其高效的餐厅服务员Master 进程他手下有一群动作麻利的助手Worker 进程。当客人客户端请求点单时服务员记下需求后就去服务下一位客人把具体的做菜任务处理静态文件、转发请求等交给后厨的助手。助手们不会因为一道菜做得慢而傻等他们会同时处理多个任务。这种模式让 Nginx 在资源消耗极少的情况下能轻松应对成千上万的并发连接这是传统多进程/多线程模型如 Apache 的 prefork 模式难以比拟的。其次它的配置语法非常人性化。基于指令和上下文Context的配置方式像搭积木一样清晰。一个server块定义一个虚拟主机location块定义 URI 匹配规则逻辑层次分明。最后它的角色早已超越了单纯的 HTTP 服务器。反向代理、负载均衡、缓存、SSL 终端甚至是邮件代理它都能胜任。从你第一次输入nginx命令开始你就已经站在了一个功能强大的网关和流量调度器的起点上。那么在开始动手前我们需要明确目标我们不仅仅是要“安装”Nginx而是要“搭建”一个具备基本服务能力的 Web 服务器。这包括1. 通过系统包管理器或源码两种主流方式完成安装2. 理解核心配置文件的结构并进行基础定制3. 部署一个简单的静态网站并确保其可访问4. 掌握服务管理启动、停止、重载配置的基本操作5. 了解如何进行最基础的问题排查。整个过程我会穿插我这些年踩过的坑和总结的最佳实践让你少走弯路。2. 基石铺设两种主流安装方式的抉择与实操安装 Nginx主要有两种路径通过 Linux 发行版的包管理器如 yum, apt安装或者下载源码自行编译安装。对于绝大多数新手和大部分生产环境我强烈推荐使用包管理器安装。它省心、省力自动解决依赖并且能和系统的服务管理systemd完美集成。源码编译通常只在你有非常特殊的定制需求比如需要集成第三方模块或者使用最新的开发版特性时才需要考虑。2.1 使用包管理器安装最稳妥的起点以最常见的 CentOS/RHEL及其衍生版如 Rocky Linux, AlmaLinux和 Ubuntu/Debian 为例。首先确保你的系统已经更新到最新状态这是一个好习惯。对于CentOS/RHEL 7/8/9系列系统默认的仓库里可能没有 Nginx 或者版本较旧。Nginx 官方提供了自己的稳定版仓库。添加仓库并安装的命令序列如下# 安装 EPEL 仓库Extra Packages for Enterprise Linux它包含很多额外的软件包 sudo yum install epel-release # 导入 Nginx 官方仓库的 GPG 密钥用于验证软件包完整性 sudo rpm --import http://nginx.org/keys/nginx_signing.key # 创建 Nginx 官方仓库的配置文件 # 对于 CentOS/RHEL 7 sudo vi /etc/yum.repos.d/nginx.repo # 将以下内容粘贴进去这里以稳定版为例 [nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck1 enabled1 gpgkeyhttps://nginx.org/keys/nginx_signing.key module_hotfixestrue # 对于 CentOS/RHEL 8/9baseurl 略有不同 # baseurlhttp://nginx.org/packages/centos/8/$basearch/ # 请根据你的主版本号修改 # 保存退出后安装 Nginx sudo yum install nginx对于Ubuntu/Debian系列过程类似# 更新软件包列表 sudo apt update # 安装必要的依赖用于通过 HTTPS 获取仓库 sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring # 导入 Nginx 官方签名密钥 curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg /dev/null # 验证密钥指纹可选但推荐确保密钥正确 gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg # 添加稳定版 Nginx 仓库 echo deb [signed-by/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu lsb_release -cs nginx | sudo tee /etc/apt/sources.list.d/nginx.list # 再次更新并安装 Nginx sudo apt update sudo apt install nginx通过包管理器安装后Nginx 会自动配置为系统服务。你可以使用systemctl命令来管理它例如sudo systemctl start nginx来启动。安装完成后关键的文件路径通常如下主配置文件/etc/nginx/nginx.conf默认服务器块虚拟主机配置/etc/nginx/conf.d/default.conf或/etc/nginx/sites-available/defaultUbuntu/Debian网站根目录/usr/share/nginx/html或/var/www/html日志文件/var/log/nginx/access.log访问日志/var/log/nginx/error.log错误日志2.2 源码编译安装追求极致定制化当你需要添加一些官方包未包含的第三方模块如ngx_http_geoip_module用于地理定位或者最新的ngx_http_brotli_module用于 Brotli 压缩或者想使用最新的主线版本Mainline时就需要源码编译。首先去 Nginx 官网下载最新的稳定版源码包。同时你需要安装编译工具和 Nginx 所依赖的库最常见的是 PCRE用于正则表达式、OpenSSL用于 HTTPS和 zlib用于 Gzip 压缩。# 以 CentOS 为例安装开发工具和依赖库 sudo yum groupinstall Development Tools sudo yum install pcre-devel openssl-devel zlib-devel # 下载并解压源码请替换为实际版本号 wget http://nginx.org/download/nginx-1.24.0.tar.gz tar -zxvf nginx-1.24.0.tar.gz cd nginx-1.24.0 # 配置编译选项。这是最关键的一步。 # --prefix 指定安装目录。 # --with-http_ssl_module 启用 SSL 支持用于 HTTPS。 # --with-http_v2_module 启用 HTTP/2 支持。 # --with-http_stub_status_module 启用状态监控模块。 # --with-stream 启用 TCP/UDP 代理模块用于负载均衡等。 # 如果你需要第三方模块使用 --add-module/path/to/module。 ./configure --prefix/usr/local/nginx \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_stub_status_module \ --with-stream \ --with-pcre \ --with-openssl/usr/include/openssl # 编译并安装 make sudo make install编译安装后Nginx 的可执行文件位于/usr/local/nginx/sbin/nginx配置文件位于/usr/local/nginx/conf/nginx.conf。它不会自动集成到 systemd你需要手动创建服务单元文件或者直接使用二进制文件配合信号进行管理。注意源码编译虽然灵活但后续的升级和维护会比包管理安装麻烦。你需要手动重复下载、配置、编译、安装的过程。除非有明确需求否则新手请优先选择包管理器安装。3. 核心引擎解析nginx.conf 配置文件庖丁解牛安装只是第一步让 Nginx 按照你的意愿工作全靠配置文件。Nginx 的配置文件像一门领域特定语言DSL结构清晰。主配置文件通常是/etc/nginx/nginx.conf它使用“指令”和“上下文”来组织。一个精简但完整的nginx.conf骨架如下它包含了最核心的几个部分# 全局块配置影响 Nginx 整体运行的指令。 # 定义运行 Nginx 的用户和组。出于安全考虑通常使用一个非特权用户如 nginx。 user nginx; # 工作进程数。设置为 auto 或 CPU 核心数是一个好的起点。 worker_processes auto; # 错误日志的路径和级别。级别从 debug, info, notice, warn, error, crit 等。 error_log /var/log/nginx/error.log warn; # 存储主进程 PID 的文件位置便于其他脚本管理。 pid /var/run/nginx.pid; # Events 块配置影响 Nginx 服务器与用户的网络连接。 events { # 每个 worker 进程同时能够处理的最大连接数。 # 这个值受限于系统最大打开文件数ulimit -n。 worker_connections 1024; # 使用 epoll 这种高效的多路复用 I/O 模型Linux 特有。 use epoll; } # Http 块配置 HTTP 服务器相关功能的核心区域。可以嵌套多个 Server 块。 http { # 引入 MIME 类型定义文件告诉浏览器如何处理不同类型的文件。 include /etc/nginx/mime.types; # 默认的 MIME 类型如果找不到对应类型则使用此类型通常是二进制流。 default_type application/octet-stream; # 定义日志格式。main 是格式的名称可以自定义。 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 /var/log/nginx/access.log main; # 开启高效文件传输模式sendfile 系统调用减少内核态和用户态之间的数据拷贝。 sendfile on; # 与 sendfile 配合使用当数据包小于一定大小时先缓存再发送优化网络传输。 tcp_nopush on; # 保持连接的超时时间。客户端在这个时间内没有活动服务器将关闭连接。 keepalive_timeout 65; # 启用 Gzip 压缩减少传输数据量。 gzip on; # 包含其他配置文件。这是一种模块化的配置方式。 # 通常我们会把不同的虚拟主机网站配置放在 conf.d 目录下以 .conf 结尾。 include /etc/nginx/conf.d/*.conf; }现在让我们聚焦到include /etc/nginx/conf.d/*.conf;这一行。这是实际定义我们网站的地方。我们会在/etc/nginx/conf.d/目录下创建一个新的配置文件例如my_website.conf。3.1 构建你的第一个 Server 块虚拟主机一个最基本的 Server 块用于服务静态网站看起来是这样的server { # 监听端口。80 是 HTTP 标准端口。 listen 80; # 服务器名称。当客户端通过域名访问时Nginx 会用这个来匹配请求。 # 可以写多个用空格隔开也支持通配符 * 和正则表达式 ~。 server_name www.yourdomain.com yourdomain.com; # 指定此服务器的根目录。所有相对路径的请求都会基于这个目录来查找文件。 root /var/www/my_website; # 默认索引文件。当请求以 / 结尾时Nginx 会按顺序尝试寻找这些文件。 index index.html index.htm; # Location 块用于匹配特定的 URI请求路径。 location / { # try_files 指令非常有用。它按顺序检查文件或目录是否存在。 # $uri 代表请求的路径如 /about.html。 # 如果 $uri 找不到就找 $uri/看是不是个目录。 # 如果还找不到最后返回 /index.html常用于单页应用 SPA。 # 如果全都找不到则返回 404 错误。 try_files $uri $uri/ /index.html; } # 一个专门处理图片等静态资源的 location 块可以设置更长的缓存时间。 location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; # 告诉浏览器缓存 30 天 add_header Cache-Control public, immutable; } # 错误页面定制。当发生 404 或 500 错误时返回指定的友好页面。 error_page 404 /404.html; location /404.html { root /usr/share/nginx/html; # 错误页面存放的目录 internal; # 标记为内部请求防止外部直接访问 } error_page 500 502 503 504 /50x.html; location /50x.html { root /usr/share/nginx/html; internal; } }理解这个结构至关重要。server块定义了一个“虚拟主机”它通过listen和server_name来识别应该由哪个块来处理传入的请求。location块则是在server内部进行更精细的 URL 路由和控制。4. 点火试车服务管理、部署与基础排错配置写好了接下来就是让它跑起来并验证一切是否正常。4.1 启动、停止与重载配置如果你用的是包管理器安装Nginx 已经注册为 systemd 服务管理起来非常方便# 启动 Nginx sudo systemctl start nginx # 设置开机自启 sudo systemctl enable nginx # 查看运行状态 sudo systemctl status nginx # 停止 Nginx sudo systemctl stop nginx # 重启 Nginx先停止再启动 sudo systemctl restart nginx # 重新加载配置文件平滑重启不断开现有连接 sudo systemctl reload nginx对于源码安装你需要直接操作二进制文件# 启动指定配置文件路径如果不在默认位置 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf # 测试配置文件语法是否正确极其重要每次修改配置后都要执行 /usr/local/nginx/sbin/nginx -t # 平滑重启向主进程发送 HUP 信号 /usr/local/nginx/sbin/nginx -s reload # 快速关闭向主进程发送 QUIT 信号优雅停止 /usr/local/nginx/sbin/nginx -s quit # 强制关闭向主进程发送 TERM 信号 /usr/local/nginx/sbin/nginx -s stop一个至关重要的习惯每次修改完 Nginx 配置文件在重启或重载服务之前务必先运行nginx -t或sudo nginx -t来测试配置语法。这个命令会检查你的配置文件是否有语法错误并告诉你错误发生在哪一行。这能避免因为一个配置错误导致整个 Nginx 服务崩溃在线上环境尤其重要。4.2 部署你的第一个页面并验证现在让我们把网站放上去。根据上面server块的配置我们的网站根目录是/var/www/my_website。你需要创建这个目录并放入一个index.html文件。# 创建网站根目录如果不存在 sudo mkdir -p /var/www/my_website # 创建一个简单的首页 sudo vi /var/www/my_website/index.html在index.html里写入一些简单的内容比如!DOCTYPE html html head titleMy First Nginx Site/title /head body h1Hello from Nginx!/h1 pIf you can see this, your web server is working!/p /body /html保存后你需要确保 Nginx 进程用户通常是nginx有权限读取这个目录和文件。# 更改目录所有权给 nginx 用户根据你的配置也可能是 www-data 等 sudo chown -R nginx:nginx /var/www/my_website # 确保目录有执行权限以便进入文件有读权限 sudo chmod -R 755 /var/www/my_website然后将我们写好的my_website.conf放到/etc/nginx/conf.d/目录下。接着测试配置并重载sudo nginx -t sudo systemctl reload nginx # 或 sudo nginx -s reload现在打开你的浏览器输入服务器的 IP 地址如果server_name配置了域名且已解析也可以输入域名。你应该能看到刚才创建的 “Hello from Nginx!” 页面。4.3 基础问题排查三板斧如果页面没有出现别慌按以下步骤排查检查服务状态sudo systemctl status nginx。查看服务是否处于active (running)状态。如果失败看下面的日志。查看错误日志这是最重要的排错工具。sudo tail -f /var/log/nginx/error.log。-f参数可以实时滚动显示最新日志。常见的错误包括配置文件语法错误、权限不足Permission denied、端口被占用Address already in use等。日志会明确告诉你错误在哪一行。检查端口监听使用sudo ss -tulnp | grep :80或sudo netstat -tulnp | grep :80命令查看 80 端口是否被 Nginx 进程成功监听。如果看不到说明 Nginx 可能没有启动成功。检查防火墙Linux 系统的防火墙如 firewalld 或 ufw可能会阻止 80 端口的访问。你需要放行 HTTP 服务或 80 端口。对于 firewalldsudo firewall-cmd --permanent --add-servicehttp然后sudo firewall-cmd --reload对于 ufwsudo ufw allow Nginx HTTP或sudo ufw allow 80/tcp按照这个流程99% 的初期问题都能被定位和解决。养成看日志的习惯是运维人员最重要的基本功。5. 从基础到实用反向代理与负载均衡初探当你的 Nginx 能稳定提供静态文件服务后就可以探索它更强大的功能了。最常用的两个场景是反向代理和负载均衡。这两个概念经常一起出现。反向代理是什么想象一下你是一个大公司的前台。客户浏览器来找 CEO应用服务器比如运行在 8080 端口的 Node.js 或 Java 应用。但 CEO 很忙不直接见客。客户先找到你Nginx监听 80 端口你问明来意后去后台找到 CEO把 CEO 的回复转达给客户。对于客户来说他以为直接在和 CEO 对话实际上是你反向代理在中间协调。这样做的好处很多隐藏了后端服务器的真实 IP 和端口提高了安全性可以在代理层做缓存、压缩、SSL 卸载等提升性能可以轻松地将请求路由到不同的后端服务。配置一个最简单的反向代理到本地的 Node.js 应用server { listen 80; server_name api.yourdomain.com; location / { # proxy_pass 是核心指令将请求转发到指定的后端服务器。 proxy_pass http://localhost:3000; # 以下是一些常用的代理头设置确保后端能获取到真实的客户端信息。 proxy_set_header Host $host; # 传递原始请求的 Host 头 proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实 IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递经过的代理 IP 链 proxy_set_header X-Forwarded-Proto $scheme; # 传递原始协议http/https # 一些超时设置防止长时间挂起的请求占用连接。 proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s; } }负载均衡则是反向代理的升级版。现在不是一个前台对应一个 CEO而是一个前台对应一个 CEO 团队。当前台Nginx收到客户请求时她可以根据一定的策略轮询、权重、最少连接等将请求分配给团队中任意一位 CEO后端服务器从而分散压力提高整体处理能力并实现高可用一台挂了其他的还能顶上。假设你有两个运行相同应用的后端服务器IP 分别是192.168.1.101和192.168.1.102端口都是3000。# 在 http 块内定义一个上游服务器组名字叫 backend_servers http { upstream backend_servers { # 默认是轮询round-robin策略 server 192.168.1.101:3000; server 192.168.1.102:3000; # 也可以设置权重weight 值越大分配到的请求越多 # server 192.168.1.101:3000 weight3; # server 192.168.1.102:3000 weight1; } server { listen 80; server_name app.yourdomain.com; location / { # 将请求代理到上游服务器组 proxy_pass http://backend_servers; # ... 其他 proxy_set_header 等设置同上 } } }这样当用户访问app.yourdomain.com时Nginx 就会轮流或按权重将请求分发到后端的两个服务器上。这是构建可扩展、高可用应用架构的基础一步。6. 性能与安全不容忽视的调优与加固要点一个能跑的服务器和一个“跑得好”且“跑得安全”的服务器之间隔着很多细节配置。这里分享几个立竿见影的调优和安全加固点。6.1 性能调优小技巧调整 Worker 进程和连接数在nginx.conf的全局块和events块中。worker_processes auto; # 通常设置为 CPU 核心数auto 让 Nginx 自动检测。 events { worker_connections 1024; # 单个 worker 的最大连接数。这个值受限于系统的 ulimit -n。 use epoll; # Linux 下使用 epoll 这种高效 I/O 模型。 multi_accept on; # 让一个 worker 一次性接受所有新连接。 }你需要确保系统的最大文件打开数足够大。可以通过ulimit -n查看当前限制修改/etc/security/limits.conf文件来永久提升如nginx soft nofile 65535和nginx hard nofile 65535。启用 Gzip 压缩在http块中压缩文本内容大幅减少传输体积。gzip on; gzip_vary on; gzip_min_length 1024; # 小于此值的文件不压缩 gzip_types text/plain text/css text/xml text/javascript application/javascript application/xmlrss application/json; gzip_comp_level 6; # 压缩级别1-9越高压缩比越大但越耗 CPU优化静态文件服务对于图片、CSS、JS 等静态资源利用sendfile、tcp_nopush和缓存头。location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2?|ttf|eot|svg)$ { expires 1y; # 设置长期缓存 add_header Cache-Control public, immutable; # 告诉浏览器可公开缓存且内容不可变 access_log off; # 关闭访问日志减少磁盘 I/O # sendfile 等指令已在 http 块全局开启 }6.2 基础安全加固隐藏 Nginx 版本信息默认情况下错误页面和 Server 响应头会包含 Nginx 版本号这会给攻击者提供信息。在http块或server块中关闭它。server_tokens off;限制不必要的 HTTP 方法通常 Web 应用只需要 GET, POST, HEAD 等方法。可以限制其他危险方法如 DELETE, PUT。location / { limit_except GET POST HEAD { deny all; } # ... 其他配置 }设置安全的响应头防止一些常见的 Web 漏洞。add_header X-Frame-Options SAMEORIGIN always; # 防止点击劫持 add_header X-Content-Type-Options nosniff always; # 禁止 MIME 类型嗅探 add_header X-XSS-Protection 1; modeblock always; # 启用 XSS 过滤浏览器特性 # 注意Content-Security-Policy (CSP) 头需要根据你的网站内容仔细配置这里不展开。访问控制使用allow和deny指令限制特定 IP 或网段的访问。例如限制管理后台只允许内网访问。location /admin/ { allow 192.168.1.0/24; # 允许内网网段 deny all; # 拒绝所有其他 IP # ... 代理到后端应用 }这些只是入门级的调优和安全配置。真正的生产环境还需要考虑 HTTPSSSL/TLS配置、速率限制、更复杂的访问控制、与 WAFWeb 应用防火墙集成等。但千里之行始于足下从搭建一个干净、高效、安全的静态资源服务器开始你已经掌握了 Nginx 最核心的用法。随着项目复杂度的提升你会自然而然地接触到更多高级特性而那时你对这些基础概念的理解将是你深入探索最坚实的后盾。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价