Nginx配置文件详解

本博客链接: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资源,最终展示出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

武天旭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值