亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > Nginx > 正文

記一次nginx中proxy_pass的使用問題

2024-08-30 12:29:38
字體:
來源:轉載
供稿:網友

最近排查一個web服務的問題,webserver使用的nginx,最終發現是踩了nginx中proxy_pass的一個坑,這里記錄下來。

踩坑經過

一個線上的http服務,示例nginx關鍵配置如下:

server {  listen 80;  server_name ligang.gdemo.com;  server_tokens off;  keepalive_timeout 5;  charset utf-8;  include /home/ligang/devspace/gobox-demo/conf/http/general/gzip.conf;  access_log logs/ligang.gdemo.com.log combinedio buffer=1k;  error_log logs/ligang.gdemo.com.log.err;  location / {    include /home/ligang/devspace/gobox-demo/conf/http/general/http_proxy.conf;    proxy_intercept_errors on;    proxy_pass http://ligang.proxy.gdemo.com;  }}

這里可以看到,請求 ligang.gdemo.com 時,nginx把請求反向代理到 ligang.proxy.gdemo.com 去做處理。

ligang.proxy.gdemo.com 這個服務在線上部署并解析到了A、B、C這3個機房,現在我想調整解析,去掉C機房,僅留A、B兩個機房。

調整解析后,查看新的解析已經生效,但觀察C機房的請求量,發現和之前一樣,沒有任何變化。

于是我觀察C機房的nginx的log,發現請求來源還是 ligang.gdemo.com 的機器,域名解析調整后nginx那邊依舊使用之前的IP。

于是我將 ligang.gdemo.com 的機器上的nginx全部reload后,C機房的請求終于沒有了。

問題說明

上面的問題,說明在nginx的proxy_pass中如果使用了域名,那么nginx會把解析的結果緩存下來,貌似不會更新,因為上面的例子中,我調整解析后是幾乎是隔了一天去看C機房的log發現流量沒有任何變化的。

這樣的話,如果你配置一個反向代理服務器,如果上游調整了域名,而你又沒有得到通知,那么你的代理服務相當于不可用了。

從代碼中看下nginx是如何解析主機ip的

有點好奇nginx是如何解析主機ip的,所以追蹤下代碼:

proxy_pass指令定義的地方(http/modules/ngx_http_proxy_module.c):

{ ngx_string("proxy_pass"),   NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_TAKE1,   ngx_http_proxy_pass,    //處理方法   NGX_HTTP_LOC_CONF_OFFSET,   0,     NULL },

ngx_http_proxy_pass方法(http/modules/ngx_http_proxy_module.c):

static char *ngx_http_proxy_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf){  ngx_http_proxy_loc_conf_t *plcf = conf;  size_t           add;  u_short           port;  ngx_str_t         *value, *url;  ngx_url_t          u;  ngx_uint_t         n;  ngx_http_core_loc_conf_t  *clcf;  ngx_http_script_compile_t  sc; ......  url = &value[1]; ...... ngx_memzero(&u, sizeof(ngx_url_t));  u.url.len = url->len - add;  u.url.data = url->data + add;  u.default_port = port;  u.uri_part = 1;  u.no_resolve = 1; plcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0);}

這里繼續追蹤ngx_http_upstream_add方法(http/ngx_http_upstream.c):

ngx_http_upstream_srv_conf_t *ngx_http_upstream_add(ngx_conf_t *cf, ngx_url_t *u, ngx_uint_t flags){  ngx_uint_t           i;  ngx_http_upstream_server_t   *us;  ngx_http_upstream_srv_conf_t  *uscf, **uscfp;  ngx_http_upstream_main_conf_t *umcf;  if (!(flags & NGX_HTTP_UPSTREAM_CREATE)) {    if (ngx_parse_url(cf->pool, u) != NGX_OK) {      if (u->err) {        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,                  "%s in upstream /"%V/"", u->err, &u->url);      }

繼續追蹤ngx_parse_url方法(core/ngx_inet.c):

ngx_int_tngx_parse_url(ngx_pool_t *pool, ngx_url_t *u){  u_char *p;               p = u->url.data;    if (ngx_strncasecmp(p, (u_char *) "unix:", 5) == 0) {    return ngx_parse_unix_domain_url(pool, u);  }      if (p[0] == '[') {    return ngx_parse_inet6_url(pool, u);  }                       return ngx_parse_inet_url(pool, u);}

然后是ngx_parse_inet_url方法(core/ngx_inet.c):

static ngx_int_tngx_parse_inet_url(ngx_pool_t *pool, ngx_url_t *u){......  if (ngx_inet_resolve_host(pool, u) != NGX_OK) {    return NGX_ERROR;  }......}

然后是ngx_inet_resolve_host方法(core/ngx_inet.c):

#if (NGX_HAVE_GETADDRINFO && NGX_HAVE_INET6)                      ngx_int_t                                     ngx_inet_resolve_host(ngx_pool_t *pool, ngx_url_t *u)               {......  if (getaddrinfo((char *) host, NULL, &hints, &res) != 0) {    u->err = "host not found";    ngx_free(host);    return NGX_ERROR;  }......}#else /* !NGX_HAVE_GETADDRINFO || !NGX_HAVE_INET6 */ngx_int_tngx_inet_resolve_host(ngx_pool_t *pool, ngx_url_t *u){......    h = gethostbyname((char *) host);......}

思考下如何解決這個問題

最簡單的解決方法,我想到如下幾種:

執行 nginx reload

這種方法優缺點都很明顯:

優點:操作簡單。

缺點:屬于我們常說的后手,需要做好監控。

配置resolver

可以通過在nginx中配置resolver來動態更新解析,大致做法如下:

server {    listen   80;    server_name ligang.gdemo.com;    resolver 8.8.8.8 valid=60s;    resolver_timeout 3s;    set $gproxy "ligang.proxy.gdemo.com";    location / {     proxy_pass http://$gproxy;    }  }

這個方法優缺點如下:

優點:解析地址每隔一段時間自動更新,無需人工做 nginx reload 。

缺點:需要指定DNS服務器地址,如果這個服務器掛了,或是地址變了,則需要修改nginx配置后reload。

結束語

上面這兩個方法是無須額外開發,直接簡單可用的,成本上比較低,但都有不完美的地方。

這里我想到是否可以自行開發一個nginx擴展,用來動態更新從DNS獲取的IP地址,這樣就能解決這個問題了,但有一定的開發成本,但個人覺得對提升技術能力又很有價值。

如果大家有什么好方法,也歡迎來一起討論。以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到服務器教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人免费av电影| 亚洲深夜福利网站| 中文字幕av一区| 国产乱人伦真实精品视频| 欧美激情中文字幕乱码免费| 国产福利精品在线| 日韩视频免费在线观看| 日本高清+成人网在线观看| 91久久久久久久一区二区| 亚洲人成在线观| 欧美日韩成人免费| 欧美成人自拍视频| 精品国产一区二区三区四区在线观看| 日韩在线欧美在线国产在线| 久久99精品久久久久久青青91| 91精品国产九九九久久久亚洲| 亚洲第一区中文99精品| 国产精品夫妻激情| 久久久久国产精品www| 色妞一区二区三区| 久久青草精品视频免费观看| 成人亚洲综合色就1024| 91av成人在线| 97人洗澡人人免费公开视频碰碰碰| 国产97在线视频| 国产深夜精品福利| 亚洲欧美制服另类日韩| 久久久国产精彩视频美女艺术照福利| 免费97视频在线精品国自产拍| 亚洲va欧美va国产综合久久| 国产成人综合一区二区三区| 欧美日韩中文字幕在线视频| 欧美激情a∨在线视频播放| 国产精品亚洲激情| 亚洲一区二区黄| 777午夜精品福利在线观看| 色先锋久久影院av| www.久久久久久.com| 在线观看免费高清视频97| 亚洲情综合五月天| 亚洲欧美另类自拍| 中文字幕精品视频| 国产亚洲欧洲在线| 疯狂欧美牲乱大交777| 欧美激情精品久久久久| 岛国av在线不卡| 国产精品久久久久久av| 性欧美长视频免费观看不卡| 欧美巨猛xxxx猛交黑人97人| 亚洲国语精品自产拍在线观看| 亚洲国内精品在线| 秋霞av国产精品一区| 成人免费视频a| 亚洲成人精品久久久| 亚洲午夜性刺激影院| 色爱精品视频一区| 久久久噜噜噜久久中文字免| 久久久久久久香蕉网| 一夜七次郎国产精品亚洲| 亚洲精品美女在线| 欧美激情一级欧美精品| 欧美成人免费全部观看天天性色| 热久久这里只有| 日韩电影免费观看在线| 九九热精品在线| 一个人看的www久久| 亚洲嫩模很污视频| 亚洲欧美www| 亚洲免费一在线| 亚洲国产成人精品久久久国产成人一区| 国产成人精品在线视频| 国产精品三级网站| 欧美午夜精品久久久久久人妖| 日韩国产精品视频| 另类图片亚洲另类| 国产三级精品网站| 欧美精品成人91久久久久久久| 久久五月天色综合| 欧美中在线观看| 久久国产视频网站| 亚洲人成网站在线播| 中文字幕欧美在线| 日韩精品免费在线视频| 91精品国产自产在线| 国产精品美女久久久久久免费| 亚洲无亚洲人成网站77777| 91午夜理伦私人影院| 2025国产精品视频| 91色琪琪电影亚洲精品久久| 中文字幕亚洲欧美日韩2019| 国产午夜一区二区| 美女999久久久精品视频| 日韩精品在线观看视频| 国产精品高潮呻吟久久av黑人| 欧美成人免费va影院高清| 亚洲国产美女精品久久久久∴| 91色在线观看| 久久久久久久久久久免费| 欧美精品免费播放| 美女视频黄免费的亚洲男人天堂| 中文字幕av一区| 亚洲欧美激情四射在线日| 精品久久香蕉国产线看观看亚洲| 日韩精品免费一线在线观看| 欧美日韩在线影院| 亚洲成av人乱码色午夜| 亚洲一区二区三区777| 国产999精品久久久影片官网| 亚洲人成电影网站| 久久亚洲精品网站| 日韩av中文字幕在线免费观看| 在线精品视频视频中文字幕| 亚洲精品国产精品国产自| 亚洲无av在线中文字幕| 欧美国产视频一区二区| 中文字幕少妇一区二区三区| 欧美性色xo影院| 亚洲黄色www| 91av福利视频| 日韩精品丝袜在线| 国产精品久久久久久久久男| 欧美一级电影免费在线观看| 日韩一二三在线视频播| 大量国产精品视频| 91中文字幕在线观看| 国产日韩av在线| 久久久成人精品| 国产精品网站视频| 亚洲xxxx3d| 91系列在线观看| 国产不卡av在线免费观看| 日本亚洲欧美三级| www国产亚洲精品久久网站| 久久精品成人欧美大片古装| 亚洲国产成人久久| 亚洲美女动态图120秒| 57pao成人国产永久免费| 亚洲女人天堂网| 日韩精品视频在线| 国产精品99久久久久久久久| 亚洲成人免费网站| 8090成年在线看片午夜| 国产精品丝袜久久久久久不卡| 91黑丝在线观看| 欧美午夜美女看片| 国产69久久精品成人| 久久全国免费视频| 国产精品av在线| 国产日韩在线亚洲字幕中文| 久久精品国产96久久久香蕉| 久久91精品国产| 亚洲精品电影在线观看| 久久久久国产精品www| 日韩视频中文字幕| 欧美一区二区大胆人体摄影专业网站| 精品性高朝久久久久久久| 国产精品久久电影观看| 欧美放荡办公室videos4k| 黑人精品xxx一区一二区| 亚洲精品suv精品一区二区| 日本19禁啪啪免费观看www| 亚洲欧洲一区二区三区久久| 欧美视频在线观看免费网址| 8090理伦午夜在线电影|