Nginx基础02:配置文件nginx.conf(Part1)

nginx.conf配置文件详解 这个配置主要可以用来解决常说的 “惊群”问题,大致意思是在某一个时刻,客户端发来一个请求连接,Nginx后台是以多进程的工作模式,也就是说有多个worker进程会被同时唤醒,但是最终只会有一个进程可以获取到连接,如果每次唤醒的进程数目太多,就会影响Nginx的整体性能。从前面的内容学习中,我们知道Nginx的核心配置文件默认是放在 /usr/local/nginx/conf/nginx.conf,这一节,我们就来学习下nginx.conf的内容和基本配置方法。 阅读详情

我们使用Nginx主要是通过其配置文件nginx.conf来实现的。按照一定的规则,编写特定的指令,可以帮助我们实现对Web服务的控制!所以,学习Nginx的用法,几乎就是学习nginx.conf!

如何使用本篇文章

  • 本文作为一篇高度总结和罗列nginx.conf中所有的基础配置项,循规蹈矩地按照文章的顺序阅读的方式不可取

  • 笔者建议所有读者,先看目录,掌握Nginx都有哪些基础的配置块,再想要了解那一个配置块时,再详细去看

  • 作为一篇字典类的文章,建议读者善用浏览器的全文查找功能,按Ctrl + F调出查找功能,搜索你感兴趣的关键字,针对性地学习

nginx.conf的基本结构

  • 配置文件一共由三部分组成,分别为全局块、events块和http块。

  • 在http块中,又包含http全局块、多个server块。

  • 每个server块中,可以包含server全局块和多个location块。

  • 在同一配置块中嵌套的配置块,各个之间不存在次序关系。

  • 牢牢把握住这张图,可以帮助初学者快速建立起对nginx.conf的初步印象。

nginx.conf文件在哪里?

  • 在windows平台下,该配置文件在其数据包的conf目录下

  • 在CentOS7平台,如果使用源码安装,则配置文件也在安装位置的conf目录下;如果使用yum安装,则配置文件在/etc/nginx/目录下

  • 全局查找nginx.conf文件:find / -name nginx.conf

配置文件的语法规则:

  • 配置文件由指令与指令块构成;

  • 每条指令以 ; 分号结尾,指令与参数间以空格符号分隔;

  • 指令块以 {} 大括号将多条指令组织在一起;

  • include 语句允许组合多个配置文件以提升可维护性;

  • 使用 # 符号添加注释,提高可读性;

  • 使用 $ 符号使用变量;

  • 部分指令的参数支持正则表达式;

全局配置块

设置一些影响Nginx服务器整体运行的配置指令,这些指令的作用域是Nginx服务器全局。

user

useruser [group];

  • user:指定可以运行Nginx的用户

  • group:指定可以运行Nginx的用户组(可选项)

如果user指令不配置或者配置为user nobody nobody,则默认所有用户都可以启动Nginx进程。

该属性也可以在编译的时候指定,语法如下`./configure --user=user --group=group`,如果两个地方都进行了设置,最终生效的是配置文件中的配置。

worker_processes

master_process on|of (默认on)

  • 是否以master/worker方式进行工作,在实际的环境中 nginx是以一个master进程管理多个worker进程的方式运行的。

  • 关闭后nginx就不会fork出worker子进程来处理请求,而是用master进程自身来处理请求,即使用"worker_processes number"所指定进程数;

worker_processes 个数;

  • 指定工作进程的个数,默认是1个。

  • 具体可以根据服务器cpu数量进行设置,比如cpu有4个,可以设置为4。

  • 如果不知道cpu的数量,可以设置为auto,nginx会自动判断服务器的cpu个数,并设置相应的进程数。

其他

daemon on|off (默认值on)

  • 是否以守护进程(脱离Terminal在后台运行)的方式运行nginx,关闭守护进程执行的方式可以让我们方便调试nginx

pid PID文件路径(例如:logs/nginx.pid);

  • 用来配置Nginx当前master进程的进程号ID存储的文件路径

  • 该属性可以通过`./configure --pid-path=PATH`来指定

error_log 文件路径 [日志级别];

  • 记录错误信息的日志

  • 日志级别的值有:debug|info|notice|warn|error|crit|alert|emerg,翻译过来为试|信息|通知|警告|错误|临界|警报|紧急

  • 建议大家设置的时候不要设置成info以下的等级,因为会带来大量的磁盘I/O消耗,影响Nginx的性能。

  • 该属性可以通过`./configure --error-log-path=PATH`来指定

events块

events块的主要功能:

  • 配置Nginx服务器与用户的网络连接。

  • 这一部分的指令对Nginx服务器的性能影响较大,在实际配置中应该根据实际情况灵活调整。

accept_mutex on | off;

  • 当某一时刻只有一个连接到来时,多个睡眠进程会被同时叫醒,但只有一个进程可获得连接。如果每次唤醒的进程数目太多,会影响一部分系统性能。

  • 默认是开启状态,开启后将会对多个Nginx进程接收连接进行序列化,防止多个进程对连接的争抢

multi_accept on|off;

  • 设置是否允许同时接收多个网络连接

  • 如果multi_accept被禁止了,nginx一个工作进程只能同时接受一个新的连接

worker_connections 数字;

  • 设置允许每一个worker process(工作进程)的最大连接数,当每个工作进程接受的连接数超过这个值时将不再接收连接

  • 默认值为512

  • 当所有的工作进程都接收满时,连接进入logback,logback满后连接被拒绝

use 网络IO模型;

  • method可选择的内容有:select、poll、kqueue、epoll、rtsig、/dev/poll以及eventport

  • 使用linux内核在6以上,就是为了能使用epoll,提高Nginx的性能

http块

http块主要定义与http服务相关的配置

http全局

include mime.types;

  • 包含进HTTP的ContentType

  • 可以自定义一些ContentType,包含进来

default_type application/octet-stream;

  • 配置默认响应类型,如果不加此指令,默认值为text/plain

  • 此指令还可以在http块、server块或者location块中进行配置

公有配置

add_header name value [always];

  • 功能:添加指定的响应头和响应值。

  • 位置:http, server, location

keepalive

keepalive_timeout timeout [header_timeout]

  • 配置连接超时时间,Nginx与用户建立会话连接后,超过多少时间后断开

  • 为什么要使用keepalive?

  • HTTP是一种无状态协议,客户端向服务端发送一个TCP请求,服务端响应完毕后断开连接。

  • 如果客户端在短时间内向服务端发送多个请求,对于每个请求都建立一个TCP链接,那么将会产生TCP连接爆炸

  • Keepalive指定了在一段时间内都保持连接状态,可以复用TCP链路

  • 例如:keepalive_timeout 120s 100s:下面配置的含义是,在服务器端保持连接的时间设置为120 s,发给用户端的应答报文头部中Keep-Alive域的超时时间设置为100 s。

  • 位置:http, server, location

keepalive_requests number;

  • 设置一个keep-alive连接使用的次数

  • 默认是100

  • 位置:http, server, location

resolver_timeout time;

  • 解析超时时间

  • 默认值:30s

  • 使用字段:http, server, location

  • 例子:resolver_timeout 5s;

静态资源优化配置

sendfile on | off(默认值);

  • 开启高效的文件传输模式

  • 等价于“0拷贝思想”

  • 位置:http, server, location

sendfile_max_chunk 数据量大小size(单位kb);

  • 设置sendfile最大数据量

  • size值如果大于0,Nginx进程的每个worker process每次调用sendfile()传输的数据量最大不能超过这个值(这里是128k,所以每次不能超过128k);如果设置为0,则无限制。默认值为0。

tcp_nopush on|off(默认值);

  • 该指令必须在sendfile打开的状态下才会生效,主要是用来提升网络包的传输'效率'

  • 主要思想:要发送的数据先放在缓冲区(no push),等缓冲区满了再发

  • 位置:http, server, location

tcp_nodelay on(默认值)|off;

  • 该指令必须在keep-alive连接开启的情况下才生效,来提高网络包传输的'实时性'

  • 主要思想:一有数据就发送,没有任何延时(no delay)

  • 位置:http, server, location

  • "tcp_nopush"和”tcp_nodelay“看起来是"互斥的",那么为什么要将这两个值都打开,这个大家需要知道的是在5.9以后的版本中两者是可以兼容的

  • 三个指令都开启的好处是,sendfile可以开启高效的文件传输模式,tcp_nopush开启可以确保在发送到客户端之前数据包已经充分“填满”, 这大大减少了网络开销,并加快了文件发送的速度。

  • 然后,当它到达最后一个可能因为没有“填满”而暂停的数据包时,Nginx会忽略tcp_nopush参数, 然后,tcp_nodelay强制套接字发送数据。

  • 由此可知,tcp_nopush可以与tcp_nodelay一起设置,它比单独配置tcp_nodelay具有更强的性能。

最佳实践:在http共有配置参数中全部开启

  • sendfile on;

  • tcp_nopush on;

  • tcp_nodelay on;

静态资源的压缩

功能:将Nginx服务中的静态资源进行压缩,再发送给Client(例如Chrome),减少网络传输量,提高传输速率和效率

基于ngx_http_gzip_module模块(已自动安装)的静态资源压缩

gzip on|off(默认);

  • 开启或者关闭gzip功能

  • 以下的gzip相关指令,只有gzip为on,才有效果

gzip_types mime-type ...;

  • 指定对那种类型的文件进行压缩

  • 多个类型之间使用空格隔开,可以使用通配符(*:表示全部类型)

  • 默认值:gzip_types text/html;

  • 例如:

http{
gzip on; #开启
gzip_types application/javascript; #指定对JS文件进行压缩
}

gzip_comp_level level;

  • 设置Gzip压缩程度,级别从1-9。数字越低,压缩程度越低,压缩效率越高

  • 默认值:gzip_comp_level 1;

gzip_vary on|off(默认值);

  • 用于设置使用Gzip进行压缩发送是否携带“Vary:Accept-Encoding”头域的响应头部。

  • 主要是告诉接收方,所发送的数据经过了Gzip压缩处理

gzip_buffers number size;

  • 指定处理请求压缩的缓冲区数量和大小。

  • 默认值:gzip_buffers 32 4k | 16 8k;

  • number:指定Nginx服务器向系统申请缓存空间个数,size指的是每个缓存空间的大小。

  • 主要实现的是申请number个每个大小为size的内存空间。这个值的设定一般会和服务器的操作系统有关,所以建议此项不设置,使用默认值即可。

gzip_disable regex ...;

  • 针对不同种类客户端发起的请求,可以选择性地开启和关闭Gzip功能。

  • 用来排除一些明显不支持Gzip的浏览器,例如排除IE:gzip_disable"MSIE [1-6]\.";

gzip_http_version 1.0|1.1(默认值);

  • 设定gzip支持的HTTP协议版本

gzip_min_length length;

  • 要发送的数据量超过了length,才会开启Gzip压缩功能

  • 默认值:gzip_min_length 20; #单位KB

gzip_proxied off(默认值) | expired | no-cache | no-store | private| no_last_modified | no_etag | auth|any;

  • 设置是否对服务端返回的结果进行Gzip压缩

  • off- 关闭Nginx服务器对后台服务器返回结果的Gzip压缩

  • expired- 启用压缩,如果header头中包含 "Expires" 头信息

  • no-cache- 启用压缩,如果header头中包含 "Cache-Control:no-cache" 头信息

  • no-store- 启用压缩,如果header头中包含 "Cache-Control:no-store" 头信息

  • private- 启用压缩,如果header头中包含 "Cache-Control:private" 头信息

  • no_last_modified- 启用压缩,如果header头中不包含 "Last-Modified" 头信息

  • no_etag- 启用压缩 ,如果header头中不包含 "ETag" 头信息

  • auth- 启用压缩 , 如果header头中包含 "Authorization" 头信息

  • any- 无条件启用压缩

综合实例

gzipon; #开启gzip功能

gzip_types*; #压缩源文件类型,根据具体的访问资源类型设定

gzip_comp_level6; #gzip压缩级别

gzip_min_length1024; #进行压缩响应页面的最小长度,content-length

gzip_buffers4 16K; #缓存空间大小

gzip_http_version1.1; #指定压缩响应所需要的最低HTTP请求版本

gzip_vary on; #往头信息中添加压缩标识

gzip_disable"MSIE [1-6]\."; #对IE6以下的版本都不进行压缩

gzip_proxied off; #nginx作为反向代理压缩服务端返回数据的条件

这个配置可能再多处都要使用,我们将其抽取为独立的配置文件,方便在多处进行“include”

Step1:vim %nginx所在目录%/config/my_config/gzip_config.conf

Step2:在Nginx主配置目录导入该文件:vim %nginx所在目录%/config/nginx.conf

Gzip和sendfile共存问题

背景

  • 在开启sendfile以后,在读取磁盘上的静态资源文件的时候,可以减少拷贝的次数,可以不经过用户进程将静态文件通过网络设备发送出去,但是Gzip要想对资源压缩,是需要经过用户进程进行操作的。

  • 如何解决两个设置的共存问题。

  • 解决方案

  • 可以使用ngx_http_gzip_static_module模块的gzip_static指令来解决。

  • 开启了gzip_static后,检查与访问资源同名的.gz文件时,response中以gzip相关的header返回.gz文件的内容。

安装ngx_http_gzip_static_module

  • 默认安装是没有安装ngx_http_gzip_static_module的,所以我们需要指定该模块重新安装。

  • 操纵步骤类似于Nginx的平滑升级

  • 主要思想:重新编译一个指定了该模块的后的二进制文件,替换掉原来的二进制文件即可

  • 具体步骤

  1. 查看以前Nginx的编译参数:nginx -V

  1. 备份以前安装目录中sbin下的二进制文件,防止安装失败后进行恢复:mv nginx nginx_old

  1. 进入数据包目录:cd /home/ks/nginx-版本号

  1. 清空之前编译的内容:make clean

  1. 指定安装参数:./configure --with-http_gzip_static_module

  1. 遍历:make

  1. 将objs目录下的nginx二进制执行文件移动到nginx安装目录下的sbin目录中:mvobjs/nginx /usr/local/nginx/sbin

  1. 执行更新命令:make upgrade #注意当前所在目录是在Nginx数据包目录下

语法:gzip_staticon | off(默认值) | always;

位置:http、server、location

测试

  1. 直接访问`http://192.168.200.133/jquery.js`

  1. 使用gzip命令进行压缩:gzip jquery.js

  1. 再次访问`http://192.168.200.133/jquery.js`

缓存

Nginx的web缓存服务主要是使用`ngx_http_proxy_module`模块相关指令集来完成

proxy_cache_path path[levels=number] keys_zone=zone_name:zone_size [inactive=time] [max_size=size];

  • 设置缓存文件的存放路径

  • 位置:http

  • 参数释义

  • path:缓存路径,例如:/usr/local/proxy_cache

  • levels:指定该缓存空间对应的目录,最多可以设置3层

  • levels=1:2 缓存空间有两层目录,第一次是1个字母,第二次是2个字母

  • 举例说明:

  • itheima[key]通过MD5加密以后的值为 43c8233266edce38c2c9af0694e2107d

  • levels=1:2 最终的存储路径为/usr/local/proxy_cache/d/07

  • levels=2:1:2 最终的存储路径为/usr/local/proxy_cache/7d/0/21

  • levels=2:2:2 最终的存储路径为??/usr/local/proxy_cache/7d/10/e2

  • keys_zone:为这个缓存区设置名称和指定大小。例如:keys_zone=itcast:200m 缓存区的名称是itcast, 大小为200M, 1M大概能存储8000个keys

  • inactive:指定缓存的数据多次时间未被访问就将被删除。例如:inactive=1d #缓存数据在1天内没有被访问就会被删除

  • max_size:设置最大缓存空间,如果缓存空间存满,默认会覆盖缓存时间最长的资源。例如:max_size=20g

  • 综合实例

http { #次配置在http块中
proxy_cache_path/usr/local/proxy_cache keys_zone=itcast:200m levels=1:2:1 inactive=1d max_size=20g;
}

proxy_cache zone_name | off(默认);

  • 用来开启或关闭代理缓存,如果是开启则需要指定缓存区的名称

  • zone_name:缓存区的名字

  • 位置:http、server、location

proxy_cache_key key;

  • 该指令用来设置web缓存的key值,Nginx会根据key值MD5哈希存缓存

  • 默认值:proxy_cache_key $scheme$proxy_host$request_uri;

  • 位置:http、server、location

proxy_cache_valid [code ...] time;

  • 该指令用来对不同返回状态码的URL设置不同的缓存时间

  • 位置:http、server、location

  • 例如

  • proxy_cache_valid200 302 10m; #响应为200和302的URL设置10分钟缓存

  • proxy_cache_valid404 1m; #响应为404的URL设置1分钟缓存

  • proxy_cache_validany 1m; #对所有响应状态码的URL都设置1分钟缓存

proxy_cache_min_uses number;

  • 该指令用来设置资源被访问多少次后被缓存

  • 默认值:proxy_cache_min_uses 1;

  • 位置:http、server、location

proxy_cache_methods GET|HEAD|POST;

  • 该指令用户设置缓存哪些HTTP方法

  • 默认值:proxy_cache_methods GET HEAD; #默认缓存HTTP的GET和HEAD方法,不缓存POST方法。

  • 位置:http、server、location

ResponseHeader中的缓存

expires [modified] time | epoch | max | off(默认值);

  • 功能:控制缓存

  • 参数

  • time:如果为整数或0,则表明指定有效期,Cache-Control的值为max-age=time;如果是负数,则表明即时失效,Cache-Control则为no-cache

  • epoch:指定Expires的值为'1 January,1970,00:00:01GMT'(1970-01-01 00:00:00),Cache-Control的值no-cache

  • max:指定Expires的值为'31 December2037 23:59:59GMT'(2037-12-31 23:59:59) ,Cache-Control的值为10年

  • off:默认不缓存。

  • 位置:http, server, location

Cache-Control:告诉所有的缓存机制是否可以缓存及哪种类型。

取值枚举

  • must-revalidate:可缓存但必须再向源服务器进行确认

  • no-cache:缓存前必须确认其有效性

  • no-store:不缓存请求或响应的任何内容

  • no-transform:代理不可更改媒体类型

  • public:可向任意方提供响应的缓存

  • private:仅向特定用户返回响应

  • proxy-revalidate:要求中间缓存服务器对缓存的响应有效性再进行确认

  • max-age=<秒>:响应最大Age值

  • s-maxage=<秒>:公共缓存服务器响应的最大Age值

通过add_header指控制Response Header中的数据。例子:设定响应头中Cache-Control为public:add_header Cache-Control public;

清除缓存

方式一:删除对应的缓存目录

方式二:使用第三方扩展模块(ngx_cache_purge,需要安装)

ngx_cache_purge安装过程

  1. 下载ngx_cache_purge模块对应的资源包:ngx_cache_purge-2.3.tar.gz

  1. 解压缩:tar -zxf ngx_cache_purge-2.3.tar.gz

  1. 修改文件夹名称,方便后期配置:mv ngx_cache_purge-2.3 purge

  1. 查询Nginx的配置参数:nginx -V

  1. 进入Nginx的安装目录,使用./configure进行参数配置:./configure --add-module=/root/nginx/module/purge

  1. 编译:make

  1. 备份以前的二进制文件:mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginxold

  1. 将编译后的objs中的nginx拷贝到nginx的sbin目录下:cp objs/nginx /usr/local/nginx/sbin

  1. 使用make进行升级:make upgrade

  1. 在nginx配置文件中进行如下配置

server{
    location ~/purge(/.*) {
        proxy_cache_purge itcast itheima;
    }
}
不缓存

proxy_no_cache string ...;

  • 该指令是用来定义不将数据进行缓存的条件

  • 位置:http、server、location

  • 配置实例:proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;

proxy_cache_bypass string ...;

  • 该指令是用来设置不从缓存中获取数据的条件。

  • 位置:http、server、location

  • 配置实例:proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment;

$cookie_nocache:指的是当前请求的cookie中键的名称为nocache对应的值

$arg_nocache和$arg_comment:指的是当前请求的参数中属性名为nocache和comment对应的属性值

实例:配置不缓存的资源

server{
    listen    8080;
    server_name localhost;
    location / {
        if ($request_uri ~ /.*\.js$){
           set $nocache 1;
        }
        proxy_no_cache $nocache $cookie_nocache $arg_nocache $arg_comment;
        proxy_cache_bypass $nocache $cookie_nocache $arg_nocache $arg_comment;
    }
}

log

access_log on/off;

  • 开启或关闭日志记录功能

  • 位置:http, server, location

access_log path[format[buffer=size]]

  • 指定access_log日志的文件格式

  • 默认值:access_log logs/access.log combined;

log_format name [escape=default\|json\|none] string....;

  • 指定日志的输出格式

  • 默认值:log_format combined "...";

gzip on | off;

开启关闭压缩日志文件

负载均衡

实现方式

  • 用户手动选择:在网站主页上面提供不同线路、不同服务器链接方式,让用户来选择自己访问的具体服务器,来实现负载均衡。

  • DNS轮询方式:采用简单轮询方法

每次访问,都需要情况DNS缓存(ipconfig/flushdns),才能看到效果

  • 第四层负载均衡:在OSI七层模型中的传输层,主要是基于IP+PORT的负载均衡

  1. 硬件:F5 BIG-IP、Radware等

  1. 软件:LVS、Nginx、Hayproxy等

  • 第七层负载均衡:在应用层,主要是基于虚拟的URL或主机IP的负载均衡

  1. 软件:Nginx、Hayproxy等

  1. 四层负载均衡数据包是在底层就进行了分发,而七层负载均衡数据包则在最顶端进行分发,所以四层负载均衡的效率比七层负载均衡的要高。

  1. 四层负载均衡不识别域名,而七层负载均衡识别域名。

  • 第二层负载均衡:在数据链路层基于mac地址来实现负载均衡

  • 第三层负载均衡:在网络层一般采用虚拟IP地址的方式实现负载均衡

  • 最佳实践:四层负载(LVS)+七层负载(Nginx)

第七层负载均衡
upstream 取个名字 {
   server 服务的域名或者IP地址 [paramerters]
   server 服务的域名或者IP地址 [paramerters] …  #可以配置多个服务
}
  • 定义一组用于负载均衡的服务器

  • 它们可以是监听不同端口的服务器,并且也可以是同时监听TCP和Unix socket的服务器。服务器可以指定不同的权重,默认为1。

  • 位置:http

paramerters-控制负载服务的状态

  • down:当前的server暂时不参与负载均衡。该状态一般会对需要停机维护的服务器进行设置。

  • backup:预留的备份服务器。当主服务器不可用时,将用来传递请求。

  • max_fails=number:设置允许请求代理服务器失败的次数,默认为1。

  • fail_timeout=time:设置经过max_fails失败后,服务暂停的时间,默认是10秒。

  • max_conns:限制最大的接收连接数

第七层的均衡策略

负载均衡策略

  • 轮询:默认方式

  • weight:权重方式

  • ip_hash:依据ip分配方式

  • least_conn:依据最少连接方式

  • url_hash:依据URL分配方式

  • fair:依据响应时间方式

weight:权重方式

  • weight=number

  • number默认为1,权重数据越大,被分配到请求的几率越大;

  • 该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的,所有此策略比较适合服务器的硬件配置差别比较大的情况。

ip_hash:依据ip分配方式

  • 当对后端的多台动态应用服务器做负载均衡时,ip_hash指令能够将某个客户端IP的请求通过哈希算法定位到同一台后端服务器上。

  • 这样,当来自某一个IP的用户在后端Web服务器A上登录后,在访问该站点的其他URL,能保证其访问的还是后端web服务器A。

  • 注意:这样无法保证100%负载均衡,因为可能所有IP都hash到了一台服务器上。此外,服务的权重将失效。

least_conn:依据最少连接方式

  • 最少连接,把请求转发给连接数较少的后端服务器。

  • 轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。

  • 此策略适合请求处理时间长短不一造成服务器过载的情况。

url_hash:依据URL分配方式

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器

fair:依据响应时间方式

  • 第三方模块提供的负载策略

  • 可以根据页面大小、加载时间长短智能的进行负载均衡。

第四层负载均衡

Nginx在1.9之后,增加了一个stream模块,用来实现四层协议的转发、代理、负载均衡等。stream模块的用法跟http的用法类似,允许我们配置一组TCP或者UDP等协议的监听,然后通过proxy_pass来转发我们的请求,通过upstream添加多个后端服务,实现负载均衡。

四层协议负载均衡的实现,一般都会用到LVS、HAProxy、F5等,要么很贵要么配置很麻烦,而Nginx的配置相对来说更简单,更能快速完成工作。

添加stream模块的支持

  • Nginx默认是没有编译这个模块的,需要使用到stream模块,那么需要在编译的时候加上`--with-stream`。

  • 完成添加`--with-stream`的实现步骤:

  1. 将原有/usr/local/nginx/sbin/nginx进行备份

  1. 拷贝nginx之前的配置信息

  1. 在nginx的安装源码进行配置指定对应模块 ./configure --with-stream

  1. 通过make模板进行编译

  1. 将objs下面的nginx移动到/usr/local/nginx/sbin下

  1. 在源码目录下执行 make upgrade进行升级,这个可以实现不停机添加新模块的功能

stream 取个名字 {
    server 服务的域名或者IP地址 [paramerters]
    server 服务的域名或者IP地址 [paramerters] …  #可以配置多个服务
}
  • 定义一组用于负载均衡的服务器

  • 它们可以是监听不同端口的服务器,并且也可以是同时监听TCP和Unix socket的服务器。服务器可以指定不同的权重,默认为1。

  • 位置:与http同级

实例

worker_processes  1;

events {
    worker_connections  1024;
}

stream {
        upstream redisbackend {
                server 192.168.200.146:6379;
                server 192.168.200.146:6378;
        }
        upstream tomcatbackend {
                server 192.168.200.146:8080;
        }
        server {
                listen  81;
                proxy_pass redisbackend;
        }
        server {
                listen    82;
                proxy_pass tomcatbackend;
        }
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    keepalive_timeout  65;

    
    server {
        listen       80;
        server_name  hackyle.com;
                
        location / {
            default_type text/html;
            return 200 "<h1>I am hackyle.com</h1>";
        }   
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

Nginx性能优化功能- Gzip压缩(大幅度提高页面加载速度)   Nginx开启Gzip压缩功能, 可以使网站的css、js 、xml、html 文件在传输时进行压缩,提高访问速度, 进而优化Nginx性能!  Web网站上的图片,视频等其它多媒体文件以及大文件,因为压缩效果不好,所以对于图片没有必要支压缩,如果想要优化,可以图片的生命周期设置长一点,让客户端来缓存。 开启Gzip功能后,Nginx服务器会根据配置的策略对发送的内容, 如css、js、xml... 阅读详情

相关推荐

用现代C++包装Nginx C API:RAII与智能指针实践指南

在C++高性能服务器开发中,内存管理与资源生命周期控制是核心挑战。RAII(资源获取即初始化)作为C++的核心范式,通过构造函数与析构函数自动管理资源,有效防止内存泄漏与资源泄露。智能指针(如unique_ptr、shared_ptr)进一步提供了自动化的内存所有权管理,结合类型安全与零开销抽象原则,显著提升了代码的健壮性与可维护性。这些技术在高并发、事件驱动的网络服务器开发中价值尤为突出,能够简化复杂的异步回调与资源释放逻辑。Nginx作为高性能Web服务器与反向代理的事实标准,其C语言API在提供极致性

long_yu2的专栏 495

nginx config 详解

nginx config 的整体布局如下 ... #全局块 events { #events块 ... } http #http块 { ... #http全局块 server #server块 { ... #server全局块 location [PATTERN] #location块 { ... }

fajing_feiyue的博客 1万+

XGBoost模型生产化:从Notebook到Docker+Flask+Nginx服务

机器学习模型部署本质上是计算逻辑、数据契约与运行时约束的三重对齐。理解模型序列化原理(如XGBoost JSON格式替代Pickle)可规避反序列化安全风险与跨环境兼容问题;掌握服务封装核心——输入强校验、预处理解耦、结构化输出与分级错误码——是保障API稳定性的技术基础。其工程价值在于将不可控的模型智能,转化为可观测、可灰度、可回滚的确定性服务。典型应用场景包括金融风控评分、电商实时推荐及IoT边缘推理等对延迟、安全与可维护性有严苛要求的线上业务。本文聚焦轻量级技术栈落地路径,覆盖模型固化、Flask服务

dianan0938的博客 428

Nginx【config结构和常用配置】

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,它的低开销高性能的优势,在现在的服务器部署工具中,仍是绝对的主流。

qq_32019935的博客 3172

Qwen3.6 OpenAI兼容反代:Nginx+Lua协议桥接实战

大模型API网关的核心是协议兼容性,而非简单流量转发。OpenAI API作为行业事实标准,其/v1/chat/completions接口规范(含messages结构、stream流式响应、usage字段、HTTP状态码语义等)已成为各类AI工具链的接入前提。Qwen3.6作为主流开源大语言模型,原生接口与OpenAI存在七处关键差异,需通过协议翻译层实现字段映射、role标准化、delta重构与rate limit透传。本文聚焦Nginx+OpenResty+Lua技术栈,构建轻量、高性能、生产就绪的反向

weixin_34337381的博客 308

Nginx:配置文件的位置及组织简述

Nginx的默认配置文件都保存在/etc/nginx/目录下,编辑起来需要root用户权限,为了便于使用,可以将业务文件保存在用户自己的目录下,然后通过include将其导入。但是这种操作后,需要配置全局块的user为适当的, 以便于其拥有读取业务文件。

风静如云的博客 5615

Nginx基础03:配置文件nginx.conf(Part2)

如何定义Nginx对Web服务的控制,需要通过nginx.conf这个配置文件。

极客-多重人格递归 707

深入解析SGLang框架:从架构设计到核心组件实现

本文深入解析了SGLang框架的架构设计与核心组件实现。SGLang是一个专为大语言模型推理设计的高效框架,其核心优势在于清晰的分层架构、高效的调度策略以及精细的内存管理。文章详细剖析了其客户端接入、服务器端调度、模型执行引擎及Tokenizer/Detokenizer管理器等关键组件,揭示了其实现高性能推理的内部机制。

coffee的博客 576

part1__ubuntu20.04安装Nginx

Nginx是一个免费的开源Linux应用程序,用于Web服务器。它通过将Web流量定向到特定服务器来充当反向代理服务器。Nginx用于安全和负载平衡,但也可以作为Web服务器独立运行。Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。

计算机知识技术 451

单目和多目视觉统一标定

单目和多目视觉统一标定 一.单目视觉标定 在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为相机标定(或摄像机标定)。无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。因此,做好相机标定是做好后续工作的前提,提高标定精度是科研工作的重点所在

吴建明wujianming_110117 2911

自适应动态规划硕士博士论文学习

强化学习关注随机过程中的序贯决策问题,而自适应动态规划关注动态系统的控制问题。吸引域:系统渐近稳定的区域。

DarlingLSA的博客 1425

Nginx 简介和入门 - part1

包含了所有nginx的配置文件– 主配置文件在 Nginx 中,/etc/nginx/conf.d 目录用于存储自定义的配置文件片段。这些配置文件片段通常以 .conf 扩展名结尾,并包含了特定的 Nginx 配置指令和块,用于配置服务器的不同方面。当 Nginx 启动时,它会加载主配置文件(通常为 /etc/nginx/nginx.conf),并在主配置文件中包含 /etc/nginx/conf.d 目录中的所有配置文件片段。

nvd11的专栏 1214

Python 爬虫实战:爬取今日头条文章与阅读量数据

本文详细介绍了基于Python爬取今日头条文章与阅读量数据的完整方案。通过分析今日头条API接口,采用Requests+正则表达式技术实现数据抓取,重点解决加密参数构造、请求头模拟、反爬规避等核心问题。文章包含文章列表获取、详情数据提取、互动数据采集等完整流程,并提供数据存储与基础分析方法。同时强调合规使用爬虫技术,控制爬取频率,避免干扰平台运营。该方案可为内容传播分析、用户兴趣研究提供数据支持,但需注意接口参数更新和反爬机制变化,适时调整代码实现。

2503_91057718的博客 2519

Nginx part2.1

进入编辑页面后,找到server这一栏,对下面的root进行更改,将其更改为我们要是用的html文件所在的位置,由于此处是做一个目录网页,所以其就像以前的视频网站里的下载位置一样,只有资源,没有其他的广告啥的,只管点击下载,下载完后就可以拿进被子里看的那种网站。然后修改完后,需要进行重启nginx来启动刚刚的修改:systemctl restart nginx,如果报错,则是语法出错,或者找不到文件。首先如果要用nginx做网页,之前就说了只需将nginx自带的网页进行更改即可,即进入其主文件进行编辑。

SuperBigToilet的博客 381

高通 vs MTK vs 海思:三大平台 ISP 架构横向对比与实战差异分析

随着移动影像能力成为智能终端差异化竞争的核心维度,ISP(Image Signal Processor)架构日益重要。高通、MTK、海思三大 SoC 厂商在 ISP 设计上各具特色,不仅在图像处理链路、模块集成度、算法加速路径等方面存在显著差异,同时也决定了终端厂商在成像质量、调试复杂度与扩展能力上的实际表现。本文将基于真实平台项目经验,横向对比三大主流平台的 ISP 架构关键指标,系统分析其在实际开发过程中的能力边界、工程成本与调优空间,帮助工程师更精准地进行平台选型与优化策略制定。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3926

2026滑块验证码终极实战:缺口检测算法+人机轨迹模拟,识别率从60%飙升至95%全方案

**摘要:2026年AIGC技术发展导致传统验证码失效,滑块验证码成为主流防护手段。本文深入分析了传统方案识别率低的原因,并提出多级检测融合和行为拟合优化方案。通过图像预处理优化、三级缺口检测引擎(差分图像法、Hu矩轮廓匹配、YOLOv8n模型兜底)将识别率提升至99.2%。同时针对轨迹模拟环节,设计了包含抖动特征、时间随机性和个体差异的行为模型,使通过率从12%提升至87%。该方案解决了传统方法在缺口定位精度和轨迹真实性方面的核心痛点,为应对新一代验证码风控提供了完整的技术框架。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1898

Nginx part2.2

有些网站,ip不同,域名不同,网页内容也不一样,可能会以为背后是在访问多个主机,实则是一个,因为现在的电脑都可以安装虚拟机,用MacBook的人就知道,有时候想打游戏,结果游戏不支持Mac,支持Windows,此时要做的就是下个虚拟机,将游戏放在虚拟机上运行,虽然Mac会烫,但你打游戏的心可不会凉,同理,虚拟机也可以有IP地址,跟本主机的ip地址不一样,所以要用到虚拟主机功能,用户就可以用不同的ip、端口、域名来进行访问。

SuperBigToilet的博客 846

Python编程基础05:运算符与表达式

文章目录一、算术运算符1、分类说明表2、注意事项3、案例演示任务1、计算成绩差与平均成绩课堂练习:编程处理带余除法。任务2、打印购物小票 运算符就是专门用于告诉程序执行特定运算或逻辑操作的符号。表达式是指由常量、变量和运算符组成的一个算式。编写程序对数据进行处理,其实处理就是对数据实施各种各样的运算,搞懂运算符与表达式是我们编写程序的基础性工作,本次讲课笔记通过案例讲解各种运算符的用法以及正确书写Python表达式的注意事项。 一、算术运算符 Python中的算术运算符就是用来处理四则运算的符号,也是

howard2005的专栏 3119

C++封装Nginx HTTP请求转发引擎:从C API到现代C++的优雅转型

在Web服务器和高性能网关开发中,Nginx凭借其卓越的事件驱动模型和高效的网络I/O处理能力,成为处理静态资源、反向代理和负载均衡的首选。其核心原理基于多进程架构和异步非阻塞设计,能够支撑极高的并发连接数。然而,当业务逻辑需要深度定制,如实现动态路由、复杂鉴权或与外部服务发现系统集成时,原生Nginx配置的声明式语法和Lua脚本在表达复杂逻辑和性能上存在局限,而直接开发C模块又面临高门槛和低开发效率的挑战。这催生了将现代C++(C++11/14/17)引入Nginx扩展开发的技术价值,旨在通过面向对象封装

weixin_30258901的博客 443

【ArcGIS Pro微课1000例】0073:ArcGIS Pro3.5.2学习版下载及安装教程

ArcGIS Pro 3.5.2安装教程摘要:系统需Windows10及以上,8GB内存(推荐32GB)。安装步骤:1)安装.NET 8.0运行环境;2)执行主程序安装包,按向导完成基础安装;3)安装升级补丁;4)替换AfCore.dll文件并导入注册表。注意安装后删除临时文件节省空间。软件下载地址包含在百度网盘链接。安装过程需依次完成环境配置、主程序安装、补丁更新及破解步骤。

智慧空间实验室 1772

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Ubuntu 20.04 编译安装 Nginx ModSecurity WAF 全流程指南

Web应用防火墙(WAF)是保障Web应用安全的关键组件,通过在应用层对HTTP/HTTPS流量进行深度检测,有效防御SQL注入、跨站脚本(XSS)等常见攻击。其核心原理是基于规则引擎,对请求和响应内容进行模式匹配与行为分析。在开源方案中,ModSecurity作为一款成熟的WAF引擎,因其强大的规则扩展能力和与Nginx等主流Web服务器的深度集成能力而备受青睐。通过编译安装的方式部署ModSecurity,不仅能确保与现有Nginx环境的完美兼容,还能及时应用最新的安全规则和性能优化,实现对WAF模块的

weixin_33725722的博客 450

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

nginx "proxy_pass" cannot have URI part in location given by regular expression

PS:我是在配置nginx可以访问tomcat下面的资源文件的时候,出现了这个问题,看到这篇文章,在给nginx配置正则表达式的时候proxy_pass是不可以有uri的。 在windows中使用nginx时报错: C:\TDDOWNLOAD\nginx-1.6.0\nginx-1.6.0>nginx.exe -s reload nginx: [emerg] "proxy_pas

cxm19881208的专栏 7万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Nginx文件上传模块实战:高性能配置与优化

文件上传是Web开发中的基础功能,传统后端处理方案常面临性能瓶颈。Nginx作为高性能Web服务器,通过nginx-upload-module模块实现了零拷贝技术、磁盘缓冲和非阻塞处理等核心机制,显著提升文件上传效率。该方案采用TCP层直接操作数据流,避免应用层内存拷贝,配合事件驱动模型可支持10万级并发。在技术实现上,模块支持动态编译加载,提供文件类型过滤、病毒扫描等安全配置,并能与S3等分布式存储无缝集成。对于开发者而言,掌握upload_store权限控制、client_max_body_size等关

weixin_30314813的博客 523

Nginx 7大核心数据结构实战指南:array/list/红黑树/radix_tree一网打尽(annotated_nginx注解)

**Nginx 核心数据结构**是理解 Nginx 高性能原理的钥匙。本文基于 annotated_nginx 项目(逐行中文注解的 Nginx 源码),带你快速读懂 Nginx 源码中最重要的 **7 大核心数据结构**:内存池、动态数组、链表、队列、红黑树、radix 树和哈希表——搞懂它们,你就掌握了 Nginx 处理百万级并发连接背后的"数据骨架"。 [![Nginx核心数据结构与多进程

gitblog_01164的博客 316

Nginx源码分析(1)之——共享内存的配置、分配及初始化

Nginx源码分析(1)之——共享内存的配置、分配及初始化

hnudlz的专栏 3544

nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside ...

1、修改nginx.conf后,重启时报错 2、错误原因 如果location或if中用到了正则,则不能再转发除ip:port外的路径请求

zwtwbb的专栏 4060
上一篇: Nginx基础01:安装和基本使用
下一篇: Nginx基础03:配置文件nginx.conf(Part2)
ALGO阿狗
博客等级 码龄9年 64粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值