Nginx 实战系列(二)—— Nginx 配置文件与虚拟主机搭建
文章目录
- 前言
- 一、Nginx 配置文件
- 1.1 全局配置
- 1.2 I/O 事件配置
- 1.3 HTTP 配置
- 1.4 Web 服务的监听配置
- 1.5 其他配置(扩展)
- 二、Nginx 虚拟主机
- 2.1 访问状态统计配置
- 2.1.1 查看已安装的所有模块
- 2.1.2 修改 nginx.conf 配置文件
- 2.1.3 重载服务,访问测试
- 2.2 基于授权的访问控制
- 2.2.1 生成用户密码认证文件
- 2.2.2 修改主配置文件相对应目录,添加认证配置项
- 2.2.3 重启服务,访问测试
- 2.3 基于客户端的访问控制
- 2.4 基于域名的 Nginx 虚拟主机
- 2.4.1 为虚拟主机提供域名解析
- 2.4.2 为虚拟主机准备网页文档
- 2.4.3 修改nginx配置文件
- 2.4.4 重启服务,访问测试
- 2.5 基于IP 的 Nginx 虚拟主机
- 2.5.1 配置server1
- 2.5.2 配置server 2
- 2.5.3 重启服务,测试访问
- 2.6 基于端口的 Nginx 虚拟主机
- 2.6.1 配置端口1
- 2.6.2 配置端口2
- 2.6.3 重启服务,测试访问
- 总结
- 一、Nginx核心配置解析
- 二、虚拟主机与实用功能
前言
在掌握 Nginx 的基础安装后,能否灵活配置 Nginx、充分发挥其功能,是实现 Web 服务个性化部署与高效运行的关键。无论是调整服务性能参数以适配业务并发需求,还是通过虚拟主机实现多站点共享一台服务器资源,都需要深入理解 Nginx 的配置逻辑与核心功能模块。
作为《Nginx 实战系列》的第二篇,本文将聚焦 Nginx 的核心配置与虚拟主机搭建两大核心场景。我们将从 nginx.conf 主配置文件入手,拆解全局配置、I/O 事件配置、HTTP 配置等关键模块的参数含义与优化思路,帮助读者建立 “配置 - 性能” 的关联认知;同时,详细讲解基于域名、IP、端口的三种虚拟主机搭建方案,以及访问状态统计、授权控制等实用功能的配置方法,让读者不仅能看懂配置文件,更能根据实际业务需求完成落地部署,为后续实现反向代理、负载均衡等复杂场景奠定基础。
一、Nginx 配置文件
认识Nginx服务的主配置文件 nginx.conf
vim /usr/local/nginx/conf/nginx.conf
1.1 全局配置
nginx的全局配置通常位于nginx.conf文件的最外层(即不在任何http、server或location块内),用于控制nginx服务器的整体行为。这些配置直接影响nginx的工作进程、性能优化、日志记录等核心功能。一句话概括:全局配置负责系统层面的全局优化。
#user nobody; #运行用户,若编译时未指定则默认为 nobody
worker_processes 4; #工作进程数量,可配置成服务器内核数 * 2,如果网站访问量不大,一般设为1就够用了
#error_log logs/error.log; #错误日志文件的位置
#pid logs/nginx.pid; #PID 文件的位置
1.2 I/O 事件配置
nginx的I/O事件配置主要用于优化服务器处理连接的方式,直接影响性能、并发能力和资源利用率。
events {use epoll; #使用 epoll 模型,2.6及以上版本的系统内核,建议使用epoll模型以提高性能worker_connections 4096; #每个进程处理 4096 个连接
}
#如提高每个进程的连接数还需执行“ulimit -n 65535”命令临时修改本地每个进程可以同时打开的最大文件数。
#在Linux平台上,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄(端口),每个socket句柄同时也是一个文件句柄)。#可使用ulimit -a命令查看系统允许当前用户进程打开的文件数限制。
/etc/security/limits.conf#epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著的减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。
若工作进程数为 8,每个进程处理 4 096 个连接,则允许 Nginx 正常提供服务的连接数
已超过 3 万个(4 096×8=32 768),当然具体还要看服务器硬件、网络带宽等物理条件的性能表现。
1.3 HTTP 配置
在 http { }
配置块中可以配置多种参数,包括:
- 文件扩展名与类型映射
- 自定义日志格式
- 访问日志路径设置
- 文件下载优化
- 连接超时控制(keepalive_timeout)
- 数据压缩配置
同时,该配置块还支持虚拟主机部署和PHP解析功能。需要注意的是,大部分配置指令需要嵌套在 server { }
子配置块中才能生效。
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;##此选项允许或禁止使用socket的TCP_CORK的选项(发送数据包前先缓存数据),此选项仅在使用sendfile的时候使用#tcp_nopush on;##连接保持超时时间,单位是秒#keepalive_timeout 0;keepalive_timeout 65;##gzip模块设置,设置是否开启gzip压缩输出#gzip on;
1.4 Web 服务的监听配置
server web服务监听配置包括以下方面:
- 监听地址与端口 IP地址 端口
- 站点域名 可以多个,用空格隔开 server_name
- 设置字符集
- 根目录配置
location /{
root html; #网站根目录位置
index index.html index.php index.jsp; #定义首页文件名
}
##Web 服务的监听配置
server {##监听地址及端口listen 80; ##站点域名,可以有多个,用空格隔开server_name www.kgc.com;##网页的默认字符集charset utf-8;##根目录配置location / {##网站根目录的位置/usr/local/nginx/htmlroot html;##默认首页文件名index index.html index.php;}##内部错误的反馈页面error_page 500 502 503 504 /50x.html;##错误页面配置location = /50x.html {root html;}
}
}
1.5 其他配置(扩展)
日志格式设定
$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
$remote_user:用来记录客户端用户名称;
$time_local: 用来记录访问时间与时区;
$request: 用来记录请求的url与http协议;
$status: 用来记录请求状态;成功是200,
$body_bytes_sent :记录发送给客户端文件主体内容大小;
$http_referer:用来记录从哪个页面链接访问过来的;
$http_user_agent:记录客户浏览器的相关信息;
通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
====================================================================================
location常见配置指令,root、alias、proxy_pass
root(根路径配置):root /var/www/html
请求www.simoncwh.com/test/1.html,会返回文件/var/www/html/test/1.htmlalias(别名配置):alias /var/www/html
请求www.simoncwh.com/test/1.html,会返回文件/var/www/html/1.htmlproxy_pass(反向代理配置)
二、Nginx 虚拟主机
Nginx 虚拟主机(Server Blocks)允许在单个服务器上托管多个网站或应用,通过不同配置规则区分请求,实现资源隔离和灵活管理。
2.1 访问状态统计配置
HTTP_STUB_STATUS 模块提供 Nginx 的基本状态信息,包括活跃连接数、请求处理统计等,用于监控服务器性能。
2.1.1 查看已安装的所有模块
查看已安装的 Nginx 是否包含 HTTP_STUB_STATUS 模块
/usr/local/nginx/sbin/nginx -V
查看 nginx 已安装的所有模块
cat /opt/nginx-1.20.2/auto/options | grep YES
2.1.2 修改 nginx.conf 配置文件
修改 nginx.conf 配置文件,指定访问位置并添加 stub_status 配置
cd /usr/local/nginx/conf
cp nginx.conf nginx.conf.bak
vim /usr/local/nginx/conf/nginx.conf
......
http {
......server {listen 80;server_name localhost;charset utf-8;location / {root html;index index.html index.php;}##添加 stub_status 配置##location /status { #访问位置为/statusstub_status on; #打开状态统计功能access_log off; #关闭此位置的日志记录}}
}
2.1.3 重载服务,访问测试
systemctl reload nginx浏览器访问 http://192.168.10.110/status
Active connections :表示当前的活动连接数;
server accepts handled requests :表示已经处理的连接信息,三个数字依次表示已处理的连接数、成功的TCP握手次数、 已处理的请求数。可 curl -s http://192.168.10.110/status 结合 awk与if 语句进行性能监控。
2.2 基于授权的访问控制
通过用户身份认证和权限验证来控制其对资源与服务的访问权限。
2.2.1 生成用户密码认证文件
yum install -y httpd-tools
#建一个新的密码文件(passwd.db),并将用户 zhangsan 添加到该文件中。
htpasswd -c /usr/local/nginx/passwd.db zhangsan
# 更改passwd.db的属主与权限
chown nginx /usr/local/nginx/passwd.db
chmod 400 /usr/local/nginx/passwd.db
2.2.2 修改主配置文件相对应目录,添加认证配置项
vim /usr/local/nginx/conf/nginx.conf
......server {location / {......##添加认证配置##auth_basic "secret"; #设置密码提示框文字信息auth_basic_user_file /usr/local/nginx/passwd.db;}}
2.2.3 重启服务,访问测试
nginx -t
systemctl restart nginx浏览器访问 http://192.168.10.110
输入之前设置的用户名zhangsan和密码,进行密码认证。
2.3 基于客户端的访问控制
nginx
可以配置黑白名单,控制特定客户端是否有权访问服务器资源。
访问控制规则如下:
deny IP/IP 段:拒绝某个 IP 或 IP 段的客户端访问。
allow IP/IP 段:允许某个 IP 或 IP 段的客户端访问。
规则从上往下执行,如匹配则停止,不再往下匹配。vim /usr/local/nginx/conf/nginx.conf
......server {location / {......##添加控制规则##allow 192.168.10.123; #允许访问的客户端 IPdeny all; #拒绝其它IP客户端访问}}systemctl restart nginx
1、使用允许的IP进行访问
curl 192.168.10.110
curl -u username:passwd 192.168.10.110
2、使用不被允许的IP进行访问
2.4 基于域名的 Nginx 虚拟主机
2.4.1 为虚拟主机提供域名解析
echo "192.168.10.110 www.yjs.com www.simoncwh.com" >> /etc/hosts
2.4.2 为虚拟主机准备网页文档
mkdir -p /usr/local/nginx/html/simoncwh
mkdir -p /usr/local/nginx/html/yjs
echo "<h1>www.yjs.com</h1>" > /usr/local/nginx/html/yjs/index.html
echo "<h1>www.simoncwh.com</h1>" > /usr/local/nginx/html/simoncwh/index.html
2.4.3 修改nginx配置文件
vim /usr/local/nginx/conf/nginx.conf
......
http {
......server {listen 80;server_name www.yjs.com; #设置域名www.yjs.comcharset utf-8;access_log logs/www.yjs.access.log; #设置日志名location / {root /usr/local/nginx/html/yjs; #设置www.yjs.com 的工作目录index index.html index.php;}error_page 500 502 503 504 /50x.html;location = /50x.html{root html;}}server {listen 80;server_name www.simoncwh.com; #设置域名www.simoncwh.comcharset utf-8;access_log logs/www.simoncwh.access.log; location / {root /usr/local/nginx/html/simoncwh;index index.html index.php;}error_page 500 502 503 504 /50x.html;location = /50x.html{root html;}}
}
2.4.4 重启服务,访问测试
systemctl restart nginx浏览器访问
http://www.yjs.com
http://www.simoncwh.com
2.5 基于IP 的 Nginx 虚拟主机
2.5.1 配置server1
ifconfig ens33:0 192.168.10.40 netmask 255.255.255.0
vim /usr/local/nginx/conf/nginx.conf
......
http {
......server {listen 192.168.10.110:80; #设置监听地址192.168.10.110server_name www.yjs.com;charset utf-8;access_log logs/www.yjs.access.log; location / {root /usr/local/nginx/html/yjs;index index.html index.php;}error_page 500 502 503 504 /50x.html;location = /50x.html{root html;}}
2.5.2 配置server 2
server {listen 192.168.10.40:80; #设置监听地址192.168.10.40server_name www.simoncwh.com;charset utf-8;access_log logs/www.simoncwh.access.log; location / {root /usr/local/nginx/html/simoncwh;index index.html index.php;}error_page 500 502 503 504 /50x.html;location = /50x.html{root html;}
}
}
2.5.3 重启服务,测试访问
systemctl restart nginx浏览器访问
http://192.168.10.110
http://192.168.10.40
2.6 基于端口的 Nginx 虚拟主机
2.6.1 配置端口1
vim /usr/local/nginx/conf/nginx.conf
......
http {
......server {listen 192.168.10.110:8080; #设置监听 8080 端口server_name www.yjs.com;charset utf-8;access_log logs/www.yjs.access.log; location / {root /usr/local/nginx/html/yjs;index index.html index.php;}error_page 500 502 503 504 /50x.html;location = 50x.html{root html;}}
2.6.2 配置端口2
server {listen 192.168.10.110:8888; #设置监听 8888 端口server_name www.simoncwh.com;charset utf-8;access_log logs/www.simoncwh.access.log; location / {root /usr/local/nginx/html/simoncwh;index index.html index.php;}error_page 500 502 503 504 /50x.html;location = 50x.html{root html;}
}
2.6.3 重启服务,测试访问
systemctl restart nginx浏览器访问
http://192.168.10.110:8080
http://192.168.10.110:8888
总结
本文作为《Nginx实战系列》的进阶篇,以“配置解析→功能落地”为核心逻辑,围绕Nginx的关键应用能力展开,具体可分为两大核心模块,形成从理论理解到实践验证的完整闭环:
一、Nginx核心配置解析
本部分以nginx.conf
主配置文件为核心,拆解三大关键配置模块的作用与优化思路,为后续功能部署奠定基础:
- 全局配置:明确
worker_processes
参数与服务器内核的匹配原则(通常设为“内核数×2”,低访问量场景可设为1),确定Nginx工作进程的基础数量,直接影响并发处理能力;同时梳理PID文件、错误日志等基础配置的路径与作用。 - I/O事件配置:重点讲解
epoll
模型的优势(适用于Linux 2.6+内核,减少高并发下的CPU占用),以及worker_connections
的并发控制逻辑(单个进程默认处理4096个连接,结合进程数可计算总并发能力,需配合ulimit -n
调整系统文件句柄限制)。 - HTTP与location配置:梳理HTTP模块的基础参数(MIME类型映射、日志格式、连接超时时间等),并聚焦
root
、alias
、proxy_pass
三大location指令的差异——root
会拼接请求路径与根目录,alias
直接映射请求路径,proxy_pass
用于反向代理,为后续配置调试提供关键区分依据。
二、虚拟主机与实用功能
本部分通过“功能配置→流程验证”的实践方式,完成三大核心应用场景的落地,解决实际业务中的监控、安全与多站点需求:
- 访问状态统计:先通过
nginx -V
确认HTTP_STUB_STATUS
模块已安装,再修改配置文件添加/status
访问路径并启用stub_status on
,最终通过浏览器或curl
命令查看“活动连接数”“已处理请求数”等关键指标,实现服务状态实时监控。 - 访问安全控制:提供两种安全方案——一是基于密码认证(通过
httpd-tools
生成passwd.db
认证文件,在配置中添加auth_basic
与auth_basic_user_file
参数);二是基于客户端IP(通过allow
/deny
规则按IP/IP段控制访问,规则自上而下匹配),保障服务访问安全。 - 多类型虚拟主机搭建:落地三种主流虚拟主机方案,均通过“配置→重启→测试”验证可行性:
- 基于域名:修改
/etc/hosts
绑定多域名到同一IP,在配置中通过server_name
区分站点,指定不同网页目录; - 基于IP:为网卡配置子接口(如
ens33:0 192.168.10.40
),在配置中通过listen
指定不同IP监听80端口; - 基于端口:在配置中通过
listen
为同一IP指定不同端口(如8080、8888),实现多站点独立访问。
- 基于域名:修改
后续系列文章将在本次配置与虚拟主机实践的基础上,进一步深入Nginx的反向代理、负载均衡、缓存优化等高级功能,逐步构建“安装-配置-优化-运维”的完整技术体系,助力读者应对高并发、高可用的生产环境需求。