[{"data":1,"prerenderedAt":1752},["ShallowReactive",2],{"\u002Ffix-issues\u002Fflask-nginx-config-test-failed-fix-guide":3},{"id":4,"title":5,"body":6,"description":1742,"extension":1743,"meta":1744,"navigation":124,"path":1748,"seo":1749,"stem":1750,"__hash__":1751},"content\u002Ffix-issues\u002Fflask-nginx-config-test-failed-fix-guide.md","Flask Nginx Config Test Failed (Fix Guide)",{"type":7,"value":8,"toc":1731},"minimark",[9,13,22,27,30,202,212,216,223,227,1172,1176,1283,1287,1290,1438,1441,1468,1473,1477,1565,1569,1587,1591,1602,1613,1621,1632,1646,1657,1668,1682,1693,1714,1718,1727],[10,11,5],"h1",{"id":12},"flask-nginx-config-test-failed-fix-guide",[14,15,16,17,21],"p",{},"If you're seeing an Nginx config test failure while deploying or updating a Flask app, this guide shows you how to identify the invalid directive, fix the configuration, and validate the reload safely. The goal is to get ",[18,19,20],"code",{},"nginx -t"," passing and restore a working reverse proxy setup for Flask.",[23,24,26],"h2",{"id":25},"quick-fix-quick-setup","Quick Fix \u002F Quick Setup",[14,28,29],{},"Run the validation commands first and use the exact file and line number from the error output:",[31,32,37],"pre",{"className":33,"code":34,"language":35,"meta":36,"style":36},"language-bash shiki shiki-themes github-light github-dark","sudo nginx -t\nsudo systemctl status nginx --no-pager -l\nsudo journalctl -u nginx -n 50 --no-pager\nsudo nginx -T | sed -n '1,220p'\n\n# Common fast checks\nsudo ls -l \u002Fetc\u002Fnginx\u002Fsites-enabled\u002F\nsudo grep -R \"server_name\\|listen\\|proxy_pass\\|include\\|ssl_certificate\" \u002Fetc\u002Fnginx\u002Fsites-enabled \u002Fetc\u002Fnginx\u002Fnginx.conf\n\n# After fixing config\nsudo nginx -t && sudo systemctl reload nginx\n","bash","",[18,38,39,56,75,97,119,126,133,147,167,172,178],{"__ignoreMap":36},[40,41,44,48,52],"span",{"class":42,"line":43},"line",1,[40,45,47],{"class":46},"sScJk","sudo",[40,49,51],{"class":50},"sZZnC"," nginx",[40,53,55],{"class":54},"sj4cs"," -t\n",[40,57,59,61,64,67,69,72],{"class":42,"line":58},2,[40,60,47],{"class":46},[40,62,63],{"class":50}," systemctl",[40,65,66],{"class":50}," status",[40,68,51],{"class":50},[40,70,71],{"class":54}," --no-pager",[40,73,74],{"class":54}," -l\n",[40,76,78,80,83,86,88,91,94],{"class":42,"line":77},3,[40,79,47],{"class":46},[40,81,82],{"class":50}," journalctl",[40,84,85],{"class":54}," -u",[40,87,51],{"class":50},[40,89,90],{"class":54}," -n",[40,92,93],{"class":54}," 50",[40,95,96],{"class":54}," --no-pager\n",[40,98,100,102,104,107,111,114,116],{"class":42,"line":99},4,[40,101,47],{"class":46},[40,103,51],{"class":50},[40,105,106],{"class":54}," -T",[40,108,110],{"class":109},"szBVR"," |",[40,112,113],{"class":46}," sed",[40,115,90],{"class":54},[40,117,118],{"class":50}," '1,220p'\n",[40,120,122],{"class":42,"line":121},5,[40,123,125],{"emptyLinePlaceholder":124},true,"\n",[40,127,129],{"class":42,"line":128},6,[40,130,132],{"class":131},"sJ8bj","# Common fast checks\n",[40,134,136,138,141,144],{"class":42,"line":135},7,[40,137,47],{"class":46},[40,139,140],{"class":50}," ls",[40,142,143],{"class":54}," -l",[40,145,146],{"class":50}," \u002Fetc\u002Fnginx\u002Fsites-enabled\u002F\n",[40,148,150,152,155,158,161,164],{"class":42,"line":149},8,[40,151,47],{"class":46},[40,153,154],{"class":50}," grep",[40,156,157],{"class":54}," -R",[40,159,160],{"class":50}," \"server_name\\|listen\\|proxy_pass\\|include\\|ssl_certificate\"",[40,162,163],{"class":50}," \u002Fetc\u002Fnginx\u002Fsites-enabled",[40,165,166],{"class":50}," \u002Fetc\u002Fnginx\u002Fnginx.conf\n",[40,168,170],{"class":42,"line":169},9,[40,171,125],{"emptyLinePlaceholder":124},[40,173,175],{"class":42,"line":174},10,[40,176,177],{"class":131},"# After fixing config\n",[40,179,181,183,185,188,192,194,196,199],{"class":42,"line":180},11,[40,182,47],{"class":46},[40,184,51],{"class":50},[40,186,187],{"class":54}," -t",[40,189,191],{"class":190},"sVt8B"," && ",[40,193,47],{"class":46},[40,195,63],{"class":50},[40,197,198],{"class":50}," reload",[40,200,201],{"class":50}," nginx\n",[14,203,204,205,207,208,211],{},"Start with ",[18,206,20],{}," and ",[18,209,210],{},"journalctl"," to get the exact file and line number. Most failures are caused by syntax errors, missing included files, bad upstream\u002Fsocket paths, duplicate directives, or SSL file path mistakes.",[23,213,215],{"id":214},"whats-happening","What’s Happening",[14,217,218,219,222],{},"Nginx validates its full configuration tree before reload or restart. A failure means at least one file contains invalid syntax, an unsupported directive context, a missing file, or a conflicting server definition. Flask deployments commonly fail config tests when ",[18,220,221],{},"proxy_pass",", include paths, Unix socket paths, static\u002Fmedia aliases, or Certbot-generated SSL directives are incorrect.",[23,224,226],{"id":225},"step-by-step-guide","Step-by-Step Guide",[228,229,230,262,308,337,462,540,620,751,805,889,957,1010,1045,1095,1133],"ol",{},[231,232,233,237,250,253,254],"li",{},[234,235,236],"strong",{},"Run the config test and capture the exact error",[31,238,240],{"className":33,"code":239,"language":35,"meta":36,"style":36},"sudo nginx -t\n",[18,241,242],{"__ignoreMap":36},[40,243,244,246,248],{"class":42,"line":43},[40,245,47],{"class":46},[40,247,51],{"class":50},[40,249,55],{"class":54},[251,252],"br",{},"Example errors:",[31,255,260],{"className":256,"code":258,"language":259,"meta":36},[257],"language-text","nginx: [emerg] unexpected \"}\" in \u002Fetc\u002Fnginx\u002Fsites-enabled\u002Fflask-app:29\nnginx: [emerg] open() \"\u002Fetc\u002Fnginx\u002Fsnippets\u002Fssl-common.conf\" failed (2: No such file or directory)\nnginx: [emerg] unknown directive \"prox_pass\" in \u002Fetc\u002Fnginx\u002Fsites-enabled\u002Fflask-app:18\n","text",[18,261,258],{"__ignoreMap":36},[231,263,264,267,269,270,284,286,287],{},[234,265,266],{},"Print the active merged configuration",[251,268],{},"This helps when the error comes from an included file or symlinked site.",[31,271,273],{"className":33,"code":272,"language":35,"meta":36,"style":36},"sudo nginx -T\n",[18,274,275],{"__ignoreMap":36},[40,276,277,279,281],{"class":42,"line":43},[40,278,47],{"class":46},[40,280,51],{"class":50},[40,282,283],{"class":54}," -T\n",[251,285],{},"To inspect only the first section quickly:",[31,288,290],{"className":33,"code":289,"language":35,"meta":36,"style":36},"sudo nginx -T | sed -n '1,220p'\n",[18,291,292],{"__ignoreMap":36},[40,293,294,296,298,300,302,304,306],{"class":42,"line":43},[40,295,47],{"class":46},[40,297,51],{"class":50},[40,299,106],{"class":54},[40,301,110],{"class":109},[40,303,113],{"class":46},[40,305,90],{"class":54},[40,307,118],{"class":50},[231,309,310,313,315,316,318,319,334,336],{},[234,311,312],{},"Open the failing file",[251,314],{},"Use the exact path reported by ",[18,317,20],{},".",[31,320,322],{"className":33,"code":321,"language":35,"meta":36,"style":36},"sudo editor \u002Fetc\u002Fnginx\u002Fsites-available\u002Fyour-site\n",[18,323,324],{"__ignoreMap":36},[40,325,326,328,331],{"class":42,"line":43},[40,327,47],{"class":46},[40,329,330],{"class":50}," editor",[40,332,333],{"class":50}," \u002Fetc\u002Fnginx\u002Fsites-available\u002Fyour-site\n",[251,335],{},"Or open the specific file from the error output.",[231,338,339,342,344,345,370,372,373,419,421,422],{},[234,340,341],{},"Fix basic syntax problems first",[251,343],{},"Look for:",[346,347,348,354,364,367],"ul",{},[231,349,350,351],{},"missing ",[18,352,353],{},";",[231,355,356,357,360,361],{},"extra or missing ",[18,358,359],{},"{"," \u002F ",[18,362,363],{},"}",[231,365,366],{},"malformed quotes",[231,368,369],{},"directives placed outside valid blocks",[251,371],{},"Example of a broken config:",[31,374,378],{"className":375,"code":376,"language":377,"meta":36,"style":36},"language-nginx shiki shiki-themes github-light github-dark","server {\n    listen 80\n    server_name example.com\n\n    location \u002F {\n        proxy_pass http:\u002F\u002F127.0.0.1:8000\n    }\n}\n","nginx",[18,379,380,385,390,395,399,404,409,414],{"__ignoreMap":36},[40,381,382],{"class":42,"line":43},[40,383,384],{},"server {\n",[40,386,387],{"class":42,"line":58},[40,388,389],{},"    listen 80\n",[40,391,392],{"class":42,"line":77},[40,393,394],{},"    server_name example.com\n",[40,396,397],{"class":42,"line":99},[40,398,125],{"emptyLinePlaceholder":124},[40,400,401],{"class":42,"line":121},[40,402,403],{},"    location \u002F {\n",[40,405,406],{"class":42,"line":128},[40,407,408],{},"        proxy_pass http:\u002F\u002F127.0.0.1:8000\n",[40,410,411],{"class":42,"line":135},[40,412,413],{},"    }\n",[40,415,416],{"class":42,"line":149},[40,417,418],{},"}\n",[251,420],{},"Correct version:",[31,423,425],{"className":375,"code":424,"language":377,"meta":36,"style":36},"server {\n    listen 80;\n    server_name example.com;\n\n    location \u002F {\n        proxy_pass http:\u002F\u002F127.0.0.1:8000;\n    }\n}\n",[18,426,427,431,436,441,445,449,454,458],{"__ignoreMap":36},[40,428,429],{"class":42,"line":43},[40,430,384],{},[40,432,433],{"class":42,"line":58},[40,434,435],{},"    listen 80;\n",[40,437,438],{"class":42,"line":77},[40,439,440],{},"    server_name example.com;\n",[40,442,443],{"class":42,"line":99},[40,444,125],{"emptyLinePlaceholder":124},[40,446,447],{"class":42,"line":121},[40,448,403],{},[40,450,451],{"class":42,"line":128},[40,452,453],{},"        proxy_pass http:\u002F\u002F127.0.0.1:8000;\n",[40,455,456],{"class":42,"line":135},[40,457,413],{},[40,459,460],{"class":42,"line":149},[40,461,418],{},[231,463,464,467,469,470,472,473,482,484,485,521,523,526,527,530,531,526,533,535,536,539],{},[234,465,466],{},"Verify directive context",[251,468],{},"Some directives must appear only inside specific blocks.",[251,471],{},"Invalid:",[31,474,476],{"className":375,"code":475,"language":377,"meta":36,"style":36},"proxy_pass http:\u002F\u002F127.0.0.1:8000;\n",[18,477,478],{"__ignoreMap":36},[40,479,480],{"class":42,"line":43},[40,481,475],{},[251,483],{},"Valid:",[31,486,487],{"className":375,"code":424,"language":377,"meta":36,"style":36},[18,488,489,493,497,501,505,509,513,517],{"__ignoreMap":36},[40,490,491],{"class":42,"line":43},[40,492,384],{},[40,494,495],{"class":42,"line":58},[40,496,435],{},[40,498,499],{"class":42,"line":77},[40,500,440],{},[40,502,503],{"class":42,"line":99},[40,504,125],{"emptyLinePlaceholder":124},[40,506,507],{"class":42,"line":121},[40,508,403],{},[40,510,511],{"class":42,"line":128},[40,512,453],{},[40,514,515],{"class":42,"line":135},[40,516,413],{},[40,518,519],{"class":42,"line":149},[40,520,418],{},[251,522],{},[18,524,525],{},"location"," must be inside ",[18,528,529],{},"server",". ",[18,532,221],{},[18,534,525],{},", ",[18,537,538],{},"if"," in some contexts, or specific upstream-related contexts.",[231,541,542,545,547,548,551,552,605,607,608,617,619],{},[234,543,544],{},"Check included files",[251,546],{},"If you use ",[18,549,550],{},"include",", confirm the target file exists.",[31,553,555],{"className":33,"code":554,"language":35,"meta":36,"style":36},"sudo find \u002Fetc\u002Fnginx -maxdepth 3 -type f | sort\nsudo ls -l \u002Fetc\u002Fnginx\u002Fsnippets\u002F\nsudo ls -l \u002Fetc\u002Fnginx\u002Fsites-enabled\u002F\n",[18,556,557,584,595],{"__ignoreMap":36},[40,558,559,561,564,567,570,573,576,579,581],{"class":42,"line":43},[40,560,47],{"class":46},[40,562,563],{"class":50}," find",[40,565,566],{"class":50}," \u002Fetc\u002Fnginx",[40,568,569],{"class":54}," -maxdepth",[40,571,572],{"class":54}," 3",[40,574,575],{"class":54}," -type",[40,577,578],{"class":50}," f",[40,580,110],{"class":109},[40,582,583],{"class":46}," sort\n",[40,585,586,588,590,592],{"class":42,"line":58},[40,587,47],{"class":46},[40,589,140],{"class":50},[40,591,143],{"class":54},[40,593,594],{"class":50}," \u002Fetc\u002Fnginx\u002Fsnippets\u002F\n",[40,596,597,599,601,603],{"class":42,"line":77},[40,598,47],{"class":46},[40,600,140],{"class":50},[40,602,143],{"class":54},[40,604,146],{"class":50},[251,606],{},"Example:",[31,609,611],{"className":375,"code":610,"language":377,"meta":36,"style":36},"include \u002Fetc\u002Fnginx\u002Fsnippets\u002Fflask-proxy.conf;\n",[18,612,613],{"__ignoreMap":36},[40,614,615],{"class":42,"line":43},[40,616,610],{},[251,618],{},"If that file is missing, either restore it or remove the include.",[231,621,622,625,627,628,686,688,689,743,745,746,318],{},[234,623,624],{},"Validate Flask reverse proxy settings",[251,626],{},"For a Gunicorn TCP port:",[31,629,631],{"className":375,"code":630,"language":377,"meta":36,"style":36},"server {\n    listen 80;\n    server_name example.com;\n\n    location \u002F {\n        proxy_pass http:\u002F\u002F127.0.0.1:8000;\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    }\n}\n",[18,632,633,637,641,645,649,653,657,662,667,672,677,681],{"__ignoreMap":36},[40,634,635],{"class":42,"line":43},[40,636,384],{},[40,638,639],{"class":42,"line":58},[40,640,435],{},[40,642,643],{"class":42,"line":77},[40,644,440],{},[40,646,647],{"class":42,"line":99},[40,648,125],{"emptyLinePlaceholder":124},[40,650,651],{"class":42,"line":121},[40,652,403],{},[40,654,655],{"class":42,"line":128},[40,656,453],{},[40,658,659],{"class":42,"line":135},[40,660,661],{},"        proxy_set_header Host $host;\n",[40,663,664],{"class":42,"line":149},[40,665,666],{},"        proxy_set_header X-Real-IP $remote_addr;\n",[40,668,669],{"class":42,"line":169},[40,670,671],{},"        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n",[40,673,674],{"class":42,"line":174},[40,675,676],{},"        proxy_set_header X-Forwarded-Proto $scheme;\n",[40,678,679],{"class":42,"line":180},[40,680,413],{},[40,682,684],{"class":42,"line":683},12,[40,685,418],{},[251,687],{},"For a Gunicorn Unix socket:",[31,690,692],{"className":375,"code":691,"language":377,"meta":36,"style":36},"server {\n    listen 80;\n    server_name example.com;\n\n    location \u002F {\n        proxy_pass http:\u002F\u002Funix:\u002Frun\u002Fgunicorn.sock;\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    }\n}\n",[18,693,694,698,702,706,710,714,719,723,727,731,735,739],{"__ignoreMap":36},[40,695,696],{"class":42,"line":43},[40,697,384],{},[40,699,700],{"class":42,"line":58},[40,701,435],{},[40,703,704],{"class":42,"line":77},[40,705,440],{},[40,707,708],{"class":42,"line":99},[40,709,125],{"emptyLinePlaceholder":124},[40,711,712],{"class":42,"line":121},[40,713,403],{},[40,715,716],{"class":42,"line":128},[40,717,718],{},"        proxy_pass http:\u002F\u002Funix:\u002Frun\u002Fgunicorn.sock;\n",[40,720,721],{"class":42,"line":135},[40,722,661],{},[40,724,725],{"class":42,"line":149},[40,726,666],{},[40,728,729],{"class":42,"line":169},[40,730,671],{},[40,732,733],{"class":42,"line":174},[40,734,676],{},[40,736,737],{"class":42,"line":180},[40,738,413],{},[40,740,741],{"class":42,"line":683},[40,742,418],{},[251,744],{},"If you need the full deployment baseline, see ",[747,748,750],"a",{"href":749},"\u002Fdeploy\u002Fdeploy-flask-with-nginx-plus-gunicorn-step-by-step-guide","Deploy Flask with Nginx + Gunicorn (Step-by-Step Guide)",[231,752,753,756,758,759,799,801,802,804],{},[234,754,755],{},"Check Gunicorn socket or port references",[251,757],{},"Confirm the Nginx target matches the actual Gunicorn service.",[31,760,762],{"className":33,"code":761,"language":35,"meta":36,"style":36},"sudo ls -l \u002Frun\u002Fgunicorn.sock\ncurl -I http:\u002F\u002F127.0.0.1:8000\ncurl --unix-socket \u002Frun\u002Fgunicorn.sock http:\u002F\u002Flocalhost\u002F\n",[18,763,764,775,786],{"__ignoreMap":36},[40,765,766,768,770,772],{"class":42,"line":43},[40,767,47],{"class":46},[40,769,140],{"class":50},[40,771,143],{"class":54},[40,773,774],{"class":50}," \u002Frun\u002Fgunicorn.sock\n",[40,776,777,780,783],{"class":42,"line":58},[40,778,779],{"class":46},"curl",[40,781,782],{"class":54}," -I",[40,784,785],{"class":50}," http:\u002F\u002F127.0.0.1:8000\n",[40,787,788,790,793,796],{"class":42,"line":77},[40,789,779],{"class":46},[40,791,792],{"class":54}," --unix-socket",[40,794,795],{"class":50}," \u002Frun\u002Fgunicorn.sock",[40,797,798],{"class":50}," http:\u002F\u002Flocalhost\u002F\n",[251,800],{},"A bad socket path usually causes runtime upstream errors, but malformed syntax in ",[18,803,221],{}," can fail validation.",[231,806,807,810,812,813,816,817,819,820,822,823,860,862,863,882,884,885,318],{},[234,808,809],{},"Validate static and media configuration",[251,811],{},"Incorrect ",[18,814,815],{},"alias"," usage is common in Flask deployments.",[251,818],{},"Correct ",[18,821,815],{}," example:",[31,824,826],{"className":375,"code":825,"language":377,"meta":36,"style":36},"location \u002Fstatic\u002F {\n    alias \u002Fsrv\u002Fflask-app\u002Fstatic\u002F;\n}\n\nlocation \u002Fmedia\u002F {\n    alias \u002Fsrv\u002Fflask-app\u002Fmedia\u002F;\n}\n",[18,827,828,833,838,842,846,851,856],{"__ignoreMap":36},[40,829,830],{"class":42,"line":43},[40,831,832],{},"location \u002Fstatic\u002F {\n",[40,834,835],{"class":42,"line":58},[40,836,837],{},"    alias \u002Fsrv\u002Fflask-app\u002Fstatic\u002F;\n",[40,839,840],{"class":42,"line":77},[40,841,418],{},[40,843,844],{"class":42,"line":99},[40,845,125],{"emptyLinePlaceholder":124},[40,847,848],{"class":42,"line":121},[40,849,850],{},"location \u002Fmedia\u002F {\n",[40,852,853],{"class":42,"line":128},[40,854,855],{},"    alias \u002Fsrv\u002Fflask-app\u002Fmedia\u002F;\n",[40,857,858],{"class":42,"line":135},[40,859,418],{},[251,861],{},"Common mistakes:",[346,864,865,868,873],{},[231,866,867],{},"using a relative path",[231,869,870,871],{},"missing trailing slash with ",[18,872,815],{},[231,874,875,876,207,879,881],{},"mixing ",[18,877,878],{},"root",[18,880,815],{}," incorrectly for the same location",[251,883],{},"If static assets are the main issue, use ",[747,886,888],{"href":887},"\u002Ffix-issues\u002Fflask-static-files-not-loading-in-production","Flask Static Files Not Loading in Production",[231,890,891,894,896,897,933,935,936,952,954,955,318],{},[234,892,893],{},"Check SSL certificate directives",[251,895],{},"If the config includes HTTPS, verify certificate paths.",[31,898,900],{"className":375,"code":899,"language":377,"meta":36,"style":36},"server {\n    listen 443 ssl;\n    server_name example.com;\n\n    ssl_certificate \u002Fetc\u002Fletsencrypt\u002Flive\u002Fexample.com\u002Ffullchain.pem;\n    ssl_certificate_key \u002Fetc\u002Fletsencrypt\u002Flive\u002Fexample.com\u002Fprivkey.pem;\n}\n",[18,901,902,906,911,915,919,924,929],{"__ignoreMap":36},[40,903,904],{"class":42,"line":43},[40,905,384],{},[40,907,908],{"class":42,"line":58},[40,909,910],{},"    listen 443 ssl;\n",[40,912,913],{"class":42,"line":77},[40,914,440],{},[40,916,917],{"class":42,"line":99},[40,918,125],{"emptyLinePlaceholder":124},[40,920,921],{"class":42,"line":121},[40,922,923],{},"    ssl_certificate \u002Fetc\u002Fletsencrypt\u002Flive\u002Fexample.com\u002Ffullchain.pem;\n",[40,925,926],{"class":42,"line":128},[40,927,928],{},"    ssl_certificate_key \u002Fetc\u002Fletsencrypt\u002Flive\u002Fexample.com\u002Fprivkey.pem;\n",[40,930,931],{"class":42,"line":135},[40,932,418],{},[251,934],{},"Validate file paths:",[31,937,939],{"className":33,"code":938,"language":35,"meta":36,"style":36},"sudo ls -l \u002Fetc\u002Fletsencrypt\u002Flive\u002Fexample.com\u002F\n",[18,940,941],{"__ignoreMap":36},[40,942,943,945,947,949],{"class":42,"line":43},[40,944,47],{"class":46},[40,946,140],{"class":50},[40,948,143],{"class":54},[40,950,951],{"class":50}," \u002Fetc\u002Fletsencrypt\u002Flive\u002Fexample.com\u002F\n",[251,953],{},"Missing or invalid certificate files will fail ",[18,956,20],{},[231,958,959,962,964,965,984,344,986],{},[234,960,961],{},"Check for duplicate or conflicting server blocks",[251,963],{},"Search across all Nginx config files:",[31,966,968],{"className":33,"code":967,"language":35,"meta":36,"style":36},"sudo grep -R \"server_name\\|listen\\|default_server\" \u002Fetc\u002Fnginx\n",[18,969,970],{"__ignoreMap":36},[40,971,972,974,976,978,981],{"class":42,"line":43},[40,973,47],{"class":46},[40,975,154],{"class":50},[40,977,157],{"class":54},[40,979,980],{"class":50}," \"server_name\\|listen\\|default_server\"",[40,982,983],{"class":50}," \u002Fetc\u002Fnginx\n",[251,985],{},[346,987,988,995,1001,1004],{},[231,989,990,991,994],{},"duplicate ",[18,992,993],{},"server_name"," entries",[231,996,997,998],{},"multiple ",[18,999,1000],{},"listen 443 ssl default_server",[231,1002,1003],{},"duplicate enabled site symlinks",[231,1005,1006,1007],{},"conflicting test\u002Fstaging configs left in ",[18,1008,1009],{},"sites-enabled",[231,1011,1012,1015,1017,1018,1021,1022,1024,1025,1034,1036,1037],{},[234,1013,1014],{},"Check for unknown or unsupported directives",[251,1016],{},"If the error says ",[18,1019,1020],{},"unknown directive",", verify spelling and support in your installed Nginx version.",[251,1023],{},"Example typo:",[31,1026,1028],{"className":375,"code":1027,"language":377,"meta":36,"style":36},"prox_pass http:\u002F\u002F127.0.0.1:8000;\n",[18,1029,1030],{"__ignoreMap":36},[40,1031,1032],{"class":42,"line":43},[40,1033,1027],{},[251,1035],{},"Correct:",[31,1038,1039],{"className":375,"code":475,"language":377,"meta":36,"style":36},[18,1040,1041],{"__ignoreMap":36},[40,1042,1043],{"class":42,"line":43},[40,1044,475],{},[231,1046,1047,1050,1052,1053,1055,1056,1071,1073,1074],{},[234,1048,1049],{},"Inspect enabled symlinks",[251,1051],{},"A broken or duplicate symlink in ",[18,1054,1009],{}," can cause Nginx to read the wrong file.",[31,1057,1059],{"className":33,"code":1058,"language":35,"meta":36,"style":36},"sudo ls -l \u002Fetc\u002Fnginx\u002Fsites-enabled\u002F\n",[18,1060,1061],{"__ignoreMap":36},[40,1062,1063,1065,1067,1069],{"class":42,"line":43},[40,1064,47],{"class":46},[40,1066,140],{"class":50},[40,1068,143],{"class":54},[40,1070,146],{"class":50},[251,1072],{},"If needed, recreate the symlink:",[31,1075,1077],{"className":33,"code":1076,"language":35,"meta":36,"style":36},"sudo ln -s \u002Fetc\u002Fnginx\u002Fsites-available\u002Fyour-site \u002Fetc\u002Fnginx\u002Fsites-enabled\u002Fyour-site\n",[18,1078,1079],{"__ignoreMap":36},[40,1080,1081,1083,1086,1089,1092],{"class":42,"line":43},[40,1082,47],{"class":46},[40,1084,1085],{"class":50}," ln",[40,1087,1088],{"class":54}," -s",[40,1090,1091],{"class":50}," \u002Fetc\u002Fnginx\u002Fsites-available\u002Fyour-site",[40,1093,1094],{"class":50}," \u002Fetc\u002Fnginx\u002Fsites-enabled\u002Fyour-site\n",[231,1096,1097,1100,1102,1103,1115,1117,1118],{},[234,1098,1099],{},"Re-test and reload",[251,1101],{},"After each fix:",[31,1104,1105],{"className":33,"code":239,"language":35,"meta":36,"style":36},[18,1106,1107],{"__ignoreMap":36},[40,1108,1109,1111,1113],{"class":42,"line":43},[40,1110,47],{"class":46},[40,1112,51],{"class":50},[40,1114,55],{"class":54},[251,1116],{},"If validation passes:",[31,1119,1121],{"className":33,"code":1120,"language":35,"meta":36,"style":36},"sudo systemctl reload nginx\n",[18,1122,1123],{"__ignoreMap":36},[40,1124,1125,1127,1129,1131],{"class":42,"line":43},[40,1126,47],{"class":46},[40,1128,63],{"class":50},[40,1130,198],{"class":50},[40,1132,201],{"class":50},[231,1134,1135,1138,1140,1141,1165,1167,1168,318],{},[234,1136,1137],{},"Verify the site",[251,1139],{},"Test both HTTP and HTTPS if enabled:",[31,1142,1144],{"className":33,"code":1143,"language":35,"meta":36,"style":36},"curl -I http:\u002F\u002Fyour-domain\ncurl -Ik https:\u002F\u002Fyour-domain\n",[18,1145,1146,1155],{"__ignoreMap":36},[40,1147,1148,1150,1152],{"class":42,"line":43},[40,1149,779],{"class":46},[40,1151,782],{"class":54},[40,1153,1154],{"class":50}," http:\u002F\u002Fyour-domain\n",[40,1156,1157,1159,1162],{"class":42,"line":58},[40,1158,779],{"class":46},[40,1160,1161],{"class":54}," -Ik",[40,1163,1164],{"class":50}," https:\u002F\u002Fyour-domain\n",[251,1166],{},"If config validates but requests still fail, continue with ",[747,1169,1171],{"href":1170},"\u002Ffix-issues\u002Ffix-nginx-not-connecting-to-gunicorn-connection-refused","Fix: Nginx Not Connecting to Gunicorn (Connection Refused)",[23,1173,1175],{"id":1174},"common-causes","Common Causes",[346,1177,1178,1186,1201,1210,1219,1235,1248,1257,1263,1271],{},[231,1179,1180,1183,1184,318],{},[234,1181,1182],{},"Missing semicolon or unmatched brace"," → Nginx stops parsing the file → fix the exact line reported by ",[18,1185,20],{},[231,1187,1188,1191,1192,1194,1195,1197,1198,1200],{},[234,1189,1190],{},"Directive in the wrong context"," → Example: ",[18,1193,525],{}," or ",[18,1196,221],{}," placed outside ",[18,1199,529],{}," or invalid nesting → move it to a valid block.",[231,1202,1203,1206,1207,1209],{},[234,1204,1205],{},"Broken include path"," → ",[18,1208,550],{}," references a file that does not exist → correct the path or remove the include.",[231,1211,1212,1206,1215,1218],{},[234,1213,1214],{},"Invalid SSL certificate path",[18,1216,1217],{},"ssl_certificate"," or key file missing after Certbot\u002Fmanual changes → update paths and verify files exist.",[231,1220,1221,1224,1225,535,1227,1230,1231,1234],{},[234,1222,1223],{},"Duplicate server block settings"," → conflicting ",[18,1226,993],{},[18,1228,1229],{},"listen",", or ",[18,1232,1233],{},"default_server"," across enabled sites → remove duplicates or consolidate definitions.",[231,1236,1237,1243,1244,1247],{},[234,1238,1239,1240,1242],{},"Bad ",[18,1241,221],{}," syntax"," → malformed upstream URL or Unix socket syntax → use a valid ",[18,1245,1246],{},"http:\u002F\u002F127.0.0.1:8000;"," target or correct socket format.",[231,1249,1250,1253,1254,1256],{},[234,1251,1252],{},"Incorrect static\u002Fmedia alias"," → wrong ",[18,1255,815],{}," syntax or missing trailing slash causes parse\u002Fruntime issues → use absolute paths and consistent location blocks.",[231,1258,1259,1262],{},[234,1260,1261],{},"Unsupported or misspelled directive"," → directive not available in your installed Nginx version\u002Fmodule → replace or remove it.",[231,1264,1265,1270],{},[234,1266,1267,1268],{},"Broken symlink in ",[18,1269,1009],{}," → enabled config points to a missing file → recreate the symlink or disable the site.",[231,1272,1273,1276,1277,207,1280,1282],{},[234,1274,1275],{},"Edited the wrong file"," → config test reads a different enabled file than expected → inspect ",[18,1278,1279],{},"nginx -T",[18,1281,1009],{}," to find the active source.",[23,1284,1286],{"id":1285},"debugging-section","Debugging Section",[14,1288,1289],{},"Use these commands to isolate the failure:",[31,1291,1293],{"className":33,"code":1292,"language":35,"meta":36,"style":36},"sudo nginx -t\nsudo nginx -T\nsudo systemctl status nginx --no-pager -l\nsudo journalctl -u nginx -n 100 --no-pager\nsudo tail -n 100 \u002Fvar\u002Flog\u002Fnginx\u002Ferror.log\nsudo ls -l \u002Fetc\u002Fnginx\u002Fsites-enabled\u002F\nsudo find \u002Fetc\u002Fnginx -maxdepth 3 -type f | sort\nsudo grep -R \"server_name\\|listen\\|proxy_pass\\|include\\|ssl_certificate\\|ssl_certificate_key\" \u002Fetc\u002Fnginx\nsudo ls -l \u002Fetc\u002Fletsencrypt\u002Flive\u002Fyour-domain\u002F\nsudo ls -l \u002Frun\u002Fgunicorn.sock\ncurl -I http:\u002F\u002F127.0.0.1:8000\ncurl --unix-socket \u002Frun\u002Fgunicorn.sock http:\u002F\u002Flocalhost\u002F\n",[18,1294,1295,1303,1311,1325,1342,1356,1366,1386,1399,1410,1420,1428],{"__ignoreMap":36},[40,1296,1297,1299,1301],{"class":42,"line":43},[40,1298,47],{"class":46},[40,1300,51],{"class":50},[40,1302,55],{"class":54},[40,1304,1305,1307,1309],{"class":42,"line":58},[40,1306,47],{"class":46},[40,1308,51],{"class":50},[40,1310,283],{"class":54},[40,1312,1313,1315,1317,1319,1321,1323],{"class":42,"line":77},[40,1314,47],{"class":46},[40,1316,63],{"class":50},[40,1318,66],{"class":50},[40,1320,51],{"class":50},[40,1322,71],{"class":54},[40,1324,74],{"class":54},[40,1326,1327,1329,1331,1333,1335,1337,1340],{"class":42,"line":99},[40,1328,47],{"class":46},[40,1330,82],{"class":50},[40,1332,85],{"class":54},[40,1334,51],{"class":50},[40,1336,90],{"class":54},[40,1338,1339],{"class":54}," 100",[40,1341,96],{"class":54},[40,1343,1344,1346,1349,1351,1353],{"class":42,"line":121},[40,1345,47],{"class":46},[40,1347,1348],{"class":50}," tail",[40,1350,90],{"class":54},[40,1352,1339],{"class":54},[40,1354,1355],{"class":50}," \u002Fvar\u002Flog\u002Fnginx\u002Ferror.log\n",[40,1357,1358,1360,1362,1364],{"class":42,"line":128},[40,1359,47],{"class":46},[40,1361,140],{"class":50},[40,1363,143],{"class":54},[40,1365,146],{"class":50},[40,1367,1368,1370,1372,1374,1376,1378,1380,1382,1384],{"class":42,"line":135},[40,1369,47],{"class":46},[40,1371,563],{"class":50},[40,1373,566],{"class":50},[40,1375,569],{"class":54},[40,1377,572],{"class":54},[40,1379,575],{"class":54},[40,1381,578],{"class":50},[40,1383,110],{"class":109},[40,1385,583],{"class":46},[40,1387,1388,1390,1392,1394,1397],{"class":42,"line":149},[40,1389,47],{"class":46},[40,1391,154],{"class":50},[40,1393,157],{"class":54},[40,1395,1396],{"class":50}," \"server_name\\|listen\\|proxy_pass\\|include\\|ssl_certificate\\|ssl_certificate_key\"",[40,1398,983],{"class":50},[40,1400,1401,1403,1405,1407],{"class":42,"line":169},[40,1402,47],{"class":46},[40,1404,140],{"class":50},[40,1406,143],{"class":54},[40,1408,1409],{"class":50}," \u002Fetc\u002Fletsencrypt\u002Flive\u002Fyour-domain\u002F\n",[40,1411,1412,1414,1416,1418],{"class":42,"line":174},[40,1413,47],{"class":46},[40,1415,140],{"class":50},[40,1417,143],{"class":54},[40,1419,774],{"class":50},[40,1421,1422,1424,1426],{"class":42,"line":180},[40,1423,779],{"class":46},[40,1425,782],{"class":54},[40,1427,785],{"class":50},[40,1429,1430,1432,1434,1436],{"class":42,"line":683},[40,1431,779],{"class":46},[40,1433,792],{"class":54},[40,1435,795],{"class":50},[40,1437,798],{"class":50},[14,1439,1440],{},"What to look for:",[346,1442,1443,1449,1452,1455,1460,1465],{},[231,1444,1445,1448],{},[18,1446,1447],{},"nginx: [emerg]"," lines with exact file and line number",[231,1450,1451],{},"missing include targets",[231,1453,1454],{},"wrong SSL file paths",[231,1456,1457,1458],{},"unexpected active site configs in ",[18,1459,1009],{},[231,1461,1462,1463,1242],{},"malformed ",[18,1464,221],{},[231,1466,1467],{},"direct Gunicorn access working while Nginx still fails, which indicates an Nginx-only issue",[14,1469,1470,1471,318],{},"If Nginx passes validation but upstream requests fail, check ",[747,1472,1171],{"href":1170},[23,1474,1476],{"id":1475},"checklist","Checklist",[346,1478,1481,1500,1506,1515,1523,1529,1540,1549,1555],{"className":1479},[1480],"contains-task-list",[231,1482,1485,1489,1490,1493,1494,207,1497],{"className":1483},[1484],"task-list-item",[1486,1487],"input",{"disabled":124,"type":1488},"checkbox"," ",[18,1491,1492],{},"sudo nginx -t"," returns ",[18,1495,1496],{},"syntax is ok",[18,1498,1499],{},"test is successful",[231,1501,1503,1505],{"className":1502},[1484],[1486,1504],{"disabled":124,"type":1488}," The failing file and line were reviewed and corrected",[231,1507,1509,1511,1512,1514],{"className":1508},[1484],[1486,1510],{"disabled":124,"type":1488}," All ",[18,1513,550],{}," paths reference existing files",[231,1516,1518,1489,1520,1522],{"className":1517},[1484],[1486,1519],{"disabled":124,"type":1488},[18,1521,221],{}," target matches the running Gunicorn port or socket",[231,1524,1526,1528],{"className":1525},[1484],[1486,1527],{"disabled":124,"type":1488}," SSL certificate and key paths exist if HTTPS is enabled",[231,1530,1532,1534,1535,1194,1537,1539],{"className":1531},[1484],[1486,1533],{"disabled":124,"type":1488}," Static and media ",[18,1536,878],{},[18,1538,815],{}," paths are valid absolute paths",[231,1541,1543,1545,1546],{"className":1542},[1484],[1486,1544],{"disabled":124,"type":1488}," Nginx reload succeeds with ",[18,1547,1548],{},"sudo systemctl reload nginx",[231,1550,1552,1554],{"className":1551},[1484],[1486,1553],{"disabled":124,"type":1488}," The Flask app responds through Nginx over HTTP or HTTPS as expected",[231,1556,1558,1560,1561],{"className":1557},[1484],[1486,1559],{"disabled":124,"type":1488}," Final production checks are complete using ",[747,1562,1564],{"href":1563},"\u002Fchecklist\u002Fflask-production-checklist-everything-you-must-do","Flask Production Checklist (Everything You Must Do)",[23,1566,1568],{"id":1567},"related-guides","Related Guides",[346,1570,1571,1575,1579,1583],{},[231,1572,1573],{},[747,1574,750],{"href":749},[231,1576,1577],{},[747,1578,1171],{"href":1170},[231,1580,1581],{},[747,1582,888],{"href":887},[231,1584,1585],{},[747,1586,1564],{"href":1563},[23,1588,1590],{"id":1589},"faq","FAQ",[14,1592,1593,1596,1598,1599,1601],{},[234,1594,1595],{},"Q: What is the fastest way to find the broken Nginx config?",[251,1597],{},"\nA: Run ",[18,1600,1492],{}," first. It usually prints the exact file and line number causing the failure.",[14,1603,1604,1610,1612],{},[234,1605,1606,1607,1609],{},"Q: Does a failed ",[18,1608,20],{}," mean my Flask app is broken?",[251,1611],{},"\nA: Not necessarily. It means the new Nginx config cannot be validated. Gunicorn or Flask may still be running normally behind it.",[14,1614,1615,1618,1620],{},[234,1616,1617],{},"Q: Why does Nginx complain about a file I did not edit?",[251,1619],{},"\nA: Nginx loads included files and enabled site symlinks. The actual failing directive may be in an included snippet or another enabled server block.",[14,1622,1623,1629,1631],{},[234,1624,1625,1626,1628],{},"Q: Can I reload Nginx if ",[18,1627,20],{}," fails?",[251,1630],{},"\nA: No. Fix the validation error first. Reload only after the config test succeeds.",[14,1633,1634,1637,1639,1640,1642,1643,1645],{},[234,1635,1636],{},"Q: How do I check whether the issue is Nginx or Gunicorn?",[251,1638],{},"\nA: Validate Nginx syntax with ",[18,1641,20],{},", then test the Gunicorn port or socket directly with ",[18,1644,779],{},". If direct Gunicorn access works, focus on Nginx config.",[14,1647,1648,1654,1656],{},[234,1649,1650,1651,1653],{},"Q: Why does ",[18,1652,20],{}," fail but Nginx is still serving traffic?",[251,1655],{},"\nA: The current running config remains active until a reload or restart applies the new broken config.",[14,1658,1659,1665,1667],{},[234,1660,1661,1662,1664],{},"Q: What does ",[18,1663,1020],{}," mean?",[251,1666],{},"\nA: The directive is misspelled, placed in the wrong context, or unsupported by your installed Nginx build or version.",[14,1669,1670,1673,1675,1676,1194,1678,1681],{},[234,1671,1672],{},"Q: Can a missing SSL file break config validation?",[251,1674],{},"\nA: Yes. Invalid ",[18,1677,1217],{},[18,1679,1680],{},"ssl_certificate_key"," paths will fail the config test.",[14,1683,1684,1690,1692],{},[234,1685,1686,1687,1689],{},"Q: Can a bad Gunicorn socket path fail ",[18,1688,20],{},"?",[251,1691],{},"\nA: Usually not unless the syntax is malformed; it more commonly causes runtime upstream errors after Nginx starts.",[14,1694,1695,1705,1707,1708,1710,1711,1713],{},[234,1696,1697,1698,1194,1701,1704],{},"Q: Should I use ",[18,1699,1700],{},"reload",[18,1702,1703],{},"restart"," after fixing config?",[251,1706],{},"\nA: Use ",[18,1709,1700],{}," after ",[18,1712,20],{}," passes so the active process updates without a full stop.",[23,1715,1717],{"id":1716},"final-takeaway","Final Takeaway",[14,1719,1720,1721,1723,1724,1726],{},"An Nginx config test failure is usually resolved by reading the exact file and line from ",[18,1722,20],{},", correcting syntax or file path issues, validating the merged config with ",[18,1725,1279],{},", and only then reloading Nginx. For Flask deployments, the most common breakpoints are proxy targets, include files, static aliases, SSL paths, and duplicate server definitions.",[1728,1729,1730],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}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);}",{"title":36,"searchDepth":58,"depth":58,"links":1732},[1733,1734,1735,1736,1737,1738,1739,1740,1741],{"id":25,"depth":58,"text":26},{"id":214,"depth":58,"text":215},{"id":225,"depth":58,"text":226},{"id":1174,"depth":58,"text":1175},{"id":1285,"depth":58,"text":1286},{"id":1475,"depth":58,"text":1476},{"id":1567,"depth":58,"text":1568},{"id":1589,"depth":58,"text":1590},{"id":1716,"depth":58,"text":1717},"Complete guide on flask nginx config test failed (fix guide) for Flask production environments.","md",{"ogTitle":5,"ogDescription":1742,"twitterCard":1745,"robots":1746,"canonical":1747},"summary_large_image","index, follow","https:\u002F\u002Fflask-deployment.com\u002Ffix-issues\u002Fflask-nginx-config-test-failed-fix-guide","\u002Ffix-issues\u002Fflask-nginx-config-test-failed-fix-guide",{"title":5,"description":1742},"fix-issues\u002Fflask-nginx-config-test-failed-fix-guide","QP5_uIElofrvixGczRViwSwvfIJ8Fp0iygU_ZqRl9v4",1776805766566]