main 全局设置
events{ 工作模式,连接配置
...
}
http{ http的配置
...
upstream xxx{ 负载均衡配置
...
}
server{ 主机设置
...
location xxx{ URL匹配
...
}
}
}
# worker进程运行的用户和组
user root [root];
# 指定Nginx开启的子进程数,多核CPU建议设置和CPU数量一样的进程数
worker_processes auto;
# 用来定义全局错误日志文件,通常放在var中,level有 debug,info,notice,warn,error,crit
error_log /var/log/nginx/error.log info;
# 指定进程id的存储文件位置
pid /run/nginx.pid;
# 一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。
# 如果worker_rlimit_nofile的值小于worker_connections的值,会报如下错误:
# worker_connections exceed open file resource limit: xxx
worker_rlimit_nofile 65535;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
# 守护进程,默认为on
# 在容器环境下最好配置为off,不然以守护进程启动则会异常退出
daemon off;
# 指定工作模式和以及连接上限
events {
# use 指定nginx工作模式
# [epoll] 高效工作模式,linux
# [kqueue] 高效工作模式,bsd
# [poll] 标准模式
# [select] 标准模式
use epoll;
# worker_connections 定义nginx每个进程的最大连接数
# 正向代理 连接数 * 进程数
# 反向代理 连接数 * 进程数 / 4
# linux系统限制最多能同时打开65535个文件,默认上限就是65535,可解除 ulimit -n 65535
# 单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 65535;
}
最核心的模块,主要负责http服务器相关配置,包含server,upstream子模块,常见配置如下:
http {
# 日志格式,配置escape=json使能显示中文
log_format main escape=json '$remote_addr - "$http_referer" - $remote_user [$time_local] - "$request" "$http_user_agent" - '
'$status - $request_time $upstream_response_time - $request_length $body_bytes_sent - '
'"$query_string" - "$request_body"';
# 日志文件地址
access_log /var/log/nginx/access.log main;
# 每秒5个请求
# limit_req_zone $binary_remote_addr zone=addr:10m rate=5r/s;
# 设置文件的mime类型,mime.types是文件扩展名与文件类型映射表
include /etc/nginx/mime.types;
# 默认响应类型,二进制流
default_type application/octet-stream;
charset utf-8; #默认编码
# 包含其它配置文件,分开规划解耦
# include xxxconfig;
include /etc/nginx/conf.d/*.conf;
# 设置高效文件传输模式
sendfile on;
# 该指令必须在sendfile打开的状态下才会生效,主要是用来提升网络包的传输'效率',防止网络堵塞
tcp_nopush on;
# 设置客户端连接活跃超时,也就是长连接超时时间,单位是秒
keepalive_timeout 65;
# 该指令必须在keep-alive连接开启的情况下才生效,来提高网络包传输的'实时性',也是为了防止网络堵塞
tcp_nodelay on;
# 开启gzip压缩输出
# gzip on;
# FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
#upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
upstream myServer {
server 192.168.80.121:80 weight=3;
server 192.168.80.122:80 weight=2;
server 192.168.80.123:80 weight=3;
}
# server用来指定虚拟主机
server {
}
# server用来指定虚拟主机
server {
}
当配置 Nginx 日志格式时,可以使用以下占位符来记录不同的信息。这里是列举的大部分 Nginx 日志占位符及其解释:
$remote_addr
: 客户端的 IP 地址。$remote_user
: 客户端的用户名(如果启用了基本身份验证)。$time_local
: 请求发生的本地时间,格式为 [day/month/year:hour:minute:second zone]
。$request
: 完整的 HTTP 请求行。$status
: 响应的 HTTP 状态码。$body_bytes_sent
: 响应的字节数,不包括响应头的大小。$http_referer
: 请求头中的 Referer 字段,指示请求的来源 URL。$http_user_agent
: 请求头中的 User-Agent 字段,标识发起请求的客户端应用程序。$request_time
: 完成请求的时间,以秒为单位。$upstream_response_time
: 反向代理服务器的响应时间,以秒为单位。$upstream_addr
: 反向代理服务器的地址。$host
: 请求的主机名。$server_name
: Nginx 服务器的名称。$uri
: 请求的 URI。$request_method
: 请求的 HTTP 方法。$http_x_forwarded_for
: 从请求头中获取的客户端真实 IP 地址(如果存在)。$ssl_protocol
: 使用的 SSL/TLS 协议版本。$ssl_cipher
: 使用的 SSL/TLS 加密套件。$request_length
: 请求的字节数,包括请求头和请求体。$bytes_sent
: 发送给客户端的总字节数,包括响应头和响应体。$connection
: 客户端与服务器之间的连接 ID。$request_id
: 请求的唯一 ID,用于跟踪日志。$scheme
: 请求的协议方案(例如,http 或 https)。$arg_name
: URL 查询参数的值,其中 name 是参数名。$request_body
: 请求体内容http {
#开启gzip压缩输出
gzip on;
#最小压缩文件大小
gzip_min_length 1k;
#压缩缓冲区
gzip_buffers 4 16k;
#压缩版本(默认1.1,前端如果是squid2.5请使用1.0)开始压缩的http协议版本(可以不设置,目前几乎全是1.1协议)
gzip_http_version 1.0;
#推荐6压缩级别(级别越高,压的越小,越浪费CPU计算资源)
gzip_comp_level 2;
#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
gzip_types text/plain text/javascript text/css application/javascript application/x-javascript application/xml application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary on; # 是否传输gzip压缩标志
# 禁用对用户代理为 Internet Explorer 1到6版本的请求进行压缩。
gzip_disable "MSIE [1-6]\.";
#开启限制IP连接数的时候需要使用
#limit_zone crawler $binary_remote_addr 10m;
}
在web服务种有一些静态资源响应很慢,这时可以配置缓存,将一些文件缓存在内存中。
只需要配置 proxy_cache_path
和 proxy_cache
就可以开启内容缓存,前者用来设置缓存的路径和配置,后者用来启用缓存,一个简单的配置如下:
http {
...
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
# 当前块全部开启缓存
proxy_cache mycache;
location / {
proxy_pass http://localhost:8000;
}
}
}
在http 块中加入如下配置:
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
}
/var/cache/nginx
表示缓存文件保存的路径levels
在/var/cache/nginx
设置了一个两级层次结构的目录。将大量的文件放置在单个目录中会导致文件访问缓慢,所以针对大多数部署,我们推荐使用两级目录层次结构。如果 levels 参数没有配置,则 NGINX 会将所有的文件放到同一个目录中。keys_zone=my_cache:10m
缓存区域的名称是my_cache,设置了一个共享的内存区,该内存区用于存储缓存键和元数据,有些类似计时器的用途。将键的拷贝放入内存可以使 NGINX 在不检索磁盘的情况下快速决定一个请求是 HIT 还是 MISS,这样大大提高了检索速度。一个 1MB 的内存空间可以存储大约 8000 个 key,那么上面配置的 10MB 内存空间可以存储差不多 80000 个key。max_size
设置了缓存的上限(在上面的例子中是 10G)。这是一个可选项;如果不指定具体值,那就是允许缓存不断增长,占用所有可用的磁盘空间。当缓存达到这个上线,处理器便调用 cache manager 来移除最近最少被使用的文件,这样把缓存的空间降低至这个限制之下。inactive
指定了项目在不被访问的情况下能够在内存中保持的时间。在上面的例子中,如果一个文件在 60 分钟之内没有被请求,则缓存管理将会自动将其在内存中删除,不管该文件是否过期。该参数默认值为 10 分钟(10m)。注意,非活动内容有别于过期内容。NGINX 不会自动删除由缓存控制头部指定的过期内容(本例中Cache-Control:max-age=120)。过期内容只有在 inactive 指定时间内没有被访问的情况下才会被删除。如果过期内容被访问了,那么 NGINX 就会将其从原服务器上刷新,并更新对应的 inactive 计时器。use_temp_path=off
nginx最初会将注定写入缓存的文件先放入一个临时存储区域, use_temp_path=off
命令指示 NGINX 将在缓存这些文件时将它们写入同一个目录下。比较建议将参数设置为 off 来避免在文件系统中不必要的数据拷贝。server {
...
location / {
proxy_cache my_cache;
# proxy_cache_key "$host$request_uri$cookie_user";
proxy_cache_min_uses 3;
proxy_cache_methods GET HEAD POST;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
# proxy_cache_valid any 5m;
proxy_cache_bypass $http_pragma;
proxy_cache_revalidate on;
proxy_pass http://localhost:8000;
}
}
proxy_cache my_cache
表示使用之前定义的缓存区域。
proxy_cache_key
为指定缓存的 key,这个不推荐,示例是使用域名,请求url,用户 cookie 来当作 key,意味着一个页面将为不同的用户缓存 n 次,绝大多数情况不需要这样的操作。
proxy_cache_min_uses
为在缓存响应之前必须使用相同密钥的请求的最小次数。
proxy_cache_methods
为指定要被缓存的请求方式的响应值,默认为 GET 和 HEAD,新增其他的需要一起列出来,如上示例所示。
proxy_cache_valid
为响应状态码的缓存时间,可以分别为不同的状态码缓存指定时间,也可以使用 any 进行全部状态码的缓存,上述指令设置了针对状态码为200和302的响应的缓存有效期为10分钟(10m),400为1分钟,也就是说在接下来的10分钟内,对相同的请求直接返回缓存的响应,而不再向后端服务器发送请求。这有助于减轻后端服务器的负载并提高响应速度。
proxy_cache_bypass $http_pragma
表示如果请求头有pragma,则会绕过缓存,直接向后端服务器发送请求并获取响应。
proxy_cache_revalidate on
表示每次请求都会检查缓存是否过期。
缓存中还涉及两个额外的NGINX进程:
在以下示例中,迭代持续数300 毫秒或直到 200 个项目被加载进去:
proxy_cache_path /var/cache/nginx keys_zone=one:10m loader_threshold=300 loader_files=200;
官网:https://docs.nginx.com/nginx/admin-guide/content-cache/content-caching/
需要提前加一个配置,用于标识使用 HTTP PURGE
方法的请求并删除匹配的 URL 对应的缓存。
1.在 http {} 上下文中创建新变量,例如 $purge_method, 他依赖于 $request_method 变量:
http {
...
map $request_method $is_purge {
PURGE 1;
default 0;
}
}
2.在 location {} 块中,已经配置缓存的前提下,引入 proxy_cache_purge 参数来指定清除缓存请求的条件。例如在上一步指定的 $request_method
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass https://localhost:8000;
proxy_cache mycache;
...
proxy_cache_purge $purge_method;
}
}
3.配置完并使之生效之后,就可以发送一条 purge 请求来让缓存失效了,例如:
curl -X PURGE -D – "https://www.example.com/*"
在该示例中,将清除具有公共 URL 部分(由星号通配符指定)的资源。但这些缓存条目不会从缓存中完全删除。
它们会保留在磁盘上,直到它们被视为不活动(由proxy_cache_path 中的 inactive参数决定)的时候才完全删除,或缓存清除器(由 proxy_cache_path 中的 purge 决定),或客户端尝试访问它们的时候。
http {
# FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
}
在http节点下,加入upstream节点
upstream myServer{
server 10.0.6.108:7080;
server 10.0.0.85:8980;
}
将server节点下的location节点中的proxy_pass配置为:http:// + upstream名称,即
location / {
root html;
index index.html index.htm;
proxy_pass http://myServer;
}
如今负载均衡初步完毕了。upstream依照轮询(默认)方式进行负载,每一个请求按时间顺序逐一分配到不同的后端服务器。假设后端服务器down掉。能自己主动剔除。尽管这样的方式简便、成本低廉。但缺点是:可靠性低和负载分配不均衡。
weight(权重)指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。例如以下所看到的。10.0.0.88的访问比率要比10.0.0.77的访问比率高一倍。
upstream linuxidc{
server 10.0.0.77 weight=5;
server 10.0.0.88 weight=10;
}
ip_hash(访问ip),每一个请求按访问ip的hash结果分配。这样每一个访客固定访问一个后端服务器,能够解决session的问题。
upstream favresin{
ip_hash;
server 10.0.0.10:8080;
server 10.0.0.11:8080;
}
这是为更加智能的负载均衡算法,fail算法可以依据页面大小和加载时间长短智能地进行负载均衡,即根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身不支持 fair,使用需要下载配置Nginx的 upstream_fair模块。
upstream favresin{
fair;
server 10.0.0.10:8080;
server 10.0.0.11:8080;
}
url_hash(第三方),按访问url的hash结果来分配请求,使每一个url定向到同一个后端服务器。后端服务器为缓存时比较有效。
注意:在upstream中加入hash语句。server语句中不能写入weight
等其他的參数,hash_method
是使用的hash算法。
upstream resinserver{
server 10.0.0.10:7777;
server 10.0.0.11:8888;
hash $request_uri;
hash_method crc32;
}
upstream还能够为每一个设备设置状态值,这些状态值的含义分别例如以下:
down
:表示单前的server临时不參与负载。weight
:weight越大,负载的权重就越大。backup
:预留的备份机器,其他全部的非backup机器down或者忙的时候才会请求backup机器,所以这台机器压力会最轻。max_fails
:允许请求失败的次数,默认为1,超过最大次数,返回proxy_next_upstream
模块定义的错误。fail_timeout
: 在经历了max_fails(最大请求失败次数)次失败后,暂停服务的时间单位(若干)秒,配合max_fails一起使用。upstream bakend{ #定义负载均衡设备的Ip及设备状态
ip_hash;
server 10.0.0.11:9090 down;
server 10.0.0.11:8080 weight=2;
server 10.0.0.11:6060 max_fails=2 fail_timeout=2;
server 10.0.0.11:7070 backup;
}
# server用来指定虚拟主机
server {
# 指定虚拟主机监听的端口
listen 80 default_server;
listen [::]:80 default_server;
# 指定网页的默认编码格式
charset utf-8;
# 域名可以有多个,用空格隔开
# server_name www.baidu.com www.souhu.com;
# 日志格式设定
# log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
# 指定虚拟主机的访问日志存放路径
# access_log xxx main;
# 指定虚拟主机的错误日志存放路径
# error_log xxx main;
# 指定这个虚拟主机的根目录
# root xxx;
# 指定默认首页
# index xxx;
# 解决跨域问题,允许跨域访问的源地址信息,可以配置多个(多个用逗号分隔),也可以使用*代表所有源
add_header Access-Control-Allow-Origin *;
# add_header Access-Control-Allow-Headers X-Requested-With;
# 允许跨域访问的请求方式,值可以为 GET POST PUT DELETE...,可以全部设置,也可以根据需要设置,多个用逗号分隔
add_header Access-Control-Allow-Methods *;
# 针对跨域资源共享的设置,设置预检请求的响应头
add_header Access-Control-Allow-Headers X-Requested-With;
# Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
# 核心中的核心,主要配置都在这
# 主要功能:定位url,解析url,支持正则匹配,还能支持条件,实现动静分离
# 语法
# location [modifier] uri{
# ...
# }
# modifier 修饰符
# = 使用精确匹配并且终止搜索
# ~ 区分大小写的正则表达式
# ~* 不区分大小写的正则表达式
# ^~ 最佳匹配,不是正则匹配,通常用来匹配目录
# ================下面为常用代理配置示例================
# dist为vue打包后的h5文件夹
location / {
root /dist;
}
#设定查看Nginx状态的地址
location /status{
stub_status on;
access_log on;
# 设置认证,详情看后面的ngx_http_auth_basic_module模块
auth_basic "your description";
auth_basic_user_file /etc/nginx/auth;
#htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
}
# 反向代理,转发到java服务
# ex:http:127.0.0.1:80/api/test/test1 -> http:base-auth:8080/test/test1
# 将'/api/'后面的路径直接拼接到http://base-auth:8080/后面
location /api/ {
proxy_pass http://base-auth:8080/;
}
# ex:http:127.0.0.1:80/api/test/test1 -> http:base-auth:8080/test/test1
# '^~ /api/'表示匹配前缀是api的请求,会把'/api/'后面的路径直接拼接到http://base-auth:8080/后面
# location ^~ /api/ {
# proxy_pass http://base-auth:8080/;
# }
}
ngx_http_auth_basic_module
模块允许通过使用“HTTP基本认证”协议验证用户名和密码来限制对资源的访问。
访问还可以根据地址、子请求的结果或JWT进行限制。同时通过地址和密码限制访问由满足指令控制。
生成密码: openssl passwd
命令将输出一段对应的 Hash 值。
也可以使用更为复杂的 Hash 规则进行生成,如使用 apr1 算法:openssl passwd -apr1
在明文密码较长的情况下,需要使用后者。
在任意合适的位置,生成相应的用户名密码描述文件。文件的格式为:
# Comments
user1:password1
user2:password2:comment
user3:password3
例如,启用用户 admin
,该用户的明文密码为 123456
, 经过 Hash 处理之后的密码为 $apr1$dbjnVHtt$VuH8VTGpuo3vJdw3PXoGC0
,则描述文件中的内容为:
admin:$apr1$dbjnVHtt$VuH8VTGpuo3vJdw3PXoGC0
在对应站点的配置文件中,加入如下类似的内容:
location / {
auth_basic "your description";
auth_basic_user_file <your_conf_file_path>;
}
其中,your_conf_file_path
填入你创建说明文件的绝对路径,同时,在已经要求身份认证的父目录下,可以对特定的子目录取消身份验证要求:
loaction <subroute_match_rules> {
auth_basic off;
}
stub_status on;
是一个用于启用 Nginx 的 Stub Status 模块的指令。Stub Status 模块提供了一种简单的方式来获取有关 Nginx 服务器当前状态的信息。
在 Nginx 配置中添加 stub_status on;
指令时,将启用 Stub Status 模块,并使其对外可用。
location /status {
stub_status on;
access_log on;
auth_basic "nginx status";
auth_basic_user_file /etc/nginx/auth;
}
Stub Status 模块会将状态信息以文本格式返回给客户端,通过访问 Nginx 的 Stub Status 页面,可以获取到以下信息:
Active connections: 13
server accepts handled requests
24 24 12
Reading: 0 Writing: 1 Waiting: 12
核心中的核心,以后的主要配置都在这
主要功能:定位url,解析url,支持正则匹配,还能支持条件,实现动静分离
语法
location [modifier] uri{
...
}
modifier 修饰符
= 使用精确匹配并且终止搜索
~ 区分大小写的正则表达式
~* 不区分大小写的正则表达式
^~ 最佳匹配,不是正则匹配,通常用来匹配目录
常用指令
alias 别名,定义location的其他名字,在文件系统中能够找到,如果location指定了正则表达式,alias将会引用正则表达式中的捕获,alias替代lication中匹配的部分,没有匹配的部分将会在文件系统中搜索
#对 "/" 启用反向代理
location / {
proxy_pass http://127.0.0.1:8088;
# 使用http1.1
proxy_http_version 1.1;
# 设置代理服务器的请求头 Host 字段为当前请求的主机名。
proxy_set_header Host $host;
# 设置请求头信息。X-Real-IP 头会将客户端真实 IP 地址传递给后端服务器,X-Forwarded-For 头会将客户端真实 IP 地址添加到请求头中,以便后端服务器获取。
proxy_set_header X-Real-IP $remote_addr;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#允许客户端请求的最大单文件字节数
client_max_body_size 10m;
#缓冲区代理缓冲用户端请求的最大字节数
client_body_buffer_size 128k;
# 禁用代理服务器对后端服务器返回的重定向进行修改
proxy_redirect off;
proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时 秒)
proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时 秒)
proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时 秒)
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
}
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log info;
pid /var/run/nginx.pid;
events {
use epoll;
worker_connections 65535;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main escape=json '$remote_addr - "$http_referer" - $remote_user [$time_local] - "$request" "$http_user_agent" - '
'$status - $request_time $upstream_response_time - $request_length $body_bytes_sent - '
'"$query_string" - "$request_body"';
access_log /var/log/nginx/access.log main;
charset utf-8;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
tcp_nodelay on;
gzip on;
gzip_min_length 1k;
gzip_comp_level 6;
gzip_types text/plain text/javascript text/css application/javascript application/x-javascript application/xml application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
upstream document_api{
server api:8080;
}
server {
listen 80 default_server;
charset utf-8;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods *;
add_header Access-Control-Allow-Headers X-Requested-With;
location / {
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_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_http_version 1.1;
client_max_body_size 300M;
proxy_pass http://document_api/;
}
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file /etc/nginx/auth;
}
}
}