Nginx 部署配置
Nginx
Nginx 是一款高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。
在生产环境中,Nginx 常用于处理大量并发请求和负载均衡,其配置文件通常位于 /etc/nginx/nginx.conf
或 /usr/local/nginx/conf/nginx.conf
。
代理服务器
正向代理服务器
- 客户端和目标服务器之间的服务器,客户端向代理发送一个请求指定目标服务器,然后代理向目标服务器请求并获得内容,并返回给客户端,平时说的代理服务器一般是正向代理服务器
- 核心:用户知道自己访问的目标服务器
- 场景:跳板机、堡垒机、VPN。访问原来无法访问的网站, 比如国外的一些站点。
反向代理服务器
- 客户端和目标服务器之间的服务器,客户端向代理发送一个请求,然后代理向目标服务器请求并获得内容,并返回给客户端。反向代理隐藏了真实的服务器
- 核心:客户端不知道要访问的目标服务器是哪台服务器,代理会根据一定的策略选择一个真实的服务器进行请求
- 场景:访问百度,知道访问的域名是
baidu.com
, 但是后面提供数据的具体是什么域名或 ip 我们是不知道的。
Nginx 核心特性
-
高性能:
Nginx
使用异步事件驱动架构,非阻塞 I/O 模型,能够高效地处理大量并发连接,特别适合处理 C10K 问题(同时处理一万个以上的客户端连接)。 -
反向代理服务器:想象一下,
Nginx
像是一家高级餐厅的接待员。客户(浏览器)走进来(发送请求),接待员(Nginx)根据需求将他们引导到不同的厨师(后端服务器)那里。厨师做好菜(处理请求),再通过接待员把菜送回给客户。这样做的好处是可以隐藏后厨(真实服务器)的具体位置,还能处理一些安全和优化工作,比如 SSL 加密、压缩数据等。 -
负载均衡器:当餐厅生意太好,一个厨师忙不过来时,就需要多个厨师一起工作。
Nginx
可以自动将进来的顾客分配给不同的厨师(后端服务器),确保每个厨师都不至于太忙,提高了整体的服务效率。它可以根据不同的策略(比如轮询、最少连接数等)来决定将请求分发给哪个服务器处理。 -
静态资源服务器:
Nginx
非常擅长快速地提供网站上的图片、CSS 样式表、JavaScript 文件等静态资源。因为它处理这类请求的速度非常快,可以大大提升网站的加载速度,让用户体验更好。 -
动静分离:
Nginx
能区分哪些请求是需要动态处理的(比如登录验证、数据查询等),哪些是静态资源,然后分别转发给合适的处理方。这样可以让专门处理动态内容的服务器(如 PHP 服务器)不被静态请求拖慢,提高整体效率。 -
高可配置性:通过修改配置文件,可以灵活地调整
Nginx
的行为,支持条件判断、变量使用等高级功能。 -
安全防护:
Nginx
还能作为一道防线,阻挡恶意请求,比如限制访问频率、过滤危险的请求头等,保护你的应用不受攻击。 -
HTTP(S)服务器:
Nginx
自身就能直接作为一个网页服务器,处理并返回网页内容,特别是对于不需要复杂后端逻辑的静态网站来说,直接用Nginx
就能搞定。
Nginx 配置文件结构
Nginx 配置文件的基本结构包括以下几个部分:
- 全局配置(Main Context)
- 事件配置(Events Context)
- HTTP 配置(HTTP Context)
- 服务器配置(Server Context)
- 位置配置(Location Context)
全局配置
全局配置部分用于设置Nginx
服务器的全局参数,如用户、工作进程数、进程权限等。
Nginx
的全局设置位于配置文件的最顶部,影响整个Nginx
服务器的行为。
user
: 指定运行Nginx
的woker
子进程的属主和属组,其中组可以不指定。
#语法:user USERNAME [GROUP]
user nginx lion; # 用户是nginx;组是lion
error_log
: 指定错误日志的文件路径和日志级别。
error_log /var/log/nginx/error.log info; #错误日志记录到 /var/log/nginx/error.log,日志级别设置为 info,意味着记录的信息包括警告、错误和其他重要信息
pid
: 指定运行 Nginx master 主进程的 pid 文件存放路径。
pid /opt/nginx/logs/nginx.pid # master主进程的的pid存放在nginx.pid的文件
worker_processes
: 指定 Nginx 启动的 worker 子进程数量。
worker_processes 4; # 指定具体子进程数量
worker_processes auto; # 与当前cpu物理核心数一致
事件配置
在 Nginx 的配置中,events 块是全局设置的一部分,专门用于配置与事件处理和连接管理相关的参数。
-
worker_connections
:定义单个工作进程能够同时打开的最大连接数。这直接影响到 Nginx 处理并发请求的能力。 -
use
:指定 Nginx 使用的事件处理机制,不同的操作系统提供了不同的高效 I/O 多路复用模型。 -
accept_mutex``accept_mutex_delay
:在多进程环境下,防止多个工作进程同时争抢新连接的锁机制。accept_mutex 控制是否启用锁,而 accept_mutex_delay 可以设置尝试获取锁前的延迟时间,以避免不必要的 CPU 唤醒。 -
server_name
:指定虚拟主机域名。
域名匹配的四种写法:
- 精确匹配: server_name http://www.nginx.com ;
- 左侧通配: server_name *.http://nginx.com ;
- 右侧统配: server_name www.nginx.* ;
- 正则匹配: server_name ~^www.nginx.*$ ;
匹配优先级:精确匹配 > 左侧通配符匹配 > 右侧通配符匹配 > 正则表达式匹配
-
multi_accept
:决定一个工作进程在一次循环中是否可以接受多个新连接,默认为关闭状态。 -
multi_accept
:决定一个工作进程在一次循环中是否可以接受多个新连接,默认为关闭状态。 -
multi_accept
:决定一个工作进程在一次循环中是否可以接受多个新连接,默认为关闭状态。
events {
worker_connections 1024;
use epoll;
}
- worker_connections: 指定每个工作进程的最大连接数。
- use: 指定事件驱动模型(如 epoll、kqueue 等)。
HTTP 配置
HTTP
配置部分几乎涵盖了 Nginx
的所有 HTTP
相关配置。它包含 HTTP
服务器的全局设置、服务器块(Server Blocks)
以及位置块(Location Blocks)
。
http {
include /etc/nginx/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;
include /etc/nginx/conf.d/*.conf;
}
include
: 用于包含其他配置文件。default_type
: 指定默认的MIME
类型。log_format
: 自定义日志格式。access_log
: 指定访问日志文件及使用的日志格式。sendfile
: 开启高效文件传输。tcp_nopush
: 优化 TCP 传输。tcp_nodelay
: 减少网络延迟。keepalive_timeout
: 指定连接超时时间。
服务器配置
服务器配置部分定义了虚拟主机的设置,每个 server
块代表一个虚拟主机。
server {
listen 80;
server_name example.com www.example.com;
root /usr/share/nginx/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
location /images/ {
alias /data/images/;
}
error_page 404 /404.html;
location = /404.html {
internal;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}
}
listen
: 指定监听端口。server_name
: 定义服务器名称。root
: 设置根目录。index
: 指定默认文件。location
: 定义 URL 匹配规则和处理方式。try_files
: 尝试顺序文件访问。alias
: 为特定目录指定路径别名。error_page
: 自定义错误页面。fastcgi_pass
: 指定 PHP-FPM 后端服务器。
位置配置(Location Context)
location
块用于处理 URL
请求,其匹配规则分为精确匹配、前缀匹配和正则匹配。
location
块的基本语法如下:
location [修饰符] <匹配模式> {
# 处理指令
}
以下是一些常见的 location
示例:
- 精确匹配:
location = /exact_path {
# 配置指令...
}
- 前缀匹配:
location /prefix {
# 配置指令...
}
- 正则匹配:
location ~ \.php$ {
# 配置指令...
}
Nginx 各种代理配置
- 一个综合的
Nginx
配置示例,展示了如何配置多个虚拟主机和处理静态文件、反向代理等功能。
user www-data;
worker_processes auto;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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;
include /etc/nginx/conf.d/*.conf;
upstream backend {
server 127.0.0.1:8080;
}
server {
listen 80;
server_name example.com www.example.com;
root /usr/share/nginx/example;
location / {
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://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_set_header X-Forwarded-Proto $scheme;
}
location ~ /\.ht {
deny all;
}
}
server {
listen 80;
server_name test.com www.test.com;
root /usr/share/nginx/test;
location / {
try_files $uri $uri/ =404;
}
location /secure/ {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
}
- 强制 http 跳转 https
server {
listen 80;
server_name test.com;
# http强制跳转到https
rewrite ^(.*)$ https://$server_name$1 permanent;
}
root
和alias
两种配置静态资源的区别
server {
listen 80;
server_name localhost;
# 用root方式,location中的路径会拼加到root的地址后面
# 请求路径为:http://localhost:8080/files/index.jpg 实际访问为:/home/files/index.jpg
location ~^/files/ {
root /home/;
index index.html index.htm;
}
# 用alias方式,location中的路径不会拼加到alias的地址后面
# 这请求路径为:http://localhost:8080/files/index.jpg 实际访问为:/home/index.jpg
location ~^/files/ {
alias /home/;
index index.html index.htm;
}
}
# alias指定的路径结尾要加”/”
- 前端 history 模式 404 问题
location / {
try_files $uri $uri/ /index.html;
}
- 开启 gzip
**如何配置:**
gzip on; # 默认off,是否开启gzip
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
# 上面两个开启基本就能跑起了
gzip_static on;
gzip_proxied any;
gzip_vary on;
gzip_comp_level 6;
gzip_buffers 16 8k;
# gzip_min_length 1k;
gzip_http_version 1.1;
-
文件上传
client_max_body_size
:Nginx
限制文件大小可以通过client_max_body_size
指令来设置,该指令通常在http
、server
或location
块中设置,如果不设置,默认上传大小为 1M。client_body_buffer_size
:在Nginx
中,client_body_buffer_size
是一个用于设置客户端请求体缓冲区大小的指令。它的作用是控制Nginx
服务器接收客户端请求体的缓冲区大小。- 当客户端发送请求数据时(例如 POST 请求中的表单数据、文件上传等),
Nginx
会将这些数据存储在内存中的缓冲区中,然后处理该数据。client_body_buffer_size
指令用于设置这个缓冲区的大小。 - 如果设置的
client_body_buffer_size
小于实际的请求体数据大小,Nginx
会返回一个"Request Entity Too Large"(413)
错误。因此,适当地设置client_body_buffer_size
是很重要的,它可以避免由于请求体过大而导致服务器性能下降或者内存溢出的问题。
- 当客户端发送请求数据时(例如 POST 请求中的表单数据、文件上传等),
client_header_timeout
:读取请求头的超时时间,默认 60 秒。若超过所设定的大小,返回408
错误。client_body_timeout
:读取请求实体的超时时间,默认 60 秒。若超过所设定的大小,返回413
错误。
此外:
-
client_header_buffer_size
:默认值:client_header_buffer_size 1
1k
,这个指令表示客户端请求的 http 头部缓冲区大小。绝大多数情况,下一个头部请求的大小不会大于 1k。不过如果有来自于 wap 客户端的较大的 cookie 它可能会大于 1k,Nginx 将分配给它一个更大的缓冲区,这个值可以在large_client_header_buffers
里面设置。 -
large_client_header_buffers
:默认值:large_client_header_buffers 4
4k
,指令表示客户端请求的一些比较大的头文件到缓冲区的最大值。如果一个请求的 URI 大小超过这个值,服务器将返回一个"Request URI too large" (414)
,同样如果一个请求的头部字段大于这个值,服务器将返回"Bad request"(400)。 -
反向代理
http{
server {
listen 80;
server_name example.com www.example.com;
root /usr/share/nginx/example;
location / {
try_files $uri $uri/ /index.html;
}
location ^~/api/ {
#Proxy Settings
proxy_redirect off;
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;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_max_temp_file_size 0;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://backend;
}
}
}
proxy_connect_timeout
:设置代理服务器与后端服务器建立连接的超时时间,单位为秒。
proxy_read_timeout
:设置代理服务器从后端服务器读取数据的超时时间,单位为秒。
proxy_send_timeout
:设置代理服务器向后端服务器发送数据的超时时间,单位为秒。
- 本地缓存静态资源
location ~*.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 365d;
}
# 该语句将会在客户端(浏览器)请求后,将这些静态资源缓存于本地(浏览器),并且设置有效期365天
- 二级路由
server {
listen 3300;
server_name demo.com;
#前端打的dist资源存放目录
root /srv/www/project;
location /two/ {
alias /srv/www/project/two/;
try_files $uri $uri/ /web/index.html;
}
location / {
# 用于配合 browserHistory使用
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
}
结论
Nginx 的配置文件虽然看起来可能有些复杂,但实际上非常灵活和强大。通过合理配置,可以有效地提升 Web 服务器的性能和安全性。希望这篇详解能够帮助你更好地掌握 Nginx 配置文件的书写和使用。如果你在配置 Nginx 时遇到任何问题或有新的建议,欢迎留言与我们分享!