本博客链接:https://security.blog.csdn.net/article/details/128908135
一、Nginx配置示例
Nginx配置示例如下所示:
全局配置:从配置文件开始到events块之间,主要是设置一些影响nginx服务器整体运行的配置指令,对全局生效;
# 全局块
# 运行用户,默认即是nginx,可以不进行设置
user nginx;
# Nginx 进程数,一般设置为和 CPU 核数一样
worker_processes auto;
# Nginx 的错误日志存放目录
error_log /var/log/nginx/error.log warn;
# Nginx 服务启动时的 pid 存放位置
pid /var/run/nginx.pid;
events:配置影响Nginx服务器与用户的网络连接;
# events块
events {
# 使用epoll的I/O模型(如果你不知道Nginx该使用哪种轮询方法,会自动选择一个最适合你操作系统的)
use epoll;
# 每个进程允许最大并发数
worker_connections 1024;
}
http:配置代理,缓存,日志定义、反向代理、负载均衡等绝大多数功能和第三方模块的配置;
# http块
# 配置使用最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里设置
http {
# 设置日志模式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# Nginx访问日志存放位置
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/mime.types;
# 默认文件类型
default_type application/octet-stream;
# 加载子配置项
include /etc/nginx/conf.d/*.conf;
server:配置虚拟主机的相关参数,一个http块中可以有多个server块,一个server可以有多个location块;
location:用于配置匹配的url;
upstream:配置后端服务器具体地址,负载均衡配置不可或缺的部分;
# server块
server {
listen 80; # 配置监听的端口
server_name localhost; # 配置的域名
# location块
location / { # 访问首页路径
root /usr/share/nginx/html; # 网站根目录(默认目录)
index index.html index.htm; # 默认首页文件
deny 172.168.22.11; # 禁止访问的ip地址,可以为all
allow 172.168.33.44; # 允许访问的ip地址,可以为all
}
error_page 500 502 503 504 /50x.html; # 默认50x对应的访问页面
error_page 400 404 error.html; # 同上
}
}
二、main模块核心参数
user
指定运行Nginx的woker子进程的属主和属组,其中组可以不指定。
user USERNAME [GROUP]
# 用户是nginx;组是lion
user nginx lion;
pid
指定运行Nginx master主进程的pid文件存放路径。
# master主进程的的pid存放在nginx.pid的文件
pid /opt/nginx/logs/nginx.pid
worker_rlimit_nofile_number
指定worker子进程可以打开的最大文件句柄数。
# 可以理解成每个worker子进程的最大连接数量
worker_rlimit_nofile 20480;
worker_rlimit_core
指定worker子进程异常终止后的core文件,用于记录分析问题。
# 存放大小限制
worker_rlimit_core 50M;
# 存放目录
working_directory /opt/nginx/tmp;
worker_processes_number
指定Nginx启动的worker子进程数量。
# 指定具体子进程数量
worker_processes 4;
# 与当前cpu物理核心数一致
worker_processes auto;
worker_cpu_affinity
将每个worker子进程与我们的cpu物理核心绑定。
# 4个物理核心,4个worker子进程
worker_cpu_affinity 0001 0010 0100 1000;
worker_priority
指定worker子进程的nice值,以调整运行Nginx的优先级,通常设定为负值,以优先调用Nginx。Linux默认进程的优先级值是120,值越小越优先,nice定范围为-20到+19
# 120-10=110,110就是最终的优先级
worker_priority -10;
worker_shutdown_timeout
指定worker子进程优雅退出时的超时时间。
worker_shutdown_timeout 5s;
timer_resolution
worker子进程内部使用的计时器精度,调整时间间隔越大,系统调用越少,有利于性能提升;反之,系统调用越多,性能下降。
# 在Linux系统中,用户需要获取计时器时需要向操作系统内核发送请求,有请求就必然会有开销,因此这个间隔越大开销就越小
timer_resolution 100ms;
daemon
指定Nginx的运行方式,前台还是后台,前台用于调试,后台用于生产。
daemon off; # 默认是on,后台运行模式
三、events模块核心参数
use
Nginx使用何种事件驱动模型。
# 不推荐配置它,让nginx自己选择
use method;
# method可选值为:select、poll、kqueue、epoll、/dev/poll、eventport
worker_connections
worker子进程能够处理的最大并发连接数。
# 每个子进程的最大连接数为1024
worker_connections 1024
accept_mutex
是否打开负载均衡互斥锁。
# 默认是off关闭的,这里推荐打开
accept_mutex on
四、http模块核心参数
4.1、一般配置说明
sendfile on
配置on让sendfile发挥作用,将文件的回写过程交给数据缓冲去去完成,而不是放在应用中完成,这样的话在性能提升有有好处
tcp_nopush on
配置on让nginx在一个数据包中发送所有的头文件,而不是一个一个单独发
tcp_nodelay on
配置on让nginx不要缓存数据,而是一段一段发送,如果数据的传输有实时性的要求的话可以配置它,发送完一小段数据就立刻能得到返回值,但是不要滥用哦
keepalive_timeout
给客户端分配连接超时时间,服务器会在这个时间过后关闭连接。一般设置时间较短,可以让nginx工作持续性更好
client_header_timeout
设置请求头的超时时间
client_body_timeout
设置请求体的超时时间
send_timeout
指定客户端响应超时时间,如果客户端两次操作间隔超过这个时间,服务器就会关闭这个链接
limit_conn addr
给定的key设置最大连接数
server_tokens
虽然不会让nginx执行速度更快,但是可以在错误页面关闭nginx版本提示,对于网站安全性的提升有好处
access_log
设置存储访问记录的日志
error_log
设置存储记录错误发生的日志
open_file_cache
打开缓存的同时也指定了缓存最大数目,以及缓存的时间。我们可以设置一个相对高的最大时间,这样我们可以在它们不活动超过20秒后清除掉。
open_file_cache_valid
在open_file_cache中指定检测正确信息的间隔时间。
open_file_cache_min_uses
定义了open_file_cache中指令参数不活动时间期间里最小的文件数。
open_file_cache_errors
指定了当搜索一个文件时是否缓存错误信息,也包括再次给配置中添加文件。我们也包括了服务器模块,这些是在不同文件中定义的。如果你的服务器模块不在这些位置,你就得修改这一行来指定正确的位置。
4.2、server模块
srever模块配置是http模块中的一个子模块,用来定义一个虚拟访问主机,也就是一个虚拟服务器的配置信息。
server {
listen 80;
server_name localhost 192.168.1.100;
charset utf-8;
access_log logs/access.log;
error_log logs/error.log;
......
}
server_name
指定虚拟主机域名,域名匹配的四种写法:
精确匹配:server_name www.nginx.com ;
左侧通配:server_name *.nginx.com ;
右侧统配:server_name www.nginx.* ;
正则匹配:server_name ~^www\.nginx\.*$ ;
匹配优先级:精确匹配 > 左侧通配符匹配 > 右侧通配符匹配 > 正则表达式匹配
server
一个虚拟主机的配置,一个http中可以配置多个server
charset
用于设置www/路径中配置的网页的默认编码格式
access_log
用于指定该虚拟主机服务器中的访问记录日志存放路径
error_log
用于指定该虚拟主机服务器中访问错误日志的存放路径
4.3、location模块
location模块是Nginx配置中出现最多的一个配置,主要用于配置路由访问信息。
location / {
root /nginx/www;
index index.php index.html index.htm;
# 当用户访问www.test.com/image/1.png时,实际在服务器找的路径是/opt/nginx/static/image/1.png
alias /opt/nginx/static/image/;
# 当访问abc.cde.efg/search时,会自动帮我们重定向到https://www.baidu.com
rewrite ^/(.*) https://www.baidu.com redirect;
# 当访问localhost:8080/images/时,会进入if判断里面执行rewrite命令
if ( $uri = "/images/" ){
rewrite (.*) /pics/ break;
}
}
root
用于指定访问根目录时,访问虚拟主机的web目录
index
在不指定访问具体资源时,默认展示的资源文件列表
alias
指定静态资源目录位置,它只能写在location中。
rewrite
根据指定正则表达式匹配规则,重写URL
语法:rewrite 正则表达式 要替换的内容 [flag];
上下文:server、location、if
示例:rewirte /images/(.*\.jpg)$ /pic/$1; # $1是前面括号(.*\.jpg)的反向引用
flag可选值的含义:
last:重写后的URL发起新请求,再次进入server段,重试location的中的匹配;
break:直接使用重写后的URL,不再匹配其它location中语句;
redirect:返回302临时重定向;
permanent:返回301永久重定向;
if 指令
语法:if (condition) {...}
上下文:server、location
示例:
if($http_user_agent ~ Chrome){
rewrite /(.*)/browser/$1 break;
}
condition判断条件:
$variable仅为变量时,值为空或以0开头字符串都会被当做false处理;
= 或 != 相等或不等;
~ 正则匹配;
! ~ 非正则匹配;
~* 正则匹配,不区分大小写;
-f 或 ! -f 检测文件存在或不存在;
-d 或 ! -d 检测目录存在或不存在;
-e 或 ! -e 检测文件、目录、符号链接等存在或不存在;
-x 或 ! -x 检测文件可以执行或不可执行;
location
配置路径,表示匹配访问根目录
location [ = | ~ | ~* | ^~ ] uri {
...
}
匹配规则:
=:精确匹配;
~:正则匹配,区分大小写;
~*:正则匹配,不区分大小写;
^~:匹配到即停止搜索;
匹配优先级:= > ^~ > ~ > ~* > 不带任何字符
location中的反斜线
location /test {
...
}
不带/
当访问www.nginx-test.com/test时, Nginx先找是否有test目录,如果有则找test目录下的index.html;如果没有test目录,nginx则会找是否有test文件。
带/
当访问www.nginx-test.com/test时,Nginx先找是否有test目录,如果有则找test目录下的index.html,如果没有它也不会去找是否存在test文件。
return
停止处理请求,直接返回响应码或重定向到其他URL;执行return指令后,location中后续指令将不会被执行。
return code [text];
return code URL;
return URL;
# 例如:
location / {
return 404; # 直接返回状态码
return 404 "pages not found"; # 返回状态码 + 一段文本
return 302 /bbs ; # 返回状态码 + 重定向地址
return https://www.baidu.com ; # 返回重定向地址
}
autoindex
用户请求以/
结尾时,列出目录结构,可以用于快速搭建静态资源下载网站。
server {
listen 80;
server_name abc.cde.efg;
location /download/ {
root /opt/source;
# 打开autoindex,,可选参数有 on | off
autoindex on;
# 修改为off,以KB、MB、GB显示文件大小,默认为on,以bytes显示出⽂件的确切⼤⼩
autoindex_exact_size on;
# 以html的方式进行格式化,可选参数有 html | json | xml
autoindex_format html;
# 显示的⽂件时间为⽂件的服务器时间。默认为off,显示的⽂件时间为GMT时间
autoindex_localtime off;
}
}
当访问abc.cde.efg/download/时,会把服务器/opt/source/download/路径下的文件展示出来。
五、配置负载均衡
5.1、配置说明
配置负载均衡主要是要使用upstream指令。
upstream用于定义上游服务器(指的就是后台提供的应用服务器)的相关信息。
语法:upstream name {
...
}
上下文:http
示例:
upstream back_end_server{
server 192.168.100.33:8081
}
在upstream内可使用的指令:
● server:定义上游服务器地址;
● zone:定义共享内存,用于跨worker子进程;
● keepalive:对上游服务启用长连接;
● keepalive_requests:一个长连接最多请求HTTP的个数;
● keepalive_timeout:空闲情形下,一个长连接的超时时长;
● hash:哈希负载均衡算法;
● ip_hash:依据IP进行哈希计算的负载均衡算法;
● least_conn:最少连接数负载均衡算法;
● least_time:最短响应时间负载均衡算法;
● random:随机负载均衡算法;
server
定义上游服务器地址。
语法:server address [parameters]
上下文:upstream
parameters可选值:
● weight=number:权重值,默认为1,权重越高,分配的客户端越多;
● max_conns=number:上游服务器的最大并发连接数;
● fail_timeout=time:服务器不可用的判定时间;
● max_fails=numer:服务器不可用的检查次数;
● backup:备份服务器,仅当其他服务器都不可用时才会启用;
● down:标记服务器长期不可用,离线维护;
keepalive
限制每个worker子进程与上游服务器空闲长连接的最大数量。
keepalive connections;
上下文:upstream
示例:keepalive 16;
keepalive_requests
单个长连接可以处理的最多HTTP请求个数。
语法:keepalive_requests number;
默认值:keepalive_requests 100;
上下文:upstream
keepalive_timeout
空闲长连接的最长保持时间。
语法:keepalive_timeout time;
默认值:keepalive_timeout 60s;
上下文:upstream
5.2、负载均衡规则
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
ip_hash
根据客户端的请求ip进行判断,只要ip地址不变就永远分配到同一台主机。它可以有效解决后台服务器session保持的问题。
最少连接数算法
各个worker子进程通过读取共享内存的数据,来获取后端服务器的信息。来挑选一台当前已建立连接数最少的服务器进行分配请求。
语法:least_conn;
上下文:upstream;
fair
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
hash算法
通过制定关键字作为hash key ,基于hash算法映射到特定的上游服务器中。关键字可以包含有变量、字符串。
hash $request_uri
表示使用request_uri变量作为hash的key值,只要访问的URI保持不变,就会一直分发给同一台服务器。
5.3、配置实例
upstream back_end{
# 权重为3,最大并发连接数为1000,不可用判断时间10秒,不可用检查次数为2
server 127.0.0.1:8081 weight=3 max_conns=1000 fail_timeout=10s max_fails=2;
# 其他server地址
server 10.1.22.33:12345;
server 10.1.22.34:12345;
# 空闲长链接最大数为32
keepalive 32;
# 单个长链接最多可处理50个HTTP请求
keepalive_requests 50;
# 空闲长链接最长保持时间为30秒
keepalive_timeout 30s;
# 根据客户端的请求ip进行判断,只要ip地址不变就永远分配到同一台主机
ip_hash;
# 按后端服务器的响应时间来分配请求,响应时间短的优先分配
fair
# zone可以设置共享内存空间的名字和大小
zone test 10M;
# 选当前已建立连接数最少的服务器进行分配请求
least_conn;
# hash算法
hash $request_uri;
}
我们把121.42.11.34服务器作为上游服务器,做如下配置( /etc/nginx/conf.d/balance.conf ):
# 上游服务器
server{
listen 8020;
location / {
return 200 'return 8020 \n';
}
}
server{
listen 8030;
location / {
return 200 'return 8030 \n';
}
}
server{
listen 8040;
location / {
return 200 'return 8040 \n';
}
}
配置完成后:
1、nginx -t:检测配置是否正确;
2、nginx -s reload:重启Nginx服务器;
3、执行ss -nlt
命令查看端口是否被占用,从而判断Nginx服务是否正确启动。
把121.5.180.193服务器作为代理服务器,做如下配置( /etc/nginx/conf.d/balance.conf ):
upstream demo_server {
server 121.42.11.34:8020;
server 121.42.11.34:8030;
server 121.42.11.34:8040;
}
server {
listen 80;
server_name abc.cde.efg;
location /balance/ {
proxy_pass http://demo_server;
}
}
配置完成后重启Nginx服务器,并且在需要访问的客户端配置好ip和域名的映射关系,让负载均衡的配置生效
# /etc/hosts
121.5.180.193 abc.cde.efg
六、配置反向代理
6.1、配置说明
配置反向代理主要是要使用proxy_pass指令。
proxy_pass用于配置代理服务器。
语法:proxy_pass URL;
上下文:location、if、limit_except
示例:
proxy_pass http://127.0.0.1:8081
proxy_pass http://127.0.0.1:8081/proxy
URL参数原则:
1、URL必须以http或https开头;
2、URL中可以携带变量;
3、URL中是否带URI,会直接影响发往上游请求的URL;
接下来让我们来看看两种常见的URL用法:
proxy_pass http://192.168.100.33:8081
proxy_pass http://192.168.100.33:8081/
这两种用法的区别就是带 / 和不带 / ,在配置代理时它们的区别可大了:
不带 / 意味着Nginx不会修改用户URL,而是直接透传给上游的应用服务器;
带 / 意味着Nginx会修改用户URL,修改方法是将location后的URL从用户URL中删除;
不带 / 的用法:
location /bbs/{
proxy_pass http://127.0.0.1:8080;
}
分析:
1、用户请求URL:/bbs/abc/test.html
2、请求到达Nginx的URL:/bbs/abc/test.html
3、请求到达上游应用服务器的URL:/bbs/abc/test.html
带 / 的用法:
location /bbs/{
proxy_pass http://127.0.0.1:8080/;
}
分析:
● 用户请求URL:/bbs/abc/test.html
● 请求到达Nginx的URL:/bbs/abc/test.html
● 请求到达上游应用服务器的URL:/abc/test.html
并没有拼接上/bbs ,这点和root与alias之间的区别是保持一致的。
6.2、配置示例
这里我们用这两个IP来实际说明:121.42.11.34与121.5.180.193
实现效果:访问http://121.5.180.193:8080时,直接跳转(代理)到:http://121.42.11.34:8080
我们把121.42.11.34服务器作为上游服务器,做如下配置(静态配置):
# /etc/nginx/conf.d/proxy.conf
server{
listen 8080;
server_name localhost;
location /proxy/ {
root /usr/share/nginx/html/proxy;
index index.html;
}
}
# /usr/share/nginx/html/proxy/index.html
<h1> 121.42.11.34 proxy html </h1>
配置完成后重启Nginx服务器:
nginx \-s reload
此时,访问:http://121.42.11.34:8080,显示:121.42.11.34 proxy html
接下来把121.5.180.193服务器作为代理服务器,做如下配置(反向代理配置):
# /etc/nginx/conf.d/proxy.conf
upstream back_end {
server 121.42.11.34:8080 weight=2 max_conns=1000 fail_timeout=10s max_fails=3;
keepalive 32;
keepalive_requests 80;
keepalive_timeout 20s;
}
server {
listen 8080;
server_name abc.cde.efg;
location /proxy {
proxy_pass http://back_end/proxy;
}
}
本地机器要访问abc.cde.efg域名,因此需要配置本地hosts,通过命令:
vim /etc/hosts
进入配置文件,添加如下内容:
121.5.180.193 abc.cde.efg
当输入:http://abc.cde.efg/proxy/,最终显示:121.42.11.34 proxy html
分析:
● 当访问abc.cde.efg/proxy(121.5.180.193)时通过upstream的配置找到121.42.11.34:8080,因此访问地址变为http://121.42.11.34:8080/proxy;
● 连接到121.42.11.34服务器,找到8080端口提供的server,通过server找到/usr/share/nginx/html/proxy/index.html资源,最终展示出来。