首页建站教程站长工具网址导航免费资源

Nginx配置入门完整教程

728×90 教程页顶部广告位

Nginx是一款高性能的Web服务器和反向代理服务器,以高并发、低内存占用、配置灵活著称。目前全球超过40%的网站使用Nginx,是站长必须掌握的工具。本教程将从安装开始,手把手教你Nginx的常用配置。

一、Nginx是什么?

1.1 Nginx简介

Nginx(发音"engine-x")是由俄罗斯程序员Igor Sysoev开发的开源Web服务器,第一个版本发布于2004年。它最初是为了解决C10K问题(同时处理10000个并发连接)而设计的,采用事件驱动的异步非阻塞架构,能在低资源消耗下处理海量并发请求。

Nginx不仅是Web服务器,还可以用作:

  • 反向代理服务器:将请求转发到后端服务器(如Node.js、Python、Java应用)
  • 负载均衡器:将请求分发到多台后端服务器,提高可用性和性能
  • HTTP缓存服务器:缓存静态资源和动态页面,减轻后端压力
  • 邮件代理服务器:代理IMAP/POP3/SMTP邮件服务
  • 流媒体服务器:支持MP4、FLV等视频流媒体分发

1.2 Nginx vs Apache对比

对比项NginxApache
架构事件驱动、异步非阻塞进程/线程驱动、阻塞
并发能力强,可处理数万并发较弱,受进程数限制
内存占用低(几十MB)较高(每个进程几十MB)
静态文件非常快较快
动态请求需配合后端(PHP-FPM等)内置模块直接处理
配置方式配置文件,简洁配置文件+.htaccess,灵活
.htaccess不支持支持
学习曲线中等较平缓
市场份额约40%+(增长中)约30%(下降中)
💡 选择建议

对于新手站长,推荐使用Nginx,性能更好、资源占用更低。宝塔面板默认安装的也是Nginx。如果你需要.htaccess功能(如WordPress固定链接),Nginx可以通过配置实现等效功能。

二、Nginx安装

2.1 CentOS/RHEL安装

CentOS 7/8# 安装EPEL源(可选,提供更多模块) yum install epel-release -y # 安装Nginx yum install nginx -y # 启动Nginx并设置开机自启 systemctl start nginx systemctl enable nginx # 查看运行状态 systemctl status nginx

2.2 Ubuntu/Debian安装

Ubuntu 18.04/20.04/22.04# 更新软件包列表 apt update # 安装Nginx apt install nginx -y # 启动Nginx并设置开机自启 systemctl start nginx systemctl enable nginx # 查看运行状态 systemctl status nginx

2.3 宝塔面板安装(推荐新手)

如果你使用宝塔面板,Nginx会在安装面板时自动安装,无需手动操作。参考我们的宝塔面板安装与使用教程

💡 验证安装

安装完成后,在浏览器中访问服务器IP地址,如果看到Nginx欢迎页面,说明安装成功。

常用命令:nginx -t(测试配置)、nginx -s reload(重载配置)、nginx -s stop(停止)

三、Nginx配置文件结构

3.1 配置文件位置

系统主配置文件站点配置目录
CentOS/RHEL/etc/nginx/nginx.conf/etc/nginx/conf.d/
Ubuntu/Debian/etc/nginx/nginx.conf/etc/nginx/sites-available/ 和 sites-enabled/
宝塔面板/www/server/nginx/conf/nginx.conf/www/server/panel/vhost/nginx/

3.2 主配置文件结构

nginx.conf 基本结构# 全局块:配置影响Nginx全局的指令 user nginx; # 运行用户 worker_processes auto; # 工作进程数,auto为CPU核心数 error_log /var/log/nginx/error.log; # 错误日志路径 pid /run/nginx.pid; # 进程PID文件 # events块:配置影响Nginx服务器与用户网络连接的指令 events { worker_connections 1024; # 每个工作进程的最大连接数 use epoll; # 使用epoll事件模型(Linux推荐) multi_accept on; # 允许同时接受多个新连接 } # http块:配置代理、缓存、日志等绝大多数功能 http { include /etc/nginx/mime.types; # 引入MIME类型配置 default_type application/octet-stream; # 默认MIME类型 # 日志格式定义 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 on; # 启用高效文件传输 tcp_nopush on; # 减少网络报文数量 tcp_nodelay on; # 禁用Nagle算法,降低延迟 keepalive_timeout 65; # 长连接超时时间(秒) gzip on; # 启用Gzip压缩 # 引入站点配置文件 include /etc/nginx/conf.d/*.conf; }

3.3 配置指令层级

Nginx配置文件采用块级结构,指令有明确的层级关系:

main(全局) └── http ├── server(虚拟主机) │ ├── location(URL匹配) │ │ └── if(条件判断) │ └── upstream(负载均衡) └── server └── location
  • main块:最外层,配置全局参数(用户、进程数、日志等)
  • http块:包含所有HTTP相关配置,只能有一个
  • server块:定义一个虚拟主机(网站),http块内可以有多个
  • location块:定义URL路径的匹配规则,server块内可以有多个
  • upstream块:定义负载均衡后端服务器组

四、虚拟主机配置

虚拟主机允许一台服务器运行多个网站。每个server块就是一个虚拟主机。

4.1 基础虚拟主机配置

/etc/nginx/conf.d/example.com.confserver { listen 80; # 监听80端口(HTTP) server_name example.com www.example.com; # 绑定域名 root /var/www/example.com; # 网站根目录 index index.html index.htm index.php; # 默认首页文件 # 访问日志和错误日志 access_log /var/log/nginx/example.com.access.log; error_log /var/log/nginx/example.com.error.log; # 匹配网站根路径 location / { try_files $uri $uri/ =404; # 查找文件,找不到返回404 } # 禁止访问隐藏文件(如.htaccess) location ~ /\. { deny all; } }

4.2 PHP网站配置(WordPress/Typecho等)

PHP网站配置server { listen 80; server_name example.com; root /var/www/example.com; index index.php index.html; # 静态资源直接返回 location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|svg)$ { expires 30d; # 缓存30天 add_header Cache-Control "public, immutable"; } # PHP请求转发到PHP-FPM location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; # PHP-FPM地址(或unix:/run/php-fpm.sock) fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # WordPress固定链接(伪静态) location / { try_files $uri $uri/ /index.php?$args; } }
💡 宝塔面板用户

在宝塔面板中添加网站时,会自动生成Nginx配置文件,无需手动编写。需要自定义配置时,在"网站设置" → "配置文件"中修改。

五、反向代理配置

反向代理是Nginx最常用的功能之一,将请求转发到后端应用服务器(如Node.js、Python、Java应用)。

5.1 基础反向代理

反向代理到Node.js应用(端口3000)server { listen 80; server_name app.example.com; location / { proxy_pass http://127.0.0.1:3000; # 后端应用地址 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; } }

5.2 常用反向代理参数说明

参数说明
proxy_pass后端服务器地址,如 http://127.0.0.1:3000
proxy_set_header Host $host传递原始域名给后端
proxy_set_header X-Real-IP $remote_addr传递用户真实IP
proxy_set_header X-Forwarded-For传递请求链中所有IP
proxy_connect_timeout 60s连接后端超时时间
proxy_read_timeout 60s读取后端响应超时时间
proxy_send_timeout 60s发送请求到后端超时时间
proxy_buffering on启用响应缓冲,提高性能

5.3 WebSocket代理

WebSocket代理配置location /ws/ { proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_read_timeout 86400; # WebSocket长连接超时设为1天 }

六、负载均衡配置

当网站流量增大,一台服务器不够用时,可以用Nginx做负载均衡,将请求分发到多台后端服务器。

6.1 基础负载均衡

轮询模式(默认)# 定义后端服务器组 upstream backend { server 192.168.1.10:8080; server 192.168.1.11:8080; server 192.168.1.12:8080; } server { listen 80; server_name example.com; location / { proxy_pass http://backend; # 转发到后端服务器组 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }

6.2 负载均衡策略

策略配置说明
轮询(默认)无需配置请求按顺序轮流分配到各服务器
权重weight=5按权重比例分配,性能好的服务器权重高
IP哈希ip_hash同一IP的请求固定分配到同一服务器,保持会话
最少连接least_conn请求分配到当前连接数最少的服务器
URL哈希hash $request_uri同一URL的请求固定分配到同一服务器,适合缓存
权重+健康检查配置示例upstream backend { server 192.168.1.10:8080 weight=5 max_fails=3 fail_timeout=30s; server 192.168.1.11:8080 weight=3 max_fails=3 fail_timeout=30s; server 192.168.1.12:8080 backup; # 备用服务器,只有其他都挂了才用 }

七、静态资源缓存与Gzip压缩

7.1 静态资源缓存

静态资源缓存配置# 图片、字体等不常变的资源,缓存30天 location ~* \.(jpg|jpeg|png|gif|ico|svg|woff|woff2|ttf|eot)$ { expires 30d; add_header Cache-Control "public, immutable"; } # CSS、JS文件,缓存7天 location ~* \.(css|js)$ { expires 7d; add_header Cache-Control "public"; } # HTML文件,不缓存(保证内容实时更新) location ~* \.(html|htm)$ { add_header Cache-Control "no-cache, no-store, must-revalidate"; }

7.2 Gzip压缩

Gzip压缩配置(放在http块中)gzip on; # 启用Gzip压缩 gzip_vary on; # 添加Vary: Accept-Encoding头 gzip_min_length 1k; # 小于1KB的文件不压缩 gzip_buffers 4 16k; # 压缩缓冲区大小 gzip_http_version 1.1; # HTTP版本 gzip_comp_level 6; # 压缩级别(1-9,6是性能和压缩率的平衡) gzip_types text/plain text/css text/xml text/javascript application/javascript application/json application/xml application/rss+xml application/atom+xml image/svg+xml; # 需要压缩的MIME类型 gzip_disable "MSIE [1-6]\."; # IE6以下不压缩(兼容性问题)
💡 压缩效果

Gzip压缩通常能将文本文件(HTML、CSS、JS、JSON)压缩到原来的30%-50%,大幅减少传输数据量,提升网站加载速度。图片、视频等已经压缩过的文件不需要再用Gzip压缩。

八、HTTPS配置

8.1 SSL证书配置

HTTPS配置server { listen 443 ssl http2; # 监听443端口,启用SSL和HTTP/2 server_name example.com; ssl_certificate /etc/nginx/ssl/example.com.crt; # 证书文件路径 ssl_certificate_key /etc/nginx/ssl/example.com.key; # 私钥文件路径 ssl_protocols TLSv1.2 TLSv1.3; # 支持的TLS版本(禁用不安全的SSLv3、TLS1.0/1.1) ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers on; # 优先使用服务器端的加密套件 ssl_session_cache shared:SSL:10m; # SSL会话缓存(10MB共享内存) ssl_session_timeout 1d; # 会话超时时间 ssl_session_tickets off; # 禁用会话票据(更安全) # HSTS:强制浏览器使用HTTPS(可选,确认HTTPS稳定后再开启) add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; root /var/www/example.com; index index.html; location / { try_files $uri $uri/ =404; } } # HTTP跳转到HTTPS server { listen 80; server_name example.com; return 301 https://$host$request_uri; }
⚠️ HSTS注意事项

开启HSTS后,浏览器会在max-age时间内强制使用HTTPS访问,如果你的HTTPS配置有问题(如证书过期),用户将无法访问网站。建议先确保HTTPS稳定运行一段时间后再开启HSTS。

九、伪静态与URL重写

9.1 WordPress伪静态

WordPress固定链接配置location / { try_files $uri $uri/ /index.php?$args; }

9.2 Typecho伪静态

Typecho伪静态配置if (!-e $request_filename) { rewrite ^(.*)$ /index.php$1 last; }

9.3 常用rewrite规则

URL重写示例# 301永久重定向:旧域名跳转到新域名 server { listen 80; server_name old.com; return 301 https://new.com$request_uri; } # 带www跳转到不带www server { listen 80; server_name www.example.com; return 301 https://example.com$request_uri; } # 隐藏index.php(如CodeIgniter框架) location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php/$1 last; } } # 禁止访问特定文件类型 location ~* \.(env|log|sql|bak|ini|sh)$ { deny all; return 404; }

十、安全配置

10.1 基础安全配置

Nginx安全加固# 隐藏Nginx版本号(放在http块中) server_tokens off; # 禁止访问隐藏文件(.开头的文件,如.htaccess、.env) location ~ /\. { deny all; access_log off; log_not_found off; } # 禁止访问敏感文件 location ~* \.(env|log|sql|bak|ini|conf|sh|py)$ { deny all; return 404; } # 限制请求体大小(防止大文件上传攻击) client_max_body_size 10m; # 限制请求头大小 client_header_buffer_size 1k; large_client_header_buffers 4 8k; # 安全响应头 add_header X-Frame-Options "SAMEORIGIN" always; # 防止点击劫持 add_header X-Content-Type-Options "nosniff" always; # 防止MIME类型嗅探 add_header X-XSS-Protection "1; mode=block" always; # 启用XSS防护 add_header Referrer-Policy "strict-origin-when-cross-origin" always; # Referrer策略

10.2 限制访问IP(后台保护)

只允许特定IP访问后台location /admin/ { allow 192.168.1.100; # 允许的IP allow 10.0.0.0/8; # 允许的IP段 deny all; # 拒绝其他所有IP # 后端代理配置... proxy_pass http://127.0.0.1:3000; }

10.3 限流防CC攻击

限制请求频率(防CC攻击)# 在http块中定义限流区域 limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; # 在server或location中使用 location / { limit_req zone=one burst=20 nodelay; # 每秒10个请求,突发20个,不延迟 # 其他配置... }

十一、Nginx常用命令

命令说明
nginx -t测试配置文件语法是否正确(修改配置后必执行)
nginx -s reload重新加载配置(平滑重启,不中断服务)
nginx -s stop快速停止Nginx
nginx -s quit优雅停止(等待当前请求完成后停止)
nginx -s reopen重新打开日志文件(日志切割后使用)
nginx -v查看Nginx版本
nginx -V查看Nginx版本和编译参数
systemctl status nginx查看Nginx运行状态
systemctl restart nginx重启Nginx(会短暂中断服务)
⚠️ 重要提醒

修改Nginx配置后,必须先执行 nginx -t 测试配置,确认没有语法错误后再执行 nginx -s reload 重载配置。如果配置有错误直接reload,可能导致Nginx停止服务,网站无法访问!

十二、常见问题FAQ

Q1:Nginx启动失败,提示"address already in use"怎么办?

A:端口被占用。通常是80或443端口被其他程序(如Apache)占用。解决方法:

  • 查看占用端口的进程:netstat -tlnp | grep :80
  • 停止占用端口的程序:systemctl stop httpd(停止Apache)
  • 或者修改Nginx监听端口

Q2:访问网站显示403 Forbidden怎么办?

A:403通常是权限问题,检查以下几点:

  • 网站根目录权限是否正确(目录755,文件644)
  • Nginx运行用户是否有网站目录的读取权限
  • 根目录下是否有index.html或index.php等默认首页文件
  • 配置文件中root指令指向的路径是否正确
  • SELinux是否阻止了访问(CentOS默认开启,可临时关闭测试)

Q3:PHP网站显示"File not found"怎么办?

A:这是PHP-FPM找不到文件的错误,通常是fastcgi_param SCRIPT_FILENAME配置错误。检查:

  • root指令是否正确指向网站根目录
  • fastcgi_param SCRIPT_FILENAME 是否为 $document_root$fastcgi_script_name
  • PHP-FPM运行用户是否有网站文件的读取权限
  • PHP文件是否存在于指定路径

Q4:怎么查看Nginx错误日志?

A:错误日志默认位置:

  • CentOS:/var/log/nginx/error.log
  • Ubuntu:/var/log/nginx/error.log
  • 宝塔面板:/www/wwwlogs/

实时查看日志:tail -f /var/log/nginx/error.log

Q5:Nginx和Apache可以同时运行吗?

A:可以,但不能监听同一个端口。常见做法是Nginx监听80端口作为前端反向代理,Apache监听8080端口处理动态请求,Nginx将PHP请求转发给Apache。但对于新手,建议只使用Nginx,避免复杂性。

Q6:怎么实现一个服务器多个网站?

A:通过虚拟主机(server块)实现。每个网站一个server块,用server_name区分域名。在conf.d目录下为每个网站创建一个独立的配置文件,如example.com.conf、test.com.conf。Nginx会根据请求的域名自动匹配对应的server块。

Q7:配置文件修改后不生效怎么办?

A:检查以下几点:

  • 是否执行了 nginx -t 测试配置
  • 是否执行了 nginx -s reload 重载配置
  • 修改的配置文件是否被include引入(检查nginx.conf中的include路径)
  • 是否有多个server块匹配了同一个域名,导致使用了错误的配置
  • 浏览器缓存问题,尝试强制刷新(Ctrl+F5)或清除缓存
教程文中广告位

十三、总结

Nginx是每个站长必须掌握的工具,本教程涵盖了从安装到常用配置的完整内容。掌握以下核心配置,就能应对90%以上的场景:

  • 虚拟主机配置:一个服务器跑多个网站
  • PHP网站配置:WordPress、Typecho等PHP程序
  • 反向代理:Node.js、Python等应用
  • 静态缓存+Gzip:提升网站速度
  • HTTPS配置:网站安全必备
  • 伪静态规则:URL美化和框架支持
  • 安全配置:隐藏版本、禁止敏感文件、限流

修改配置后记住:先 nginx -t 测试,再 nginx -s reload 重载。遇到问题先看错误日志,大部分问题都能在日志中找到答案。

如果你使用宝塔面板,大部分配置都可以在面板中图形化操作,无需手动编写配置文件,但了解Nginx配置原理仍然很有必要,遇到问题时能更快定位和解决。

这篇教程对你有帮助吗?

728×90 教程页底部广告位