Nginx
一、概述
1.1.nginx功能
-
Web 服务器:Nginx 可以直接处理客户端的 HTTP 请求,提供静态资源服务,如 HTML、CSS、JavaScript、图片等。它可以快速响应客户端的请求,减少用户等待时间。
-
反向代理服务器:Nginx 可以作为反向代理服务器,接收客户端的请求,然后将请求转发到内部的服务器,并将服务器的响应返回给客户端。通过反向代理,用户可以隐藏内部服务器的真实 IP 地址,提高网站的安全性。
-
负载均衡器:Nginx 可以通过多种算法将客户端的请求均匀地分配到多个后端服务器上,如轮询、IP 哈希、最少连接等。这样可以提高系统的可用性和性能,避免单个服务器因为负载过高而出现故障。
-
HTTP缓存:Nginx 可以对 HTTP 响应进行缓存,减少对后端服务器的请求,提高网站的响应速度。
-
邮件代理服务器:Nginx 还可以作为电子邮件(IMAP/POP3)代理服务器,提供邮件转发和代理服务。它可以和邮件服务器集成,实现邮件的安全传输和管理。
1.2.nginx工作原理
nginx工作模式:单工作进程和多工作进程(默认)两种工作模式。
默认采用多进程工作模式,nginx启动后会运行一个master进程和多个worker进程。主进程负责读取和解析配置文件,管理工作进程,像启动、停止工作进程以及监控它们的状态等。工作进程则负责实际处理客户端的请求。
当客户端发起请求时,Nginx 会先接收连接,解析请求内容,明确请求的方法、URI 和 HTTP 版本等信息。在配置文件里查找匹配的 location 块,直接返回静态文件,或者将请求转发给后端服务器。处理完后,把响应返回给客户端。每个worker之间是平等的,共同竞争来处理来自客户端的请求。
1.3.master进程主要作用
-
**读取和解析配置文件:**Master 进程会在启动时读取 Nginx 的配置文件
nginx.conf
并对其进行解析。它会检查配置文件的语法是否正确,确保各项指令都符合 Nginx 的规范。 -
应用配置更改:当你修改了 Nginx 的配置文件后,Master 进程可以在不中断服务的情况下应用新的配置。通过执行
nginx -s reload
命令,Master 进程会重新读取配置文件,并将新的配置信息传递给工作进程。 -
**监控工作进程:**Master 进程会持续监控工作进程的运行状态。如果某个工作进程因为异常情况(如内存泄漏、程序崩溃等)而终止,会重新启动新的worker进程。
-
**信号处理:**在接收到某些信号后,Master 进程会将信号传递给工作进程,让它们协同完成相应的操作。例如,在重新加载配置文件时,Master 进程会通知工作进程逐渐停止处理旧的请求,并开始按照新的配置处理新的请求。
二、安装
注意事项:nginx奇数版本是开发用的,偶数版本是稳定版
官网:https://nginx.org/
下载地址:https://nginx.org/download/
主机IP | 软件版本 | 系统 | 架构 | 系统资源 |
---|---|---|---|---|
192.168.200.16 | nginx-1.24.0.tar.gz | Rocky-Linux-8.1 | X86 | 2G/2Core |
2.1.源码安装
#下载命令
wget https://nginx.org/download/nginx-1.24.0.tar.gz#创建nginx用户(不创建家目录、不允许登录)
useradd -M -s /sbin/nologin nginx#解压
tar -xf nginx-1.24.0.tar.gz -C /usr/local/#安装素偶需要的依赖
yum install -y gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel#检查编译环境(确定Nginx的安装目录、运行用户和用户组,以及启用所需的模块。在执行完该命令后,会生成相应的Makefile文件)
cd /usr/local/nginx-1.24.0/./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module#编译并安装
make && make install#创建软连接(作用:可以不使用绝对路径执行命令)
ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/#启动用浏览器输入IP地址访问
nginx#curl访问
curl -I 192.168.200.16HTTP/1.1 200 OK
Server: nginx/1.24.0
2.2.常用命令
#启动命令
nginx
#查看nginx的版本号
nginx -v
#查看nginx安装的模块
nginx -大V
#检查nginx的配置文件是否正确
nginx -t
#暴力停止nginx(不管当前是否有请求正在处理,会立即停止)
nginx -s stop
#优雅停止
nginx -s quit
#重载配置文件
nginx -s reload
#重新打开 Nginx 的日志文件,常用于日志轮转或更新日志文件的路径时
sudo nginx -s reopen
三、配置文件
Nginx的配置文件可以分为几个主要部分:
- 全局配置(Global Configuration)
- 事件配置(Events Block)
- http配置(HTTP Block)
- server配置(Server Block)
- location配置(Location Block)
3.1. 全局配置(Global Configuration)
全局配置块位于文件的最上方,通常设置 Nginx 的进程、用户、日志等全局参数。
user nginx;
worker_processes auto;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
- nginx:指定 Nginx 执行命令,通常不需要修改。
- worker_processes auto;:设置工作进程的数量,
auto
表示自动根据 CPU 核心数来决定。通常设置为与 CPU 核心数一致,可以提高性能。 - #error_log logs/error.log;:错误日志文件的路径。此行注释掉表示未启用日志文件。
- #error_log logs/error.log notice;:定义日志级别为
notice
,表示记录较少的重要信息。 - #error_log logs/error.log info;:定义日志级别为
info
,表示记录更多的调试和信息。 - #pid logs/nginx.pid;:指定存放 Nginx 主进程 PID(进程 ID)的文件路径。此行注释掉表示未设置该路径。
3.2. 事件配置(Events Block)
该块用于配置与事件处理相关的设置,主要影响 Nginx 如何处理并发连接。
events {worker_connections 1024; # 每个工作进程的最大连接数use epoll; # 使用 epoll 模型(Linux 系统)
}
- worker_connections 1024;:每个工作进程最大允许的连接数。
1024
是默认值,表示每个进程最多处理 1024 个连接。 - use epoll;:指定事件模型,
epoll
是 Linux 上用于处理大量并发连接的高效事件驱动模型。
3.3. HTTP 配置(HTTP Block)
http
块包含了大多数关于 Web 服务的配置,诸如文件缓存、代理、SSL 等设置。
http {include mime.types; # 加载文件类型映射default_type application/octet-stream; # 默认 MIME 类型sendfile on; # 启用 sendfile(高效传输文件)keepalive_timeout 65; # 设置保持连接的超时时间gzip on; # 启用 Gzip 压缩#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;#tcp_nopush on;
}
-
include mime.types;:引入
mime.types
文件,进行文件类型的映射,如.html
文件对应text/html
类型。 -
default_type application/octet-stream;:默认的 MIME 类型,用于那些未在
mime.types
中定义的文件类型。 -
sendfile on;:启用零拷贝文件传输,使用操作系统的
sendfile
系统调用,提升文件传输性能。 -
keepalive_timeout 65;:设置客户端与服务器之间的空闲连接保持时间,单位为秒。65 秒表示保持连接 65 秒。
-
gzip on;:启用 HTTP 响应的 Gzip 压缩,减少传输的数据量,提升页面加载速度。
-
#log_format main …
:定义访问日志的格式。每个字段表示访问日志中的不同信息:
$remote_addr
:客户端的 IP 地址。$remote_user
:客户端的用户名(如果有的话)。$time_local
:请求发生的时间。$request
:客户端请求的详细信息(如请求方法、URL 等)。$status
:服务器的响应状态码。$body_bytes_sent
:发送给客户端的字节数。$http_referer
:请求来源的 URL。$http_user_agent
:客户端浏览器的信息。$http_x_forwarded_for
:客户端 IP(通过代理时传递的信息)。
-
#access_log logs/access.log main;:设置访问日志文件的位置和格式。
main
是上面定义的日志格式。此行被注释掉,表示未启用访问日志记录。 -
#tcp_nopush on;:启用 TCP_NOPUSH 标志,用于合并多个小的 TCP 包,以提升性能。注释掉表示未启用该选项。
3.4. Server 配置块(用于 HTTP)
server {listen 80; # 监听 80 端口(HTTP 协议默认端口)server_name localhost; # 绑定域名为 localhost
- listen 80;:指定该虚拟主机监听的端口是
80
,这是 HTTP 协议的默认端口。 - server_name localhost;:指定该虚拟主机的域名为
localhost
,即当请求的域名是localhost
时,匹配该server
块。
location / {root html; # 网站根目录为 htmlindex index.html index.htm; # 默认首页为 index.html 或 index.htm}
- location /:处理根路径的请求。
- root html;:根目录设置为
html
文件夹,通常是 Nginx 配置文件所在目录下的html
文件夹。 - index index.html index.htm;:指定默认的首页文件。如果访问根路径
/
,Nginx 会查找并返回index.html
或index.htm
文件。
- root html;:根目录设置为
error_page 500 502 503 504 /50x.html; # 自定义 500、502、503、504 错误页面location = /50x.html {root html; # 错误页面文件位于 html 目录下}
- error_page 500 502 503 504 /50x.html;:当发生 500、502、503 或 504 错误时,返回自定义的错误页面
/50x.html
。 - location = /50x.html { root html; }:当访问
/50x.html
页面时,从html/50x.html
文件加载错误页面。
3.5. 注释掉的部分
#proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {# proxy_pass http://127.0.0.1;#}
- #proxy_pass http://127.0.0.1;:这段配置本来是用于将
.php
文件的请求代理到本地的 Apache 服务器。由于注释掉了,表示当前配置没有启用该代理。
#pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {# root html;# fastcgi_pass 127.0.0.1:9000; # 将 PHP 请求转发到 PHP-FPM# fastcgi_index index.php;# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;# include fastcgi_params;#}
- #fastcgi_pass 127.0.0.1:9000;:这部分配置本来是将
.php
请求转发给 PHP-FPM(FastCGI)服务,通常监听在 9000 端口。由于被注释掉,表示当前没有启用 PHP 处理。
#deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {# deny all; # 禁止访问 .htaccess 文件#}
- #deny all;:这部分配置用于禁止访问
.htaccess
文件。.htaccess
文件通常由 Apache 使用,但在 Nginx 中不支持,因此要确保不让外部访问这些敏感文件。
3.6. 注释掉的虚拟主机配置(使用不同端口和 IP)
#another virtual host using mix of IP-, name-, and port-based configuration##server {# listen 8000; # 监听 8000 端口# listen somename:8080; # 监听指定域名和端口# server_name somename alias another.alias;## location / {# root html;# index index.html index.htm;# }#}
- #server { … }:这部分配置展示了如何使用不同的 IP 地址、端口和域名来配置多个虚拟主机。这里被注释掉了,表示未启用这个虚拟主机。
3.7. 注释掉的 HTTPS 配置
#HTTPS server##server {# listen 443 ssl; # 启用 SSL 并监听 443 端口# server_name localhost;## ssl_certificate cert.pem; # SSL 证书# ssl_certificate_key cert.key; # SSL 证书私钥## ssl_session_cache shared:SSL:1m;# ssl_session_timeout 5m;## ssl_ciphers HIGH:!aNULL:!MD5; # SSL 加密套件# ssl_prefer_server_ciphers on;## location / {# root html;# index index.html index.htm;# }#}
-
#listen 443 ssl;:启用 SSL 并监听 443 端口,这表示 Nginx 将提供 HTTPS 服务。此行被注释掉了,表示没有启用 HTTPS。
-
#ssl_certificate cert.pem;:指定 SSL 证书文件的路径,
cert.pem
是证书文件的名称。 -
#ssl_certificate_key cert.key;:指定 SSL 证书的私钥文件路径。
-
#ssl_session_cache shared:SSL:1m;:设置 SSL 会话缓存,以提高性能。
-
#ssl_ciphers HIGH:!aNULL:!MD5;:指定使用的 SSL 加密套件。
-
#ssl_prefer_server_ciphers on;:启用服务器优先使用加密套件。
-
proxy_pass:将请求转发到另一台服务器。
-
rewrite:URL重写,可以用于301重定向、去除多余的斜杠等。
-
add_header:添加HTTP头部信息。
四、虚拟主机
美团有众多业务,每个业务可能有不同的域名,如外卖、酒店、旅游等业务分别有各自的域名。通过 Nginx 虚拟主机,可以在同一台服务器上配置多个server
块,每个server
块对应一个域名,监听相同或不同的端口,根据域名来分发请求,将用户的请求准确地路由到对应的业务应用服务器上。
示例:模拟使用2个不通域名域名相同端口对美团外卖和娱乐两个模块提供服务
waimai.meituan.com
yule.meituan.com
4.1.修改配置文件(添加多个虚拟主机)
vim /usr/local/nginx/conf/nginx.conf# 定义用户和工作进程数量
user nginx;
worker_processes auto;# 错误日志配置
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;# 事件模块配置
events {worker_connections 2048;use epoll; # 适用于 Linux 系统,提高性能
}# HTTP 模块配置
http {# 包含 MIME 类型配置文件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 /var/log/nginx/access.log main;# 开启高效文件传输模式sendfile on;tcp_nopush on;tcp_nodelay on;# 保持连接超时时间keepalive_timeout 65;# Gzip 压缩配置gzip on;gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;# 虚拟主机配置:waimai.meituan.comserver {listen 80;server_name waimai.meituan.com;# 字符编码设置charset utf-8;# 访问日志和错误日志配置access_log /var/log/nginx/waimai.meituan.com.access.log main;error_log /var/log/nginx/waimai.meituan.com.error.log;# 根目录和索引文件配置root /var/www/waimai.meituan.com;index index.html index.htm;# 错误页面配置error_page 404 /404.html;location = /404.html {internal;}error_page 500 502 503 504 /50x.html;location = /50x.html {internal;}}# 虚拟主机配置:yule.meituan.comserver {listen 80;server_name yule.meituan.com;# 字符编码设置charset utf-8;# 访问日志和错误日志配置access_log /var/log/nginx/yule.meituan.com.access.log main;error_log /var/log/nginx/yule.meituan.com.error.log;# 根目录和索引文件配置root /var/www/yule.meituan.com;index index.html index.htm;# 错误页面配置(相对路径)error_page 404 /404.html;location = /404.html {internal;}error_page 500 502 503 504 /50x.html;location = /50x.html {internal;}}
}
4.2.创建所需文件
#创建网站根目录
mkdir -p /var/www/waimai.meituan.com
mkdir -p /var/www/yule.meituan.com#创建网页
echo "<h1>Welcome to waimai.meituan.com</h1>" > /var/www/waimai.meituan.com/index.htmlecho "<h1>Welcome to yule.meituan.com</h1>" > /var/www/yule.meituan.com/index.html
#创建日志存放目录
mkdir -p /var/log/nginx
#创建错误页面文件
echo "404 Not Found" > /var/www/waimai.meituan.com/404.html
echo "50x Server Error" > /var/www/waimai.meituan.com/50x.htmlecho "404 Not Found" > /var/www/yule.meituan.com/404.html
echo "50x Server Error" > /var/www/yule.meituan.com/50x.html
#权限设置
chown -R nginx:nginx /var/www
chown -R nginx:nginx /var/log/nginx
#设置系统最大打开文件的数量(默认1024)
ulimit -n 4096
4.3.添加域名
[root@localhost conf]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.200.16 waimai.meituan.com #添加域名
192.168.200.16 yule.meituan.com #添加域名
4.4.启动访问
nginx -t
nginx -s reload
[root@localhost conf]# curl waimai.meituan.com
<h1>Welcome to waimai.meituan.com</h1>[root@localhost conf]# curl yule.meituan.com
<h1>Welcome to yule.meituan.com</h1>
五、负载均衡
主机IP | 软件版本 | 系统 | 架构 | 系统资源 |
---|---|---|---|---|
192.168.200.16 | nginx-1.24.0.tar.gz | Rocky-Linux-8.1 | X86 | 2G/2Core |
192.168.200.17 | tomcat | Rocky-Linux-8.1 | X86 | 2G/2Core |
192.168.200.18 | tomcat | Rocky-Linux-8.1 | X86 | 2G/2Core |
5.1.安装Tomcat(主机17和18)
yum -y install tomcat
5.2.创建所需目录
mkdir -p /usr/share/tomcat/webapps/waimai
mkdir -p /usr/share/tomcat/webapps/yuleecho "<html><body><h1>Welcome to waimai!</h1></body></html>" > /usr/share/tomcat/webapps/waimai/index.jsp
echo "<html><body><h1>Welcome to Yule!</h1></body></html>" > /usr/share/tomcat/webapps/yule/index.jsp
5.3.修改配置文件
cd /usr/share/tomcat/conf
cp -a server.xml{,.bak}vim server.xml#添加两个hosts
<Host name="waimai.meituan.com" appBase="/usr/share/tomcat/webapps" unpackWARs="true" autoDeploy="true"><Context path="/" docBase="waimai" reloadable="true"/><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="waimai_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
</Host><Host name="yule.meituan.com" appBase="/usr/share/tomcat/webapps" unpackWARs="true" autoDeploy="true"><Context path="/" docBase="yule" reloadable="true"/><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="yule_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
</Host>
- name=“waimai.meituan.com”
- 指定虚拟主机的主机名,即访问时的域名。
- 浏览器访问时,使用这个域名进行请求匹配。
- appBase=“/usr/share/tomcat/webapps”
- 指定 Web 应用程序的根目录,存放项目文件的路径。
- 例如:
/usr/share/tomcat/webapps/waimai
。- unpackWARs=“true”
- 当部署一个
.war
文件时,是否自动解压缩为目录结构。- 如果为
false
,则不会解压,直接使用压缩包。- autoDeploy=“true”
- 当检测到部署目录中有新
.war
文件时,是否自动重新部署。- 优点: 便于热更新和自动部署。
- 缺点: 生产环境可能导致短暂服务中断。
5.4.启动Tomcat访问
[root@localhost conf]# systemctl start tomcat
[root@localhost conf]# curl 192.168.200.17:8080/waimai/
<html><body><h1>Welcome to Waimai!</h1></body></html>[root@localhost conf]# curl 192.168.200.17:8080/yule/
<html><body><h1>Welcome to Yule!</h1></body></html>
5.5.配置nginx
vim nginx.confuser nginx;
worker_processes auto;
worker_cpu_affinity auto;error_log /var/log/nginx/error.log warn;
error_log /var/log/nginx/error_critical.log crit;
pid /var/run/nginx.pid;events {worker_connections 1024;multi_accept on;use epoll;
}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"';log_format cache_log '$remote_addr - $remote_user [$time_local] ''"$request" $status $body_bytes_sent ''"$http_referer" "$http_user_agent" ''"$http_x_forwarded_for" [cache_status:$upstream_cache_status]';access_log /var/log/nginx/access.log main;access_log /var/log/nginx/cache_access.log cache_log;sendfile on;tcp_nopush on;tcp_nodelay on;keepalive_timeout 65;keepalive_requests 1000;gzip on;gzip_comp_level 6;gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;gzip_proxied any;gzip_vary on;proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;proxy_temp_path /var/tmp/nginx;# 外卖业务后端负载均衡组upstream waimai_backend {least_conn;server 192.168.200.17:8080 max_fails=3 fail_timeout=10s;server 192.168.200.18:8080 max_fails=3 fail_timeout=10s;}# 娱乐业务后端负载均衡组upstream yule_backend {least_conn;server 192.168.200.17:8080 max_fails=3 fail_timeout=10s;server 192.168.200.18:8080 max_fails=3 fail_timeout=10s;}# waimai.meituan.com 虚拟主机配置server {listen 80;server_name waimai.meituan.com;charset utf-8;access_log /var/log/nginx/waimai.meituan.com.access.log main;error_log /var/log/nginx/waimai.meituan.com.error.log;location / {proxy_pass http://waimai_backend;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_cache my_cache;proxy_cache_valid 200 302 60m;proxy_cache_valid 404 10m;add_header Nginx-Cache $upstream_cache_status;proxy_connect_timeout 10s;proxy_send_timeout 10s;proxy_read_timeout 10s;proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;}error_page 404 /404.html;location = /404.html {internal;}error_page 500 502 503 504 /50x.html;location = /50x.html {internal;}}# yule.meituan.com 虚拟主机配置server {listen 80;server_name yule.meituan.com;charset utf-8;access_log /var/log/nginx/yule.meituan.com.access.log main;error_log /var/log/nginx/yule.meituan.com.error.log;location / {proxy_pass http://yule_backend;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_cache my_cache;proxy_cache_valid 200 302 60m;proxy_cache_valid 404 10m;add_header Nginx-Cache $upstream_cache_status;proxy_connect_timeout 10s;proxy_send_timeout 10s;proxy_read_timeout 10s;proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;}error_page 404 /404.html;location = /404.html {internal;}error_page 500 502 503 504 /50x.html;location = /50x.html {internal;}}
}
user nginx;:指定 Nginx 工作进程运行的用户为 nginx,通过非 root 用户运行,降低安全风险。
worker_processes auto;:设置工作进程数量为 auto,Nginx 自动根据 CPU 核心数确定进程数,优化资源利用。
worker_cpu_affinity auto;:自动进行 CPU 亲和性设置,绑定工作进程到特定 CPU 核心,减少进程切换开销。
error_log /var/log/nginx/error.log warn;:定义错误日志路径为 /var/log/nginx/error.log,记录警告级别(warn)及以上错误信息。
error_log /var/log/nginx/error_critical.log crit;:单独记录严重级别(crit)错误到 /var/log/nginx/error_critical.log。
pid /var/run/nginx.pid;:指定 Nginx 主进程 PID 文件路径,用于进程管理(如启停、查看状态)。
events { … }:事件处理配置块,调整连接处理参数:
worker_connections 1024;:每个工作进程可同时处理的最大连接数。
multi_accept on;:允许工作进程一次性接收多个新连接,提升高并发处理效率。
use epoll;:使用 Linux 的 epoll 事件模型,高效处理并发连接。
http { … }:HTTP 服务核心配置块,包含全局及虚拟主机配置:
include mime.types;:引入 mime.types 文件,定义文件扩展名对应的 MIME 类型。
default_type application/octet-stream;:设置默认 MIME 类型为二进制流,处理未知类型文件。
log_format main …;:定义 main 日志格式,记录客户端 IP、请求时间、状态码等常规信息。
log_format cache_log …;:定义 cache_log 日志格式,额外记录缓存状态(如 HIT/MISS)。
access_log /var/log/nginx/access.log main;:按 main 格式记录常规访问日志。
access_log /var/log/nginx/cache_access.log cache_log;:按 cache_log 格式记录缓存相关日志。
sendfile on;:开启高效文件传输,减少内核与用户空间数据拷贝。
tcp_nopush on;:配合 sendfile,优化网络包发送,提升吞吐量。
tcp_nodelay on;:禁用 Nagle 算法,降低实时应用(如长连接)的传输延迟。
keepalive_timeout 65;:长连接超时时间为 65 秒,无活动则关闭连接。
keepalive_requests 1000;:单个长连接最多处理 1000 个请求,防止资源滥用。
gzip on;:开启 Gzip 压缩,减小响应数据体积。
gzip_comp_level 6;:设置压缩级别为 6,平衡压缩率与 CPU 消耗。
gzip_types text/plain …;:指定对文本、CSS、JSON 等 MIME 类型内容压缩。
gzip_proxied any;:对所有代理请求的响应也进行压缩。
gzip_vary on;:在响应头添加 Vary: Accept-Encoding,优化缓存策略。
proxy_cache_path /var/cache/nginx …;:配置代理缓存路径、大小、过期时间等,缓存代理响应。
proxy_temp_path /var/tmp/nginx;:设置代理临时文件存储路径,避免污染主缓存目录。
upstream waimai_backend { … }:定义后端服务器组(外卖业务),实现负载均衡:
least_conn;:采用最少连接数算法,分配请求到当前连接数最少的服务器。
server 192.168.200.17:8080 max_fails=3 fail_timeout=10s;:定义后端服务器地址,设置失败重试策略(10 秒内最多 3 次失败)。
server { … }:虚拟主机配置(以 waimai.meituan.com 为例):
listen 80;:监听 80 端口,接收 HTTP 请求。
server_name waimai.meituan.com;:绑定域名,识别对应虚拟主机请求。
charset utf-8;:设置响应字符编码为 UTF-8,支持多语言。
access_log /var/log/nginx/waimai.meituan.com.access.log main;:记录该虚拟主机的常规访问日志。
error_log /var/log/nginx/waimai.meituan.com.error.log;:记录该虚拟主机的错误日志。
location / { … }:匹配根路径请求的处理逻辑:
proxy_pass http://waimai_backend;:将请求代理到 waimai_backend 后端服务器组。
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_cache my_cache;:启用 my_cache 缓存区,缓存代理响应。
proxy_cache_valid 200 302 60m;:对 200、302 状态码响应缓存 60 分钟。
proxy_cache_valid 404 10m;:对 404 状态码响应缓存 10 分钟。
add_header Nginx-Cache $upstream_cache_status;:在响应头添加缓存状态信息。
proxy_connect_timeout 10s;:与后端建立连接的超时时间。
proxy_send_timeout 10s;:向后端发送请求数据的超时时间。
proxy_read_timeout 10s;:从后端读取响应数据的超时时间。
proxy_next_upstream error …;:定义切换后端服务器的条件(如错误、超时、5xx 状态码)。
error_page 404 /404.html;:定义 404 错误返回自定义页面。
location = /404.html { internal; }:限制 /404.html 仅内部访问,禁止外部直接请求。
5.6.添加域名解析并访问
[root@localhost conf]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.200.16 waimai.meituan.com
192.168.200.16 yule.meituan.com[root@localhost conf]# curl http://waimai.meituan.com
<html><body><h1>Welcome to Waimai!</h1></body></html>
[root@localhost conf]# curl http://yule.meituan.com
<html><body><h1>Welcome to Yule!</h1></body></html>