找回密码
 加入怎通
查看: 281|回复: 9

Nginx 配置文件详解(nginx配置文件server_name)

[复制链接]
我来看看 发表于 2023-03-20 02:35:05 | 显示全部楼层 |阅读模式
) ^2 N3 n0 [* }: m0 }. m6 e% z4 k

本文章来自网络Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名Nginx是一款轻量级的Web 服务器/反向代理服务器,其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

1 H' Z& J% m& [, @, }5 T$ s/ Z

下面我们就来详细介绍下nginx的常用配置,该配置均为我们生产环境中检验过的,大家可放心使用如在使用过程中遇到问题或者疑惑,可以在我们的网站下留言,我们会尽快回复一、主配置文件user nobody nobody; #nginx用户、用户组

, v7 D" u& I* \! {" B4 n- y/ s

worker_processes 8; #开启8个工作进程worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; #0001表示启用第一个CPU内核,0010表示启用第二个CPU内核,依此类推

6 x) v- ]1 t# D' r

error_log logs/error.log; #错误日志存放路径 #error_log logs/error.log notice;#error_log logs/error.log info;pid logs/nginx.pid; #pid文件存放路径

6 ~0 [. A2 `8 b

worker_rlimit_nofile 100000; #指定进程可以打开的最大描述符号,这个指令是指当一个nginx进程打开的最多文件描述符数量,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是很均匀,建议与ulimit -n的值保持一致。

5 `2 d6 ~. N2 T0 M. M

当然设置比ulimit -n大也可以,设置后你的操作系统和Nginx可以处理比ulimit -n更多的文件google_perftools_profiles /tmp/tcmalloc; # google-perftools中TCMalloc库在内存分配效率和速度上要高很多,这在很大程度上提高了服务器在高并发情况下的性能,从而降低系统负载

; T5 _9 d; r5 m# C4 B

events {use epoll; #使用epoll的I/O 模型linux建议epoll,FreeBSD建议采用kqueue#accept_mutex off; #multi_accept on;worker_connections 100000; #每个工作进程的最大连接数量。

7 G! Y, x2 Q: {# T0 A) b- S( b) h

根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections。

3 i1 w' C* d) o! c+ ~- \

}http { #nginx代理http协议,还可以代理ftp/mail等协议 include mime.types; #设定mime类型,类型由mime.type文件定义default_type application/octet-stream;

t" g Y) M) ~6 H5 |7 M

log_format main $http_x_forwarded_for - "$upstream_cache_status" $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $remote_addr ;

4 q% V# n/ ~5 j) [ x: y: W

#log_format log1 $realip - "$upstream_cache_status" $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $remote_addr;

7 }8 ~0 \- O ?! P; L" ^: n

#日志格式设置$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;$remote_user:用来记录客户端用户名称;$time_local: 用来记录访问时间与时区;

+ w2 u7 |5 Q( e; Y }* x

$request: 用来记录请求的url与http协议;$status: 用来记录请求状态;成功是200,$body_bytes_sent :记录发送给客户端文件主体内容大小;$http_referer:用来记录从那个页面链接访问过来的;

' P1 N1 \+ e, W _

$http_user_agent:记录客户浏览器的相关信息;通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。

, t2 W. N; {3 Z# z. j. _: ?

#access_log logs/access.log main;sendfile on; #使用高效的文件传输,可以让sendfile()发挥作用sendfile()可以在磁盘和TCP socket之间互相拷贝数据(或任意两个文件描述符)。

9 m5 {/ X& s7 I. U$ c

Pre-sendfile是传送数据之前在用户空间申请数据缓冲区之后用read()将数据从文件拷贝到这个缓冲区,write()将缓冲区数据写入网络sendfile()是立即将数据从磁盘读到OS缓存因为这种拷贝是在内核完成的,sendfile()要比组合read()和write()以及打开关闭丢弃缓冲更加有效。

+ \6 W# u3 E8 Z8 ^1 E

tcp_nopush on; #防止TCP阻塞, 告诉nginx在一个数据包里发送所有头文件,而不一个接一个的发送 tcp_nodelay on; #告诉nginx不要缓存数据,而是一段一段的发送--当需要及时发送数据时,就应该给应用设置这个属性,这样发送一小块数据信息时就不能立即得到返回值。

* `' r; j( n8 m$ i1 y( C9 m

server_tokens off; #彻底隐藏nginx版本号,提高安全性#charset utf-8;keepalive_timeout 75; #保持连接超时时间gzip on; #是否启用压缩功能,实时压缩输出数据流

( `5 y0 m6 G" ^* y. @1 A9 q3 A

gzip_min_length 1k; #允许压缩的页面的最小字节数,建议设置成大于 1K 的字节数 ( 页面字节数从header 头的Content-Length 中获取的,默认值为 0 ,不管页面多大都进行压缩)

8 u/ u, G5 B7 r# r, U( |

gzip_buffers 4 16k; # 申请4 个单位为 16K 的内存作为压缩数结果的缓存(默认是申请与原始数据大小相同的内存空间来存储gzip的压缩结果)gzip_http_version 1.0; #设置识别HTTP协议的版本,默认是1.1,大部分浏览器已经支持gzip解压。

+ }# j1 W6 Y+ z( a% W+ a

gzip_comp_level 3; #设置压缩比(1 压缩比最小,9 压缩比最大)gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php image/jpeg image/gif image/png application/xml; #指定压缩的类型(无论是否指定, "text/html" 类型一定是会被压缩的)

# I5 b) k& g) n, a& y

#gzip_vary on; #可以让前端缓存服务器缓存经过 gzip 压缩的页面,如:Squidserver_names_hash_bucket_size 128; #保存服务器名字的hash表是由指令

' h* S& h2 {- m: Z1 a' a

server_names_hash_max_size 和server_names_hash_bucket_size所控制的参数hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。

0 p6 `4 D, k' y$ l- u: |+ l! U( r

在减少了在内存中的存取次数后,使在处理器中加速查找hash表键值成为可能如果hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,最坏的情况下在内存中查找的次数为2第一次是确定存储单元的地址,第二次是在存储单元中查找键 值。

, b* U% _9 g4 s8 C6 s* _' w$ w8 [# G

因此,如果Nginx给出需要增大hash max size 或 hash bucket size的提示,那么首要的是增大前一个参数的大小.fastcgi_intercept_errors on; #这个指令指定是否传递4xx和5xx错误信息到客户端,或者允许nginx使用error_page处理错误信息。

B4 e& x( C) o- D: I

client_max_body_size 50m; #允许客户端请求的最大单文件字节数client_body_buffer_size 512k; #指定用户请求体所使用的buffer的最大值client_header_buffer_size 32k; #设置用户请求头所使用的buffer大小

8 R# R/ |+ v! v& z) k% j

large_client_header_buffers 4 32k; #注意:(1)对绝大多数请求来说,1k足以满足请求头所需的buffer;(2)对于携带有较大cookie或来自于wap用户的请求头来说,1k的buffer一般不够,这时可以使用指令

$ E, T* K: I& x# [

large_client_header_buffers#proxy_ignore_client_abort on;proxy_connect_timeout 10s; #nginx跟后端服务器连接超时时间(代理连接超时)。

. d1 W! A* N0 [

proxy_read_timeout 60s; #连接成功后,后端服务器响应时间(代理接收超时)proxy_send_timeout 60s; #后端服务器数据回传时间(代理发送超时)proxy_buffer_size 16k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小

4 I, l; l% N9 W- }# t

proxy_buffers 4 64k; # proxy_buffers缓冲区,网页平均在64k以下的话,这样设置proxy_busy_buffers_size 128k; #高负荷下缓冲大小proxy_temp_file_write_size 128k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传

+ @% c, a1 r+ q$ K( F% n- c# W

proxy_temp_path /dev/shm/nginx_temp_mem; #代理缓存目录open_file_cache max=204800 inactive=20s; #这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。

2 l) F8 @. f1 H' F$ ~5 I2 d

open_file_cache_min_uses 1; # open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除

+ s) Y4 Z m$ E5 R

open_file_cache_valid 30s; #这个是指多长时间检查一次缓存的有效信息#limit_req_zone $binary_remote_addr zone=allips:10m rate=5r/m; #速率限制。

3 U) k3 q t* L

#limit_req_zone $http_x_forwarded_for zone=allips:100m rate=1r/m;server {server_name _; #defaultreturn 403;

4 _' G& o( L$ x4 o7 |

access_log off;} #禁止IP直接访问80端口或者禁止非本站的域名绑定我们的IP################# demoproject #################### include nginx-demo.conf; #虚拟主机配置,每个虚拟主机写个单独配置文件,便于管理

" \! G0 U& h7 Q( D# w

} 二、子配置文件[user@www conf]$ cat nginx-demo.confproxy_temp_path /dev/shm/nginx_temp_mem; # 指定存放的缓存目录proxy_cache_path /dev/shm/nginx_cache_mem/www levels=2:2 keys_zone=cache_nginx_www:200m max_size=5000m inactive=3d;

2 a3 N9 a1 ]+ P9 ], X, Q5 E4 }

proxy_cache_path /tmp/cache_dir1/www levels=1:2:2 keys_zone=danye_s:8000m max_size=2000G inactive=5d; #指定缓存的路径;levels=1:2:2 代表第一级目录有16个目录;第二级有256个,第三级也是有256个;所有活动的key和元数据存储在共享的内存区域中,这个区域用keys_zone参数指定,内存占据8000m;最大的磁盘占用空间为2000G;inactive=5d 如果在 inactive参数指定的5天内缓存的数据没有被请求则被删除;

* Q3 x9 w/ ?: d3 M) J

upstream www_demo_com #代理被调用的名称为:www_demo_com { server 192.168.1.100:8080 max_fails=3 fail_timeout=30s weight=2;

+ E; |9 V6 B) K3 |, t* m# h

server 192.168.1.101:8080 max_fails=3 fail_timeout=30s weight=3; #max_fails = NUMBER - 在一定时间内(这个时间在fail_timeout参数中设置)检查这个服务器是 否可用时产生的最多失败请求数,默认为1,将其设置为0可以关闭检查;

+ v( c0 M: e5 Y# E4 k

weight = NUMBER - 设置服务器权重,默认为1; fail_timeout = TIME - 在这个时间内产生了max_fails所设置大小的失败尝试连接请求后这个服务 器可能不可用,同样它指定了服务器不可用的时间(在下一次尝试连接请求发起之前)

& w: ^7 e8 b$ r5 I S% \

} geo $whiteiplist { #白名单default 1;8.8.8.8 0;127.0.0.1 0; }map $whiteiplist $limit { 1 $binary_remote_addr;

0 k! o0 @2 d6 p% j

0 "";}limit_conn_zone $limit zone=wwwperip:10m; #连接数限制limit_req_zone $limit zone=www:10m rate=50r/s; #访问速率限制

" d2 E8 A; y w, y

server{ server_name demo.com; rewrite "^/(.*)$" http://www.demo.com/$1 permanent; access_log off; }server

* [- C) B* U1 u5 x2 H5 S

{ listen 80; server_name www.demo.com; # 配置访问的主机名proxy_set_header Host $host; #但是如果这个字段在客户端的请求头中不存在,那么不发送数据到被代理服务器。

9 O, j+ H$ c+ s$ C: u

这种情况下最好使用$Host变量,它的值等于请求头中的"Host"字段或服务器名,$host, 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;proxy_set_header X-Real-IP $remote_addr; #$remote_addr, 客户端地址

: D- H5 @9 w/ `& n# G. V7 D

proxy_set_header X-Forwarded-For $remote_addr; #X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项

) B2 F% J _. @/ t* ~; P

set $realip ""; if ($proxy_add_x_forwarded_for ~ "^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)") { set $realip $1;

7 R. n0 M! w* ~

} if ($proxy_add_x_forwarded_for = "^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)") { set $realip $proxy_add_x_forwarded_for;

( X7 g; U5 p4 l6 l+ u

} proxy_set_header ipip $realip; #proxy_set_header X-Forwarded-For $realip;proxy_set_header Accept-Encoding ;

: V" O$ }2 v7 g+ K& f

proxy_ignore_headers "Set-Cookie" "Expires" "Cache-Control" "X-Accel-Redirect" "X-Accel-Expires"; #nginx缓存分成两部分,一部分是key,一部分是value;浏览器会有个cookie等会影响key的生成值。

' q1 H' \* o, n* Q4 P

所以忽略掉这些cookie以及一些头部信息,使相同的页面生成的key值一样,促使命中率的提升limit_conn wwwperip 20; limit_req zone=www burst=120;limit_rate_after 500k;

e2 {) ?7 w- g! H# j- J

limit_rate 300k;#Nginx的http核心模块ngx_http_core_module中提供limit_rate这个指令可以用于控制速度,limit_rate_after用于设置http请求传输多少字节后开始限速。

3 r( g# b6 T; b) K' _

另外两个模块ngx_http_limit_conn_module和ngx_http_limit_req_module分别用于连接数和连接频率的控制location = /robots.txt {root /var/www/html/www.demo.com;。

: X( w+ _2 Q- a0 F! a

}location ~ /purge_s(/.*) { proxy_cache_purge danye_s $host$1$is_args$args; } location ~ ^/(s|g|q)([0-9]*)\.html$

6 A9 _7 T" \% d/ k6 w% |9 l

{ expires 1h; # 指定浏览器缓存时间为1小时,以减少不必要的请求;proxy_cache danye_s; #指定使用哪个keys_zone;proxy_cache_valid 200 304 7d; #配置nginx cache中的缓存文件的缓存时间;对于状态为200和304的缓存文件的缓存时间是7天,7天之后再访问该缓存文件时,文件会过期,从而去源服务器重新取数据;

c2 Q; U5 E9 H* J/ {9 z; A

proxy_cache_key $host$uri$is_args$args; #以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内;proxy_hide_header Vary; #隐藏vary信息,这样,cache层就好处理多了,命中率也能有很大提升

0 Z. C2 v8 ?+ g [5 X& @

proxy_pass http://www_demo_com; proxy_cache_min_uses 2; #多少次的查询后应答将被缓存add_header Cache "$upstream_cache_status";

' O6 U4 P: l% u5 H: `' `( c7 j4 }6 |

} location ~ ^/wap/sendVerifyCode.shtml(.*) #访问速率限制{limit_req zone=allips_2 burst=1 nodelay; proxy_pass http://www_demo_com;

& L1 D9 N( J3 s R

}location ~ ^/wap/account!sendVerifyCode.do(.*) #拒绝指定地址访问{if ( $http_x_forwarded_for ~ 100.100.100.101|100.100.100.100 ){

3 g0 L- C7 A6 ?. x# |

return 403;} location ~ ^/plane/app { rewrite "/plane/(.*)" /$1 break; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr;

( h( |" j& C. @$ m" v

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Cookie $http_cookie; proxy_pass http://www_demo_com;

( q' S! X1 Y. r5 O5 Q

}location ~ ^/plane/ {rewrite "/plane/(.*)" /$1 break;proxy_set_header Referer $http_referer;proxy_set_header Cookie $http_cookie;

- @+ L/ R; e. S2 |

proxy_pass http://www_demo_com;}location ~ .*\.(png|gif|jpg|jpeg|bmp|ico|js|css|swf)$ #关闭图片日志记录,减少日志写入

* ~' {" p* n2 u+ O$ R1 i9 G

{expires 30m;proxy_cache cache_nginx_www;proxy_cache_valid 200 304 1h;proxy_cache_valid any 1m;proxy_cache_key $host$uri$is_args$args;

) v& a6 Q$ _6 _8 }: w

proxy_redirect off;proxy_hide_header Vary;proxy_pass http://www_demo_com;add_header Cache "$upstream_cache_status";

8 n. B6 P* [; }

access_log off;}location ~* ^/nginx-status { #开启nginx状态模块stub_status on;allow 192.168.0.0/18;deny all;

$ f- f" s0 [, N- R0 p

access_log off;}location ~ ^/(WEB-INF)/ {deny all;}location ~ .*\.svn/(.*){deny all;}location / { proxy_pass http://www_demo_com;

6 A+ o, r% |( _+ I, b4 c' x. e

} error_page 404 500 502 /404.htm; location = /404.htm { proxy_pass http://www_demo_com; } access_log logs/www.access.log main;

0 G* v- M0 D6 }: s+ W: y

error_log logs/www.error.log; }

4 j+ v# I7 R2 J: k. A5 D: T2 i' L ! |) o9 }* C. U+ ]# |/ w! S* ^! J3 A- M9 c! O 4 p* _4 {5 x" g( y ) Q' F5 Y; K; `5 X7 p& M _

暂时无法加载帖子列表

回复

使用道具 举报

qq787785058 发表于 2026-01-10 08:11:32 | 显示全部楼层
说得很实在,没有夸大其词,这种真实分享太难得了
回复

使用道具 举报

丫头 发表于 2026-01-10 15:21:04 | 显示全部楼层
楼主辛苦了,整理这么多内容,必须点赞收藏
回复

使用道具 举报

戴草帽的王子 发表于 2026-03-14 09:51:52 | 显示全部楼层
楼主太厉害了,整理得这么详细,必须支持
回复

使用道具 举报

小米 发表于 2026-03-14 17:14:24 | 显示全部楼层
刚好遇到类似问题,看完这个帖子心里有底了
回复

使用道具 举报

qzl520 发表于 2026-08-30 13:41:04 | 显示全部楼层
内容很干货,没有多余的废话,值得反复看
回复

使用道具 举报

leonseo444 发表于 2026-09-01 13:06:57 | 显示全部楼层
这个分享太实用了,刚好能用到,感谢楼主!
回复

使用道具 举报

西万路小混混 发表于 2026-09-04 22:26:20 | 显示全部楼层
蹲了这么久,终于看到有价值的讨论,支持一下!
回复

使用道具 举报

韩韩 发表于 2026-09-05 09:31:15 | 显示全部楼层
完全赞同,我也是这么认为的,英雄所见略同~
回复

使用道具 举报

蝌蚪 发表于 2026-09-11 13:05:47 | 显示全部楼层
分析得很透彻,很多细节都说到点子上了~
回复

使用道具 举报

    您需要登录后才可以回帖 登录 | 加入怎通

    本版积分规则

    QQ|手机版|小黑屋|网站地图|真牛社区 ( 苏ICP备2023040716号-2 )

    GMT+8, 2026-10-1 09:06 , Processed in 0.046793 second(s), 24 queries , Gzip On.

    免责声明:本站信息来自互联网,本站不对其内容真实性负责,如有侵权等情况请联系420897364#qq.com(把#换成@)删除。

    Powered by Discuz! X3.5

    快速回复 返回顶部 返回列表