[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"knowledge-\u002Fapi\u002Fknowledge\u002Fbooklet\u002Fuphold\u002Fnginx\u002Fconfig":3,"knowledge-related-\u002Fknowledge\u002Fbooklet\u002Fuphold\u002Fnginx\u002Fconfig":1240,"knowledge-series-\u002Fknowledge\u002Fbooklet\u002Fuphold\u002Fnginx\u002Fconfig":1266},{"source":4,"connector":5,"page":6},"sqlite","better-sqlite3",{"path":7,"title":8,"description":9,"category":10,"tags":11,"date":14,"pinned":15,"draft":15,"body":16,"seo":1236,"stem":1237,"id":1238,"extension":1239},"\u002Fknowledge\u002Fbooklet\u002Fuphold\u002Fnginx\u002Fconfig","配置文件结构与语法","下面我们深入到 Nginx 的配置核心——配置文件的结构、语法和变量系统。这一部分是你驾驭 Nginx 的“语法手册”。","技能小册",[12,13],"nginx","config","2023-11-24",false,{"type":17,"value":18,"toc":1229},"minimark",[19,22,25,30,38,177,276,279,283,288,291,300,303,323,329,333,340,510,529,531,535,540,544,564,573,577,580,702,705,707,711,714,718,878,889,916,920,1021,1025,1176,1182,1186,1225],[20,21,8],"h1",{"id":8},[23,24,9],"p",{},[26,27,29],"h3",{"id":28},"一分层结构从全局到局部","一、分层结构：从全局到局部",[23,31,32,33,37],{},"Nginx 的配置文件采用",[34,35,36],"strong",{},"块指令","嵌套的树形结构，理解从外到内的层次是阅读和编写配置的基础。",[39,40,44],"pre",{"className":41,"code":42,"language":12,"meta":43,"style":43},"language-nginx shiki shiki-themes material-theme-lighter github-light github-dark","# 1. 全局块 (main context)\n...                      # 影响服务器整体运行的指令\n\nevents {                 # 2. events 块\n    ...                  # 控制连接处理方式\n}\n\nhttp {                   # 3. http 块\n    ...                  # HTTP 模块的全局配置\n    \n    server {             # 4. server 块 (虚拟主机)\n        ...              \n        \n        location \u002F {     # 5. location 块 (URI 匹配)\n            ...\n        }\n        \n        if (条件) {      # 6. if 块 (慎用)\n            ...\n        }\n    }\n}\n","",[45,46,47,55,61,68,74,80,86,91,97,103,109,115,121,127,133,139,145,150,156,161,166,172],"code",{"__ignoreMap":43},[48,49,52],"span",{"class":50,"line":51},"line",1,[48,53,54],{},"# 1. 全局块 (main context)\n",[48,56,58],{"class":50,"line":57},2,[48,59,60],{},"...                      # 影响服务器整体运行的指令\n",[48,62,64],{"class":50,"line":63},3,[48,65,67],{"emptyLinePlaceholder":66},true,"\n",[48,69,71],{"class":50,"line":70},4,[48,72,73],{},"events {                 # 2. events 块\n",[48,75,77],{"class":50,"line":76},5,[48,78,79],{},"    ...                  # 控制连接处理方式\n",[48,81,83],{"class":50,"line":82},6,[48,84,85],{},"}\n",[48,87,89],{"class":50,"line":88},7,[48,90,67],{"emptyLinePlaceholder":66},[48,92,94],{"class":50,"line":93},8,[48,95,96],{},"http {                   # 3. http 块\n",[48,98,100],{"class":50,"line":99},9,[48,101,102],{},"    ...                  # HTTP 模块的全局配置\n",[48,104,106],{"class":50,"line":105},10,[48,107,108],{},"    \n",[48,110,112],{"class":50,"line":111},11,[48,113,114],{},"    server {             # 4. server 块 (虚拟主机)\n",[48,116,118],{"class":50,"line":117},12,[48,119,120],{},"        ...              \n",[48,122,124],{"class":50,"line":123},13,[48,125,126],{},"        \n",[48,128,130],{"class":50,"line":129},14,[48,131,132],{},"        location \u002F {     # 5. location 块 (URI 匹配)\n",[48,134,136],{"class":50,"line":135},15,[48,137,138],{},"            ...\n",[48,140,142],{"class":50,"line":141},16,[48,143,144],{},"        }\n",[48,146,148],{"class":50,"line":147},17,[48,149,126],{},[48,151,153],{"class":50,"line":152},18,[48,154,155],{},"        if (条件) {      # 6. if 块 (慎用)\n",[48,157,159],{"class":50,"line":158},19,[48,160,138],{},[48,162,164],{"class":50,"line":163},20,[48,165,144],{},[48,167,169],{"class":50,"line":168},21,[48,170,171],{},"    }\n",[48,173,175],{"class":50,"line":174},22,[48,176,85],{},[178,179,180,201,211,235,241,247],"ul",{},[181,182,183,186,187,190,191,190,194,190,197,200],"li",{},[34,184,185],{},"全局块（main）","：最外层，包含 ",[45,188,189],{},"user","、",[45,192,193],{},"worker_processes",[45,195,196],{},"error_log",[45,198,199],{},"pid"," 等。这些指令不隶属于任何模块块。",[181,202,203,206,207,210],{},[34,204,205],{},"events 块","：专门配置连接处理，最关键的指令是 ",[45,208,209],{},"worker_connections","。",[181,212,213,216,217,220,221,190,224,227,228,190,231,234],{},[34,214,215],{},"http 块","：所有 HTTP 核心功能的总容器，可包含多个 ",[45,218,219],{},"server"," 块。这里配置 ",[45,222,223],{},"upstream",[45,225,226],{},"access_log"," 格式、",[45,229,230],{},"gzip",[45,232,233],{},"proxy_cache"," 等公用功能。",[181,236,237,240],{},[34,238,239],{},"server 块","：定义一个虚拟主机，基于监听端口和域名区分。",[181,242,243,246],{},[34,244,245],{},"location 块","：根据请求 URI 匹配特定路径，执行最终的处理逻辑。",[181,248,249,252,253,255,256,259,260,210],{},[34,250,251],{},"if 块","：放置在 ",[45,254,219],{}," 或 ",[45,257,258],{},"location"," 内部，用于条件判断。但它的工作模型与声明式配置不同，容易引发“诡异”行为，",[34,261,262,263,190,266,190,269,255,272,275],{},"非必要不使用，优先用 ",[45,264,265],{},"try_files",[45,267,268],{},"return",[45,270,271],{},"rewrite",[45,273,274],{},"map"," 替代",[277,278],"hr",{},[26,280,282],{"id":281},"二指令与上下文","二、指令与上下文",[284,285,287],"h4",{"id":286},"_1-指令语法","1. 指令语法",[23,289,290],{},"每行一个指令，以分号结尾。格式为：",[39,292,294],{"className":41,"code":293,"language":12,"meta":43,"style":43},"指令名 参数1 参数2 ...;\n",[45,295,296],{"__ignoreMap":43},[48,297,298],{"class":50,"line":51},[48,299,293],{},[23,301,302],{},"例如：",[39,304,306],{"className":41,"code":305,"language":12,"meta":43,"style":43},"worker_connections  1024;           # 简单指令\nlisten              80 default_server;  # 带多个值\nproxy_set_header    Host $host;     # 可引用变量\n",[45,307,308,313,318],{"__ignoreMap":43},[48,309,310],{"class":50,"line":51},[48,311,312],{},"worker_connections  1024;           # 简单指令\n",[48,314,315],{"class":50,"line":57},[48,316,317],{},"listen              80 default_server;  # 带多个值\n",[48,319,320],{"class":50,"line":63},[48,321,322],{},"proxy_set_header    Host $host;     # 可引用变量\n",[23,324,325,326,210],{},"块指令用大括号包裹，内部可包含多条指令，如 ",[45,327,328],{},"server { ... }",[284,330,332],{"id":331},"_2-上下文","2. 上下文",[23,334,335,336,339],{},"每个指令都有其",[34,337,338],{},"合法上下文","，即它只能出现在特定的块中。这是最易出错的地方，必须掌握规则：",[341,342,343,356],"table",{},[344,345,346],"thead",{},[347,348,349,353],"tr",{},[350,351,352],"th",{},"上下文",[350,354,355],{},"特点与常见指令",[357,358,359,381,403,423,451,478],"tbody",{},[347,360,361,367],{},[362,363,364],"td",{},[34,365,366],{},"main",[362,368,369,371,372,371,374,371,376,371,378],{},[45,370,189],{},", ",[45,373,193],{},[45,375,196],{},[45,377,199],{},[45,379,380],{},"include",[347,382,383,388],{},[362,384,385],{},[34,386,387],{},"events",[362,389,390,391,394,395,371,397,371,400],{},"仅能出现在 ",[45,392,393],{},"events{}"," 中，如 ",[45,396,209],{},[45,398,399],{},"use",[45,401,402],{},"multi_accept",[347,404,405,410],{},[362,406,407],{},[34,408,409],{},"http",[362,411,412,371,414,371,416,371,418,371,420,422],{},[45,413,219],{},[45,415,223],{},[45,417,274],{},[45,419,226],{},[45,421,230],{}," 等",[347,424,425,429],{},[362,426,427],{},[34,428,219],{},[362,430,431,371,434,371,437,371,440,371,443,445,446,371,448],{},[45,432,433],{},"listen",[45,435,436],{},"server_name",[45,438,439],{},"root",[45,441,442],{},"index",[45,444,265],{},"，以及 ",[45,447,258],{},[45,449,450],{},"if",[347,452,453,457],{},[362,454,455],{},[34,456,258],{},[362,458,459,460,371,463,371,466,371,468,371,470,473,474,255,476],{},"大部分具体处理指令：",[45,461,462],{},"proxy_pass",[45,464,465],{},"fastcgi_pass",[45,467,271],{},[45,469,268],{},[45,471,472],{},"add_header","，也可嵌套 ",[45,475,258],{},[45,477,450],{},[347,479,480,484],{},[362,481,482],{},[34,483,450],{},[362,485,486,487,489,490,492,493,371,496,371,498,500,501,504,505,371,507,509],{},"只能出现在 ",[45,488,219],{}," 和 ",[45,491,258],{}," 中，可使用 ",[45,494,495],{},"set",[45,497,268],{},[45,499,271],{},"，但",[34,502,503],{},"不能","包含 ",[45,506,265],{},[45,508,462],{}," 等（可能导致意外）",[23,511,512,513,515,516,518,519,521,522,524,525,528],{},"典型错误示例：在 ",[45,514,258],{}," 里写 ",[45,517,209],{}," 或者把 ",[45,520,219],{}," 块直接放在 ",[45,523,387],{}," 后面——这些都会导致 ",[45,526,527],{},"nginx -t"," 测试失败。合理的使用方式是心中始终有一张“指令-上下文”映射表，不清楚时查阅官方文档。",[277,530],{},[26,532,534],{"id":533},"三include-机制与配置拆分","三、include 机制与配置拆分",[23,536,537,539],{},[45,538,380],{}," 能将公共配置分片，便于维护。",[284,541,543],{"id":542},"_1-基本用法","1. 基本用法",[39,545,547],{"className":41,"code":546,"language":12,"meta":43,"style":43},"include \u002Fetc\u002Fnginx\u002Fmime.types;        # 包含单个文件\ninclude \u002Fetc\u002Fnginx\u002Fconf.d\u002F*.conf;     # 包含目录下所有 .conf 文件\ninclude \u002Fetc\u002Fnginx\u002Fsites-enabled\u002F*;   # 包含目录下所有文件（通常是符号链接）\n",[45,548,549,554,559],{"__ignoreMap":43},[48,550,551],{"class":50,"line":51},[48,552,553],{},"include \u002Fetc\u002Fnginx\u002Fmime.types;        # 包含单个文件\n",[48,555,556],{"class":50,"line":57},[48,557,558],{},"include \u002Fetc\u002Fnginx\u002Fconf.d\u002F*.conf;     # 包含目录下所有 .conf 文件\n",[48,560,561],{"class":50,"line":63},[48,562,563],{},"include \u002Fetc\u002Fnginx\u002Fsites-enabled\u002F*;   # 包含目录下所有文件（通常是符号链接）\n",[23,565,566,567,569,570,572],{},"被 include 的文件内容会原地展开，遵守同样的上下文规则。所以你不能在 ",[45,568,409],{}," 外部 include 一个包含 ",[45,571,219],{}," 块的配置文件。",[284,574,576],{"id":575},"_2-sites-available-sites-enabled-模式","2. sites-available \u002F sites-enabled 模式",[23,578,579],{},"这是 Debian\u002FUbuntu 系列发行版推荐的管理方式，也在许多自定义部署中被采用。",[178,581,582,605,627],{},[181,583,584,587],{},[34,585,586],{},"目录结构：",[178,588,589,595],{},[181,590,591,594],{},[45,592,593],{},"\u002Fetc\u002Fnginx\u002Fsites-available\u002F","：存放所有站点配置，无论启用与否。",[181,596,597,600,601,604],{},[45,598,599],{},"\u002Fetc\u002Fnginx\u002Fsites-enabled\u002F","：存放指向 ",[45,602,603],{},"sites-available"," 中文件的符号链接，只有被链接的站点才生效。",[181,606,607,610,611,614,615,617,618],{},[34,608,609],{},"主配置引入：","\n在 ",[45,612,613],{},"\u002Fetc\u002Fnginx\u002Fnginx.conf"," 的 ",[45,616,409],{}," 块末尾会有一行：\n",[39,619,621],{"className":41,"code":620,"language":12,"meta":43,"style":43},"include \u002Fetc\u002Fnginx\u002Fsites-enabled\u002F*;\n",[45,622,623],{"__ignoreMap":43},[48,624,625],{"class":50,"line":51},[48,626,620],{},[181,628,629,632],{},[34,630,631],{},"操作方式：",[39,633,637],{"className":634,"code":635,"language":636,"meta":43,"style":43},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","# 创建一个可用站点配置\nvim \u002Fetc\u002Fnginx\u002Fsites-available\u002Fexample.conf\n# 启用该站点\nln -s \u002Fetc\u002Fnginx\u002Fsites-available\u002Fexample.conf \u002Fetc\u002Fnginx\u002Fsites-enabled\u002F\n# 禁用只需删除符号链接\nrm \u002Fetc\u002Fnginx\u002Fsites-enabled\u002Fexample.conf\n# 重载配置\nnginx -s reload\n","bash",[45,638,639,645,655,660,675,680,688,693],{"__ignoreMap":43},[48,640,641],{"class":50,"line":51},[48,642,644],{"class":643},"sutJx","# 创建一个可用站点配置\n",[48,646,647,651],{"class":50,"line":57},[48,648,650],{"class":649},"sbgvK","vim",[48,652,654],{"class":653},"s_sjI"," \u002Fetc\u002Fnginx\u002Fsites-available\u002Fexample.conf\n",[48,656,657],{"class":50,"line":63},[48,658,659],{"class":643},"# 启用该站点\n",[48,661,662,665,669,672],{"class":50,"line":70},[48,663,664],{"class":649},"ln",[48,666,668],{"class":667},"stzsN"," -s",[48,670,671],{"class":653}," \u002Fetc\u002Fnginx\u002Fsites-available\u002Fexample.conf",[48,673,674],{"class":653}," \u002Fetc\u002Fnginx\u002Fsites-enabled\u002F\n",[48,676,677],{"class":50,"line":76},[48,678,679],{"class":643},"# 禁用只需删除符号链接\n",[48,681,682,685],{"class":50,"line":82},[48,683,684],{"class":649},"rm",[48,686,687],{"class":653}," \u002Fetc\u002Fnginx\u002Fsites-enabled\u002Fexample.conf\n",[48,689,690],{"class":50,"line":88},[48,691,692],{"class":643},"# 重载配置\n",[48,694,695,697,699],{"class":50,"line":93},[48,696,12],{"class":649},[48,698,668],{"class":667},[48,700,701],{"class":653}," reload\n",[23,703,704],{},"这种模式使站点管理非常清晰，且不会因为移动文件而丢失配置，非常适合多站点环境。",[277,706],{},[26,708,710],{"id":709},"四nginx-变量体系","四、Nginx 变量体系",[23,712,713],{},"变量是 Nginx 灵活性的灵魂，它们贯穿于日志记录、URL 重写、请求头传递等各个方面。",[284,715,717],{"id":716},"_1-内置变量可直接使用","1. 内置变量（可直接使用）",[341,719,720,730],{},[344,721,722],{},[347,723,724,727],{},[350,725,726],{},"变量名",[350,728,729],{},"含义与注意事项",[357,731,732,746,764,774,784,794,804,814,826,836,846,856,866],{},[347,733,734,739],{},[362,735,736],{},[45,737,738],{},"$uri",[362,740,741,742,745],{},"当前请求的 URI，",[34,743,744],{},"经过解码，且可能被 rewrite 改变过","，不包含参数",[347,747,748,753],{},[362,749,750],{},[45,751,752],{},"$request_uri",[362,754,755,756,759,760,763],{},"原始请求 URI，",[34,757,758],{},"未经解码，且永远不变","，包含参数（如 ",[45,761,762],{},"\u002Fpage?foo=bar","）",[347,765,766,771],{},[362,767,768],{},[45,769,770],{},"$host",[362,772,773],{},"请求头中的 Host 字段，若无则为虚拟主机名；最适合做主机判断",[347,775,776,781],{},[362,777,778],{},[45,779,780],{},"$http_host",[362,782,783],{},"原始请求头中的 Host，其值格式完全遵照客户端发送的内容",[347,785,786,791],{},[362,787,788],{},[45,789,790],{},"$remote_addr",[362,792,793],{},"客户端 IP 地址",[347,795,796,801],{},[362,797,798],{},[45,799,800],{},"$proxy_add_x_forwarded_for",[362,802,803],{},"记录请求经过的代理链路，追加客户端 IP，防止覆盖",[347,805,806,811],{},[362,807,808],{},[45,809,810],{},"$args",[362,812,813],{},"URL 中的参数字符串（不含问号）",[347,815,816,821],{},[362,817,818],{},[45,819,820],{},"$query_string",[362,822,823,824],{},"同 ",[45,825,810],{},[347,827,828,833],{},[362,829,830],{},[45,831,832],{},"$scheme",[362,834,835],{},"请求协议（http 或 https）",[347,837,838,843],{},[362,839,840],{},[45,841,842],{},"$request_method",[362,844,845],{},"请求方法（GET、POST 等）",[347,847,848,853],{},[362,849,850],{},[45,851,852],{},"$server_name",[362,854,855],{},"当前匹配的 server_name 值",[347,857,858,863],{},[362,859,860],{},[45,861,862],{},"$document_root",[362,864,865],{},"当前请求的 root 指令的最终值",[347,867,868,872],{},[362,869,870],{},[45,871,738],{},[362,873,874,875,877],{},"注意：若 URL 重写发生，",[45,876,738],{}," 会变成重写后的路径",[23,879,880],{},[34,881,882,883,885,886,888],{},"对比 ",[45,884,738],{}," 与 ",[45,887,752],{}," 的经典差异：",[178,890,891,897,909],{},[181,892,893,894],{},"请求：",[45,895,896],{},"\u002Fuser\u002Flogin?next=\u002Fadmin",[181,898,899,901,902,905,906,763],{},[45,900,738],{}," 可能是 ",[45,903,904],{},"\u002Fuser\u002Flogin","（经过 rewrite 可能变成 ",[45,907,908],{},"\u002Fapp.php",[181,910,911,913,914],{},[45,912,752],{}," 永远是 ",[45,915,896],{},[284,917,919],{"id":918},"_2-自定义变量","2. 自定义变量",[178,921,922,966],{},[181,923,924,929,610,932,190,934,190,936,938,939,963,965],{},[34,925,926,928],{},[45,927,495],{}," 指令",[930,931],"br",{},[45,933,219],{},[45,935,258],{},[45,937,450],{}," 块内向变量动态赋值。",[39,940,942],{"className":41,"code":941,"language":12,"meta":43,"style":43},"set $mobile_label \"desktop\";\nif ($http_user_agent ~* \"(Android|iPhone)\") {\n    set $mobile_label \"mobile\";\n}\n",[45,943,944,949,954,959],{"__ignoreMap":43},[48,945,946],{"class":50,"line":51},[48,947,948],{},"set $mobile_label \"desktop\";\n",[48,950,951],{"class":50,"line":57},[48,952,953],{},"if ($http_user_agent ~* \"(Android|iPhone)\") {\n",[48,955,956],{"class":50,"line":63},[48,957,958],{},"    set $mobile_label \"mobile\";\n",[48,960,961],{"class":50,"line":70},[48,962,85],{},[930,964],{},"变量值对后续的所有操作立即可见。",[181,967,968,972,610,974,976,977,210,982,1011,1013,1014,1017,1018,210],{},[34,969,970,928],{},[45,971,274],{},[930,973],{},[45,975,409],{}," 块中创建静态映射表，根据一个变量的值生成另一个变量，",[34,978,979,980],{},"效率远高于 ",[45,981,450],{},[39,983,985],{"className":41,"code":984,"language":12,"meta":43,"style":43},"map $host $backend {\n    default          backend_default;\n    api.example.com  backend_api;\n    admin.example.com backend_admin;\n}\n",[45,986,987,992,997,1002,1007],{"__ignoreMap":43},[48,988,989],{"class":50,"line":51},[48,990,991],{},"map $host $backend {\n",[48,993,994],{"class":50,"line":57},[48,995,996],{},"    default          backend_default;\n",[48,998,999],{"class":50,"line":63},[48,1000,1001],{},"    api.example.com  backend_api;\n",[48,1003,1004],{"class":50,"line":70},[48,1005,1006],{},"    admin.example.com backend_admin;\n",[48,1008,1009],{"class":50,"line":76},[48,1010,85],{},[930,1012],{},"之后可直接使用 ",[45,1015,1016],{},"$backend"," 变量，例如 ",[45,1019,1020],{},"proxy_pass http:\u002F\u002F$backend;",[284,1022,1024],{"id":1023},"_3-变量的实际应用","3. 变量的实际应用",[178,1026,1027,1060,1092,1139],{},[181,1028,1029,1032,1034,1035],{},[34,1030,1031],{},"日志定制",[930,1033],{},"\n定义详细的访问日志格式，排查问题必备。",[39,1036,1038],{"className":41,"code":1037,"language":12,"meta":43,"style":43},"log_format main '$remote_addr - $remote_user [$time_local] '\n                '\"$request\" $status $body_bytes_sent '\n                '\"$http_referer\" \"$http_user_agent\"';\naccess_log \u002Fvar\u002Flog\u002Fnginx\u002Faccess.log main;\n",[45,1039,1040,1045,1050,1055],{"__ignoreMap":43},[48,1041,1042],{"class":50,"line":51},[48,1043,1044],{},"log_format main '$remote_addr - $remote_user [$time_local] '\n",[48,1046,1047],{"class":50,"line":57},[48,1048,1049],{},"                '\"$request\" $status $body_bytes_sent '\n",[48,1051,1052],{"class":50,"line":63},[48,1053,1054],{},"                '\"$http_referer\" \"$http_user_agent\"';\n",[48,1056,1057],{"class":50,"line":70},[48,1058,1059],{},"access_log \u002Fvar\u002Flog\u002Fnginx\u002Faccess.log main;\n",[181,1061,1062,1065,1067,1068],{},[34,1063,1064],{},"URL 改写（rewrite）",[930,1066],{},"\n根据条件做出重定向或内部跳转。",[39,1069,1071],{"className":41,"code":1070,"language":12,"meta":43,"style":43},"rewrite ^\u002Fold-path\u002F(.*)$ \u002Fnew-path\u002F$1 permanent;   # 使用变量 $1 捕获分组\nif ($scheme = http) {\n    rewrite ^ https:\u002F\u002F$host$request_uri? permanent; # 强制 HTTPS\n}\n",[45,1072,1073,1078,1083,1088],{"__ignoreMap":43},[48,1074,1075],{"class":50,"line":51},[48,1076,1077],{},"rewrite ^\u002Fold-path\u002F(.*)$ \u002Fnew-path\u002F$1 permanent;   # 使用变量 $1 捕获分组\n",[48,1079,1080],{"class":50,"line":57},[48,1081,1082],{},"if ($scheme = http) {\n",[48,1084,1085],{"class":50,"line":63},[48,1086,1087],{},"    rewrite ^ https:\u002F\u002F$host$request_uri? permanent; # 强制 HTTPS\n",[48,1089,1090],{"class":50,"line":70},[48,1091,85],{},[181,1093,1094,1097,1099,1100],{},[34,1095,1096],{},"反向代理头传递",[930,1098],{},"\n将客户端真实信息透传给后端。",[39,1101,1103],{"className":41,"code":1102,"language":12,"meta":43,"style":43},"location \u002F {\n    proxy_set_header Host $host;\n    proxy_set_header X-Real-IP $remote_addr;\n    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n    proxy_set_header X-Forwarded-Proto $scheme;\n    proxy_pass http:\u002F\u002Fbackend;\n}\n",[45,1104,1105,1110,1115,1120,1125,1130,1135],{"__ignoreMap":43},[48,1106,1107],{"class":50,"line":51},[48,1108,1109],{},"location \u002F {\n",[48,1111,1112],{"class":50,"line":57},[48,1113,1114],{},"    proxy_set_header Host $host;\n",[48,1116,1117],{"class":50,"line":63},[48,1118,1119],{},"    proxy_set_header X-Real-IP $remote_addr;\n",[48,1121,1122],{"class":50,"line":70},[48,1123,1124],{},"    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n",[48,1126,1127],{"class":50,"line":76},[48,1128,1129],{},"    proxy_set_header X-Forwarded-Proto $scheme;\n",[48,1131,1132],{"class":50,"line":82},[48,1133,1134],{},"    proxy_pass http:\u002F\u002Fbackend;\n",[48,1136,1137],{"class":50,"line":88},[48,1138,85],{},[181,1140,1141,1144,1146,1147],{},[34,1142,1143],{},"动态路由",[930,1145],{},"\n例如根据 Cookie 或地区匹配合适的后端：",[39,1148,1150],{"className":41,"code":1149,"language":12,"meta":43,"style":43},"map $cookie_region $upstream {\n    default us_backend;\n    EU       eu_backend;\n    ASIA     asia_backend;\n}\n",[45,1151,1152,1157,1162,1167,1172],{"__ignoreMap":43},[48,1153,1154],{"class":50,"line":51},[48,1155,1156],{},"map $cookie_region $upstream {\n",[48,1158,1159],{"class":50,"line":57},[48,1160,1161],{},"    default us_backend;\n",[48,1163,1164],{"class":50,"line":63},[48,1165,1166],{},"    EU       eu_backend;\n",[48,1168,1169],{"class":50,"line":70},[48,1170,1171],{},"    ASIA     asia_backend;\n",[48,1173,1174],{"class":50,"line":76},[48,1175,85],{},[23,1177,1178,1179,1181],{},"掌握配置文件的分层结构、指令上下文规则、",[45,1180,380],{}," 拆分模式以及变量系统，你就已经具备了读懂任意 Nginx 配置并按照需求自由组合的能力。后面的日志、优化、安全等功能，都是在这一骨架之上添加血肉。",[1183,1184,1185],"h2",{"id":1185},"参考文献",[341,1187,1188,1198],{},[344,1189,1190],{},[347,1191,1192,1195],{},[350,1193,1194],{},"资料",[350,1196,1197],{},"说明",[357,1199,1200,1214],{},[347,1201,1202,1211],{},[362,1203,1204],{},[1205,1206,1210],"a",{"href":1207,"rel":1208},"https:\u002F\u002Fnginx.org\u002Fen\u002Fdocs\u002F",[1209],"nofollow","nginx 文档",[362,1212,1213],{},"官方",[347,1215,1216,1222],{},[362,1217,1218],{},[1205,1219,1221],{"href":1220},"\u002Fknowledge\u002Fbooklet\u002Fuphold","运维导读",[362,1223,1224],{},"学习路径",[1226,1227,1228],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":43,"searchDepth":57,"depth":57,"links":1230},[1231,1232,1233,1234,1235],{"id":28,"depth":63,"text":29},{"id":281,"depth":63,"text":282},{"id":533,"depth":63,"text":534},{"id":709,"depth":63,"text":710},{"id":1185,"depth":57,"text":1185},{"title":8,"description":9},"knowledge\u002Fbooklet\u002Fuphold\u002FNginx\u002Fconfig","knowledge\u002Fknowledge\u002Fbooklet\u002Fuphold\u002FNginx\u002Fconfig.md","md",{"items":1241},[1242,1246,1250,1254,1258,1262],{"path":1243,"title":1244,"description":1245,"category":10,"score":82},"\u002Fknowledge\u002Fbooklet\u002Fuphold\u002Fnginx\u002Fse","安全基础","Nginx 作为流量的总入口，安全配置是防线第一关。以下从六个基础维度加固你的服务，既实用又立竿见影。",{"path":1247,"title":1248,"description":1249,"category":10,"score":82},"\u002Fknowledge\u002Fbooklet\u002Fuphold\u002Fnginx\u002Fcore","核心模块与常见指令详解","深入 Nginx 的指令层，是配置落地的关键。下面按功能模块拆解，每个指令都说明含义、语法、典型示例，并点出极易踩坑的地方。",{"path":1251,"title":1252,"description":1253,"category":10,"score":82},"\u002Fknowledge\u002Fbooklet\u002Fuphold\u002Fnginx\u002Fbase","Nginx 核心概念","Nginx 是一款高性能的 HTTP 和反向代理服务器。学习路径见 运维导读。它的强大并发能力与灵活的扩展性根植于少数几个核心设计。理解这些底层原理，后续的配置、调优和排障都会变得通透。",{"path":1255,"title":1256,"description":1257,"category":10,"score":82},"\u002Fknowledge\u002Fbooklet\u002Fuphold\u002Fnginx\u002Fseror","常见故障排查思路","故障排查的关键是快速定位，而非盲目重试。下面按最常见的五种现象归类，每一种都给出清晰的排查路径和解决思路。",{"path":1259,"title":1260,"description":1261,"category":10,"score":82},"\u002Fknowledge\u002Fbooklet\u002Fuphold\u002Fnginx\u002Fpre","性能调优基础","性能调优的目标是：用有限的资源，支撑更高的并发、更快的响应、更稳的服务。下面按优化维度，逐一拆解原理和配置要诀。",{"path":1263,"title":1264,"description":1265,"category":10,"score":82},"\u002Fknowledge\u002Fbooklet\u002Fuphold\u002Fnginx\u002Flogger","访问日志与错误日志","日志是 Nginx 排错的“第一现场”。一个优秀的日志策略既能完整保留请求上下文，又不会撑爆磁盘。下面从格式定制、存储轮转、错误分级三个维度详细讲解。",{"series":1267,"title":12,"items":1268,"index":51,"prev":1282,"next":1283},"booklet\u002Fuphold\u002Fnginx",[1269,1271,1272,1274,1276,1278,1280],{"path":1251,"title":1252,"date":1270,"pinned":15},"2023-04-03",{"path":7,"title":8,"date":14,"pinned":15},{"path":1247,"title":1248,"date":1273,"pinned":15},"2023-04-25",{"path":1263,"title":1264,"date":1275,"pinned":15},"2020-02-29",{"path":1259,"title":1260,"date":1277,"pinned":15},"2020-07-11",{"path":1243,"title":1244,"date":1279,"pinned":15},"2024-12-02",{"path":1255,"title":1256,"date":1281,"pinned":15},"2020-09-18",{"path":1251,"title":1252,"date":1270,"pinned":15},{"path":1247,"title":1248,"date":1273,"pinned":15}]