Nginx是非常重要的负载中间件,也是大型架构必备技能,下面我就全面来详解Nginx@mikechen
Nginx
Nginx(发音为 “engine x”)是一款高性能的开源Web服务器、和反向代理服务器。
Nginx以其高并发性和低资源消耗著称,被广泛用于:负载均衡、HTTP缓存、以及反向代理……..等任务。
Nginx主要解决,如下几大场景:
1、反向代理
Nginx可以用于反向代理,比如:将客户端的请求转发给后端服务器,并将后端服务器的响应返回给客户端。
2、负载均衡
Nginx常用于负载均衡,比如:支持多种负载均衡算法(如:轮询、随机、IP、哈希……..等)来分配流量。
3、静态文件服务
可以高效地提供静态内容,比如:图片、CSS、JavaScript……..等的服务。
4、请求限制
可以限制单个IP的并发请求数和请求速率,以及,支持基于IP的访问控制。
Nginx配置文件
Nginx的配置文件通常位于: /etc/nginx/nginx.conf,
配置文件由多个指令、和块组成。
1.配置文件组成
Nginx配置文件主要由以下部分组成:全局块、events块、http块…….等组成。
如下图所示:
全局块:配置Nginx全局性参数;
events块:配置影响Nginx、和操作系统之间网络连接的参数;
http块:配置HTTP服务器相关参数,是配置文件的核心部分;
server块:配置虚拟主机的参数;
location块:配置处理特定URL请求的参数;
针对这些Nginx核心配置,下面我分别详解@mikechen
2.全局块
全局块位于配置文件的顶部,用于设置影响整个Nginx服务的参数,例如:工作进程数和用户权限。
如下所示:
user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /var/run/nginx.pid;
参数说明:
user nginx;
:指定 Nginx 进程运行的用户、和用户组,通常设置为 nginx 用户;worker_processes auto;
:设置工作进程的数量,auto
表示自动检测 CPU 核心数,并设置相应数量的工作进程;error_log /var/log/nginx/error.log warn;
:指定错误日志文件的位置、和日志级别,比如:warn
表示记录警告级别、及以上的日志;pid /var/run/nginx.pid;
:指定存储 Nginx 主进程 :PID 的文件位置。
3.events块
events块配置Nginx如何处理网络连接,通常包含影响Nginx性能的重要设置。
events { worker_connections 1024; multi_accept on; }
参数说明:
worker_connections 1024;
:设置每个工作进程允许的最大连接数,比如:这里设置为“ 1024” 个连接。
4.http块
http块是配置文件的核心部分,包含了:大部分与HTTP服务相关的配置,如下所示:可以嵌套多个server块,每个server块可以包含多个location块。
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; types_hash_max_size 2048; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; server { listen 80; server_name example.com www.example.com; location / { root /usr/share/nginx/html; index index.html index.htm; } location /images/ { root /data; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } }
5.Server块
server 块用于配置虚拟主机相关参数,可以配置多个 server 块来处理不同的主机名、和端口。
如下所示:
server { listen 80; server_name mikechen.cc; location / { root /usr/share/nginx/html; index index.html index.htm; } error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
参数说明:
listen 80;
:指定虚拟主机监听的端口号,这里设置为: 80;server_name mikechen.cc;
:指定虚拟主机的域名,这里设置为 :mikechen.cc;location / {...}
:配置处理根路径/
请求的参数。比如:root /usr/share/nginx/html;
:设置根路径的根目录;比如:index index.html index.htm;
:指定默认首页文件;error_page 404 /404.html;
:指定 404 错误页面的位置;location = /50x.html {...}
:为特定的 URL(即/50x.html
)配置参数。
6.Location块
location 块用于配置处理特定 URL 请求的参数,如下所示:
location / { root /usr/share/nginx/html; index index.html index.htm; } location /images/ { root /data; }
location / {...}
:配置处理根路径 /
请求的参数;
root /usr/share/nginx/html;
:设置根路径的根目录;index index.html index.htm;
:指定默认首页文件。
Nginx 的 location 配置有很多匹配规则,如下所示:
location = /exact-match { # 精确匹配 /exact-match } location /prefix-match { # 前缀匹配 /prefix-match 及其子路径 } location ~* \.(gif|jpg|jpeg)$ { # 匹配以 .gif、.jpg 或 .jpeg 结尾的请求,不区分大小写 } location ~ \.php$ { # 匹配以 .php 结尾的请求,区分大小写 } location ^~ /static/ { # 优先匹配 /static/ 及其子路径,忽略正则匹配 }
location = /exact-match {...}
:精确匹配/exact-match;
location /prefix-match {...}
:前缀匹配/prefix-match
及其子路径;location ~* \.(gif|jpg|jpeg)$ {...}
:匹配以.gif
、.jpg
或.jpeg
结尾的请求,不区分大小写。
Nginx反向代理配置实例
以下是一个Nginx反向代理配置实例,反向代理将客户端的请求转发到后端服务器,并将后端服务器的响应返回给客户端。
如下所示:
http { upstream backend { server backend1.example.com; server backend2.example.com; } 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; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } }
参数说明:
- 定义了一个名为
backend
的上游(upstream)组,包含:两个后端服务器backend1.example.com
、和backend2.example.com;
- 在
server
块中配置了一个虚拟主机,监听80端口; location /
:指定了所有请求都将通过反向代理转发到backend
上游组;proxy_set_header
: 指令用于设置请求头,以便将客户端的原始信息传递给后端服务器。