Nginx 使用域名反向代理报 400 Request Header Or Cookie Too Large 解决方案

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx 使用域名反向代理报 400 Request Header Or Cookie Too Large 解决方案相关的知识,希望对你有一定的参考价值。

参考技术A 反向代理报错

> 400 Request Header Or Cookie Too Large

假设需要重定向到 api.jianshu.com

报错的配置如下:

修改为:

即可.

猜测,参考引用:   nginx配置反向代理或跳转出现400问题处理记录

干货|基于nginx反向代理的同IP多域名解析

每天读一篇一线开发者原创好文

▍作者简介:

朱磊是开源软件爱好者,致力于网站部署、运维领域解决方案的研究。这篇文章主要讲述了如何使用nginx在有限的IP资源下进行多域名服务器的部署设计、实现与测试,希望对网站部署、运维人员能有所帮助。


基于nginx反向代理的同IP多域名解析


1 网站架构变化

一般情况下,不存在关联的多个网站的架构为:

干货|基于nginx反向代理的同IP多域名解析

2 nginx的安装与使用

yum安装nginx

 
   
   
 
  1. #因nginx的依赖关系较多,建议采取yum的安装方式

  2. yum install nginx

nginx的配置文件为

 
   
   
 
  1. /etc/nginx/nginx.conf

nginx的启动与停止

 
   
   
 
  1. #开启nginx,默认配置文件为/etc/nginx/nginx.conf

  2. nginx

  3. #重启加载nginx配置

  4. nginx -s reload

  5. #重启nginx

  6. nginx -s reopen

  7. #优雅的关闭nginx,完成当前请求

  8. nginx -s quit

  9. #快速关闭nginx

  10. nginx -s stop

3 nginx反向代理配置

修改主配置文件/etc/nginx/nginx.conf

 
   
   
 
  1. user root root;

  2. worker_processes auto; #由nginx自己判断最适合的工作进程数

  3. error_log  /var/log/nginx/error.log; #nginx错误日志

  4. pid /run/nginx.pid;

  5. include /usr/share/nginx/modules/*.conf;

  6. events {

  7.    use epoll;

  8.    worker_connections 1024;

  9. }

  10. http {

  11.    include       /etc/nginx/mime.types;

  12.    default_type application/octet-stream;

  13.    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

  14.                      '$status $body_bytes_sent "$http_referer" '

  15.                      '"$http_user_agent" "$http_x_forwarded_for"'; #nginx日志格式

  16.    access_log  /var/log/nginx/access.log  main; #nginx访问日志

  17.    client_max_body_size 200M;    #代理用户请求缓冲区大小

  18.    sendfile on;

  19.    keepalive_timeout 65;

  20.    gzip on;

  21.    client_body_buffer_size 256k;

  22.    client_header_timeout 3m;

  23.    client_body_timeout 3m;

  24.    send_timeout 3m;

  25.    proxy_connect_timeout 300s; #反向代理连接超时时间

  26.    proxy_read_timeout 300s;

  27.    proxy_send_timeout 300s;

  28.    proxy_buffer_size 64k;

  29.    proxy_buffers 4 32k;

  30.    proxy_busy_buffers_size 64k;

  31.    proxy_temp_file_write_size 64k;

  32.    proxy_ignore_client_abort on;

  33.    include /etc/nginx/conf.d/*.conf; #各个代理分开配置,便于扩展

  34. }

修改各个代理配置文件/etc/nginx/conf.d/*.conf

 
   
   
 
  1. vim /etc/nginx/conf.d/a.conf

  2. server

  3. {

  4.    listen 80;

  5.    server_name www.a.com; #定义访问域名

  6.    location / {

  7.        proxy_redirect off;

  8.        proxy_set_header X-Real-IP $remote_addr;

  9.        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  10.    }

  11.    access_log /var/log/web/a.log; #指定nginx访问日志

  12. }

  13. vim /etc/nginx/conf.d/b.conf

  14. server

  15. {

  16.    listen 80;

  17.    server_name www.b.com;

  18.    location / {

  19.        proxy_redirect off;

  20.        proxy_set_header Host $host;

  21.        proxy_set_header X-Real-IP $remote_addr;

  22.        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  23.        proxy_pass http://192.168.1.12:80;

  24.    }

  25.    access_log /var/log/web/b.log;

  26. }    

  27. vim /etc/nginx/conf.d/c.conf

  28. server

  29. {

  30.    listen 80;

  31.    server_name www.c.com;

  32.    location / {

  33.        proxy_redirect off;

  34.        proxy_set_header Host $host;

  35.        proxy_set_header X-Real-IP $remote_addr;

  36.        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  37.        proxy_pass http://192.168.1.13:80;

  38.    }

  39.    access_log /var/log/web/c.log;

  40. }

将配置文件置于/conf.d/ 文件夹下是为了方便扩展,后期如果有新增域名,直接新增配置文件重新加载nginx配置文件即可。


4 多域名解析测试

4.1 真实域名和公网IP的测试


4.2 基于内网DNS的解析测试

DNS服务器的搭建

参考文档:在Windows7 系统上部署DNS服务器,http://blog.csdn.net/hyman_c/article/details/53560891
修改域名解析配置文件name.conf:

 
   
   
 
  1. #增加如下解析配置

  2. // a.com  

  3. zone "a.com" IN {  

  4.    type master;  

  5.    file "a.com.zone";  

  6. };

  7. // b.com  

  8. zone "b.com" IN {  

  9.    type master;  

  10.    file "b.com.zone";  

  11. };

  12. // c.com  

  13. zone "c.com" IN {  

  14.    type master;  

  15.    file "c.com.zone";  

  16. };

新增配置文件:a.com.zone、b.com.zone、c.com.zone

 
   
   
 
  1. #a.com.zone

  2. a.com.    IN  SOA   ns1.a.com.  root.a.com. (  

  3.        2007091701         ; Serial  

  4.        30800              ; Refresh  

  5.        7200               ; Retry  

  6.        604800             ; Expire  

  7.        300 )              ; Minimum  

  8.        IN    NS        ns1.a.com.  

  9. *       IN    A         192.168.1.10

  10. #b.com.zone

  11. b.com.    IN  SOA   ns1.b.com.  root.b.com. (  

  12.        2007091701         ; Serial  

  13.        30800              ; Refresh  

  14.        7200               ; Retry  

  15.        604800             ; Expire  

  16.        300 )              ; Minimum  

  17.        IN    NS        ns1.b.com.  

  18. *       IN    A         192.168.1.10

  19. #c.com.zone

  20. c.com.    IN  SOA   ns1.c.com.  root.c.com. (  

  21.        2007091701         ; Serial  

  22.        30800              ; Refresh  

  23.        7200               ; Retry  

  24.        604800             ; Expire  

  25.        300 )              ; Minimum  

  26.        IN    NS        ns1.c.com.  

  27. *       IN    A         192.168.1.10

在win7上将DNS服务器设置为:127.0.0.1,即可完成DNS服务器的配置。

访问测试

在这台win7电脑上,直接浏览器访问www.a/b/c.com域名,能够正常访问各自的网站,完成验证。


5 nginx服务器其他主题探讨

5.1 nginx服务器双机问题

当使用nginx代理多个网站时,nginx服务器本身的稳定性就显得尤为重要,我们可以选择keepalived软件搭建高可用的nginx双机环境。

关于使用keepalived进行nginx双机的进一步讨论,可见文档:keepalived介绍及nginx双机热备的实现,https://dev.zte.com.cn/topic/#/38590


5.2 网站服务器负载均衡问题

前面提到的网站均只有一个服务器,当网站访问量上升以后就需要搭建网站服务器集群,而此时也需要在nginx服务器上做出对应的配置,以网站www.a.com为例,修改配置文件:/etc/nginx/conf.d/a.conf

 
   
   
 
  1. upstream www.a.com {

  2.    server 192.168.1.111;

  3.    server 192.168.1.112;

  4. }

  5. server

  6. {

  7.    listen 80;

  8.    server_name www.a.com; #定义访问域名

  9.    location / {

  10.        proxy_redirect off;

  11.        proxy_set_header Host $host;

  12.        proxy_set_header X-Real-IP $remote_addr;

  13.        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  14.        proxy_pass http://www.a.com;

  15.    }

  16.    access_log /var/log/web/a.log; #指定nginx访问日志

  17. }

即在配置文件中增加upstream配置网站服务器集群,然后重新载入nginx配置文件。

关于负载均衡的策略等问题的进一步探讨,可见文档:nginx负载均衡介绍及后端节点宕机的处理,https://dev.zte.com.cn/topic/#/38195


参考资料

  1. 搭建nginx反向代理用做内网域名转发,http://www.ttlsa.com/nginx/use-nginx-proxy/

  2. nginx 域名跳转一例~~~(rewrite、proxy),http://blog.51cto.com/storysky/486338

  3. Nginx多域名多Server反向代理配置,https://www.cnblogs.com/tonykan/p/3507082.html

  4. 在Windows7 系统上部署DNS服务器,http://blog.csdn.net/hyman_c/article/details/53560891


如有疑问,欢迎交流

以上是关于Nginx 使用域名反向代理报 400 Request Header Or Cookie Too Large 解决方案的主要内容,如果未能解决你的问题,请参考以下文章

Ngnix技术研究系列1-通过应用场景看Nginx的反向代理

nginx反向代理为啥不成功

Nginx反向代理400错误

Nginx反向代理400错误

nginx 反向代理支持域名吗

nginx 80端口反向代理多个域名,怎样隐藏端口的