nginx反向代理

 

image

image

 


 
 
  1. server
  2. {
  3. listen 80;
  4. server_name www.test.com;
  5. location /
  6. {
  7. proxy_pass http://127.0.0.1:8080/;
  8. proxy_set_header Host $host;
  9. proxy_set_header X-Real-IP $remote_addr;
  10. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  11. }
  12. }
  13. ~ #当没有proxy_set_header Host $host时 只会反向代理到http://127.0.0.1:8080/,
  14. #即访问的是8080默认规则,加了proxy_set_header则访问到 http://www.test.com/,这里的Host就是#server_name
  15. [root@k8s-node01 vhost] # vi www.test.conf
  16. server
  17. {
  18. listen 8080 default_server;
  19. server_name www.test.com;
  20. root /data/wwwroot/test.com;
  21. index index.html;
  22. }
  23. [root@k8s-node01 vhost] # echo "test 8080" >/data/wwwroot/test.com/index.html
  24. test /data/wwwroot/test.com/index.html
  25. [root@k8s-node01 vhost] # /usr/local/nginx/sbin/nginx -t
  26. [root@k8s-node01 vhost] # /usr/local/nginx/sbin/nginx -s reload
  27. [root@k8s-node01 vhost] # curl -x127.0.0.1:8080
  28. test 8080
  29. [root@k8s-node01 test.com] # curl -x127.0.0.1:80 www.test.com
  30. test 8080
  31. #结果一致

1. proxy_pass


 
 
  1. 在正向代理中,已经使用过该指令。
  2. 格式很简单: proxy_pass URL;
  3. 其中URL包含:传输协议(http://, https://等)、主机名(域名或者IP:PORT)、uri。
  4. 示例如下:
  5. proxy_pass http://www.lsylinux.com/;
  6. proxy_pass http://192.168.200.101:8080/uri;
  7. proxy_pass unix:/tmp/www.sock;
  8. 对于proxy_pass的配置有几种情况需要注意。
  9. 示例2:
  10. location /lsy/
  11. {
  12. proxy_pass http://192.168.1.10;
  13. ...
  14. }
  15. 示例3:
  16. location /lsy/
  17. {
  18. proxy_pass http://192.168.1.10/;
  19. ...
  20. }
  21. 示例4:
  22. location /lsy/
  23. {
  24. proxy_pass http://192.168.1.10/linux/;
  25. ...
  26. }
  27. 示例5:
  28. location /lsy/
  29. {
  30. proxy_pass http://192.168.1.10/linux;
  31. ...
  32. }
  33. 假设server_name为www.lsylinux.com
  34. 当请求http://www.lsylinux.com/lsy/a.html的时候,以上示例2-5分别访问的结果是
  35. 示例2:http://192.168.1.10/lsy/a.html
  36. 示例3:http://192.168.1.10/a.html
  37. 示例4:http://192.168.1.10/linux/a.html
  38. 示例5:http://192.168.1.10/linuxa.html

2. proxy_set_header


 
 
  1. proxy_set_header用来设定被代理服务器接收到的header信息。
  2. 语法:proxy_set_header field value;
  3. field为要更改的项目,也可以理解为变量的名字,比如host
  4. value为变量的值
  5. 如果不设置proxy_set_header,则默认host的值为proxy_pass后面跟的那个域名或者IP(一般写IP),
  6. 比如示例4,请求到后端的服务器上时,完整请求uri为:http://192.168.1.10/linux/a.html
  7. 如果设置proxy_set_header,如 proxy_set_header host $host;
  8. 比如示例4,请求到后端的服务器完整uri为:http://www.lsylinux.com/linux/a.html
  9. proxy_set_header X-Real-IP $remote_addr;和proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  10. 用来设置被代理端接收到的远程客户端IP,如果不设置,则header信息中并不会透传远程真实客户端的IP地址。
  11. 可以用如下示例来测试:
  12. 示例6(被代理端)
  13. server{
  14. listen 8080;
  15. server_name www.lsylinux.com;
  16. root /tmp/123.com_8080;
  17. index index.html;
  18. location /linux/ {
  19. echo "$host";
  20. echo $remote_addr;
  21. echo $proxy_add_x_forwarded_for;
  22. }
  23. }
  24. 示例7(代理服务器上)
  25. server {
  26. listen 80;
  27. server_name www.lsylinux.com;
  28. location /aming/
  29. {
  30. proxy_pass http://192.168.1.10:8080/linux/;
  31. proxy_set_header host $host;
  32. proxy_set_header X-Real-IP $remote_addr;
  33. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  34. }
  35. }

3. proxy_redirect


 
 
  1. 该指令用来修改被代理服务器返回的响应头中的Location头域和“refresh”头域。
  2. 语法结构为:
  3. proxy_redirect redirect replacement;
  4. proxy_redirect default;
  5. proxy_redirect off;
  6. 示例8:
  7. server {
  8. listen 80;
  9. server_name www.lsylinux.com;
  10. index index.html;
  11. location /
  12. {
  13. proxy_pass http://127.0.0.1:8080;
  14. proxy_set_header host $host;
  15. proxy_set_header X-Real-IP $remote_addr;
  16. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  17. }
  18. }
  19. 当请求的链接为 http://www.lsylinux.com/lsy
  20. 结果会返回301,定向到了 http://www.lsylinux.com:8080/lsy/
  21. 注意:返回301有几个先决条件
  22. 1. location后面必须是/;
  23. 2. proxy_pass后面的URL不能加uri,只能是IP或者IP:port结尾,并不能以/结尾;
  24. 3. 访问的uri必须是一个真实存在的目录,如,这里的lsy必须是存在的
  25. 4. 访问的时候,不能以/结尾,只能是 www.lsylinux.com/aming
  26. 虽然,这4个条件挺苛刻,但确实会遇到类似的请求。解决方法是,加一行proxy_redirect http:// $host:8080/ /;
  27. 示例9:
  28. server {
  29. listen 80;
  30. server_name www.lsylinux.com;
  31. index index.html;
  32. location /
  33. {
  34. proxy_pass http://127.0.0.1:8080;
  35. proxy_set_header host $host;
  36. proxy_redirect http:// $host:8080/ /;
  37. proxy_set_header X-Real-IP $remote_addr;
  38. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  39. }
  40. }

nginx的proxy_buffering和proxy_cache

两个都是nginx代理中内存设置相关的参数。
 
 

proxy_buffering设置


 
 
  1. proxy_buffering主要是实现被代理服务器的数据和客户端的请求异步。
  2. 为了方便理解,我们定义三个角色,A为客户端,B为代理服务器,C为被代理服务器。
  3. 当proxy_buffering开启,A发起请求到B,B再到C,C反馈的数据先到B的buffer上,
  4. 然后B会根据proxy_busy_buffer_size来决定什么时候开始把数据传输给A。在此过程中,如果所有的buffer被写满,
  5. 数据将会写入到temp_file中。
  6. 相反,如果proxy_buffering关闭,C反馈的数据实时地通过B传输给A。

 
 
  1. 1. proxy_buffering on;
  2. 该参数设置是否开启proxy的buffer功能,参数的值为on或者off。
  3. 如果这个设置为off,那么proxy_buffers和proxy_busy_buffers_size这两个指令将会失效。
  4. 但是无论proxy_buffering是否开启,proxy_buffer_size都是生效的
  5. 2. proxy_buffer_size 4k;
  6. 该参数用来设置一个特殊的buffer大小的。
  7. 从被代理服务器(C)上获取到的第一部分响应数据内容到代理服务器(B)上,通常是header,就存到了这个buffer中。
  8. 如果该参数设置太小,会出现502错误码,这是因为这部分buffer不够存储header信息。建议设置为4k。
  9. 3. proxy_buffers 8 4k;
  10. 这个参数设置存储被代理服务器上的数据所占用的buffer的个数和每个buffer的大小。
  11. 所有buffer的大小为这两个数字的乘积。
  12. 4. proxy_busy_buffer_size 16k;
  13. 在所有的buffer里,我们需要规定一部分buffer把自己存的数据传给A,这部分buffer就叫做busy_buffer。
  14. proxy_busy_buffer_size参数用来设置处于busy状态的buffer有多大。
  15. 对于B上buffer里的数据何时传输给A:
  16. 1)如果完整数据大小小于busy_buffer大小,当数据传输完成后,马上传给A;
  17. 2)如果完整数据大小不少于busy_buffer大小,则装满busy_buffer后,马上传给A;
  18. 5. proxy_temp_path
  19. 语法:proxy_temp_path path [level1 level2 level3]
  20. 定义proxy的临时文件存在目录以及目录的层级。
  21. 例:proxy_temp_path /usr/ local/nginx/proxy_temp 1 2;
  22. 其中/usr/ local/nginx/proxy_temp为临时文件所在目录,1表示层级1的目录名为一个数字(0-9),2表示层级2目录名为2个数字(00-99)
  23. 6. proxy_max_temp_file_size
  24. 设置临时文件的总大小,例如 proxy_max_temp_file_size 100M;
  25. 7. proxy_temp_file_wirte_size
  26. 设置同时写入临时文件的数据量的总大小。通常设置为8k或者16
  27. server
  28. {
  29. listen 80;
  30. server_name www.aminglinux.com;
  31. proxy_buffering on;
  32. proxy_buffer_size 4k;
  33. proxy_buffers 2 4k;
  34. proxy_busy_buffers_size 4k;
  35. proxy_temp_path /tmp/nginx_proxy_tmp 1 2;
  36. proxy_max_temp_file_size 20M;
  37. proxy_temp_file_write_size 8k;
  38. location /
  39. {
  40. proxy_pass http://192.168.10.110:8080/;
  41. proxy_set_header Host $host;
  42. proxy_set_header X-Real-IP $remote_addr;
  43. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  44. }
  45. }

proxy_cache设置


 
 
  1. proxy_cache将从C上获取到的数据根据预设规则存放到B上(内存+磁盘)留着备用,
  2. A请求B时,B会把缓存的这些数据直接给A,而不需要再去向C去获取。
  3. proxy_cache相关功能生效的前提是,需要设置proxy_buffering on;

 

proxy_cache主要参数


 
 
  1. 1. proxy_cache
  2. 语法:proxy_cache zone|off
  3. 默认为off,即关闭proxy_cache功能,zone为用于存放缓存的内存区域名称。
  4. 例:proxy_cache my_zone;
  5. 从nginx 0.7.66版本开始,proxy_cache机制开启后会检测被代理端的HTTP响应头中的 "Cache-Control""Expire"头域。
  6. 如,Cache-Control为no-cache时,是不会缓存数据的。
  7. 2. proxy_cache_bypass
  8. 语法:proxy_cache_bypass string;
  9. 该参数设定,什么情况下的请求不读取cache而是直接从后端的服务器上获取资源。
  10. 这里的string通常为nginx的一些变量。
  11. 例:proxy_cahce_bypass $cookie_nocache $arg_nocache $arg_comment;
  12. 意思是,如果 $cookie_nocache $arg_nocache $arg_comment这些变量的值只要任何一个不为0或者不为空时,
  13. 则响应数据不从cache中获取,而是直接从后端的服务器上获取。
  14. 3. proxy_no_cache
  15. 语法:proxy_no_cache string;
  16. 该参数和proxy_cache_bypass类似,用来设定什么情况下不缓存。
  17. 例:proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
  18. 表示,如果 $cookie_nocache $arg_nocache $arg_comment的值只要有一项不为0或者不为空时,不缓存数据。
  19. 4. proxy_cache_key
  20. 语法:proxy_cache_key string;
  21. 定义cache key,如: proxy_cache_key $scheme $proxy_host $uri $is_args $args; (该值为默认值,一般不用设置)
  22. 5. proxy_cache_path
  23. 语法:proxy_cache_path path [levels=levels] keys_zone=name:size [inactive=time] [max_size=size]
  24. path设置缓存数据存放的路径;
  25. levels设置目录层级,如levels=1:2,表示有两级子目录,第一个目录名取md5值的倒数第一个值,第二个目录名取md5值的第2和3个值。如下图:
  26. Copy
  27. image
  28. keys_zone设置内存zone的名字和大小,如keys_zone=my_zone:10m
  29. inactive设置缓存多长时间就失效,当硬盘上的缓存数据在该时间段内没有被访问过,就会失效了,该数据就会被删除,默认为10s。
  30. max_size设置硬盘中最多可以缓存多少数据,当到达该数值时,nginx会删除最少访问的数据。
  31. 例:proxy_cache_path /data/nginx_cache/ levels=1:2 keys_zone=my_zone:10m inactive=300s max_size=5g
  32. http
  33. {
  34. ...;
  35. proxy_cache_path /data/nginx_cache/ levels=1:2 keys_zone=my_zone:10m inactive=300s max_size=5g;
  36. ...;
  37. server
  38. {
  39. listen 80;
  40. server_name www.lsylinux.com;
  41. proxy_buffering on;
  42. proxy_buffer_size 4k;
  43. proxy_buffers 2 4k;
  44. proxy_busy_buffers_size 4k;
  45. proxy_temp_path /tmp/nginx_proxy_tmp 1 2;
  46. proxy_max_temp_file_size 20M;
  47. proxy_temp_file_write_size 8k;
  48. location /
  49. {
  50. proxy_cache my_zone;
  51. proxy_pass http://192.168.10.110:8080/;
  52. proxy_set_header Host $host;
  53. proxy_set_header X-Real-IP $remote_addr;
  54. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  55. }
  56. }
  57. }
  58. 说明:核心配置为proxy_cache_path那一行。

Nginx的负载均衡配置

Nginx通过upstream和proxy_pass实现了负载均衡。本质上也是Nginx的反向代理功能,只不过后端的server为多个。
 
 

案例一(简单的轮询)


 
 
  1. upstream www {
  2. server 172.37.150.109:80;
  3. server 172.37.150.101:80;
  4. server 172.37.150.110:80;
  5. }
  6. server {
  7. listen 80;
  8. server_name www.lsylinux.com;
  9. location / {
  10. proxy_pass http://www/;
  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. }
  15. }
  16. 说明:当被代理的机器有多台时,需要使用upstream来定义一个服务器组,
  17. 其中www名字可以自定义,在后面的proxy_pass那里引用。
  18. 这样nginx会将请求均衡地轮询发送给www组内的三台服务器。

案例二(带权重轮询+ip_hash算法)


 
 
  1. upstream www {
  2. server 172.37.150.109:80 weight=50;
  3. server 172.37.150.101:80 weight=100;
  4. server 172.37.150.110:80 weight=50;
  5. ip_hash;
  6. }
  7. server {
  8. listen 80;
  9. server_name www.lsylinux.com;
  10. location / {
  11. proxy_pass http://www/;
  12. proxy_set_header Host $host;
  13. proxy_set_header X-Real-IP $remote_addr;
  14. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  15. }
  16. }
  17. 说明:可以给www组内的三台机器配置权重,权重越高,则分配到的请求越多。
  18. ip_hash为nginx负载均衡算法,原理很简单,它根据请求所属的客户端IP计算得到一个数值,然后把请求发往该数值对应的后端。
  19. 所以同一个客户端的请求,都会发往同一台后端,除非该后端不可用了。ip_hash能够达到保持会话的效果。

案例三(upstream其他配置)


 
 
  1. upstream www {
  2. server 172.37.150.109:80 weight=50 max_fails=3 fail_timeout=30s;
  3. server 172.37.150.101:80 weight=100;
  4. server 172.37.150.110:80 down;
  5. server 172.37.150.110:80 backup;
  6. }
  7. server
  8. {
  9. listen 80;
  10. server_name www.lsylinux.com;
  11. location / {
  12. proxy_next_upstream off;
  13. proxy_pass http://www/;
  14. proxy_set_header Host $host;
  15. proxy_set_header X-Real-IP $remote_addr;
  16. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  17. }
  18. }
  19. 说明:down,表示当前的server不参与负载均衡;
  20. backup,为预留的机器,当其他的server(非backup)出现故障或者忙的时候,才会请求backup机器;
  21. max_fails,允许请求失败的次数,默认为1。当失败次数达到该值,就认为该机器down掉了。 失败的指标是由proxy_next_upstream模块定义,其中404状态码不认为是失败。
  22. fail_timeount,定义失败的超时时间,也就是说在该时间段内达到max_fails,才算真正的失败。默认是10秒。
  23. proxy_next_upstream,通过后端服务器返回的响应状态码,表示服务器死活,可以灵活控制后端机器是否加入分发列表。
  24. 语法: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 |http_404 | off ...;
  25. 默认值: proxy_next_upstream error timeout
  26. error # 和后端服务器建立连接时,或者向后端服务器发送请求时,或者从后端服务器接收响应头时,出现错误
  27. timeout # 和后端服务器建立连接时,或者向后端服务器发送请求时,或者从后端服务器接收响应头时,出现超时
  28. invalid_header # 后端服务器返回空响应或者非法响应头
  29. http_500 # 后端服务器返回的响应状态码为500
  30. http_502 # 后端服务器返回的响应状态码为502
  31. http_503 # 后端服务器返回的响应状态码为503
  32. http_504 # 后端服务器返回的响应状态码为504
  33. http_404 # 后端服务器返回的响应状态码为404
  34. off # 停止将请求发送给下一台后端服务器

案例四(根据不同的uri)


 
 
  1. upstream aa.com {
  2. server 192.168.0.121;
  3. server 192.168.0.122;
  4. }
  5. upstream bb.com {
  6. server 192.168.0.123;
  7. server 192.168.0.124;
  8. }
  9. server {
  10. listen 80;
  11. server_name www.lsylinux.com;
  12. location ~ aa.php
  13. {
  14. proxy_pass http://aa.com/;
  15. proxy_set_header Host $host;
  16. proxy_set_header X-Real-IP $remote_addr;
  17. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  18. }
  19. location ~ bb.php
  20. {
  21. proxy_pass http://bb.com/;
  22. proxy_set_header Host $host;
  23. proxy_set_header X-Real-IP $remote_addr;
  24. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  25. }
  26. location /
  27. {
  28. proxy_pass http://bb.com/;
  29. proxy_set_header Host $host;
  30. proxy_set_header X-Real-IP $remote_addr;
  31. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  32. }
  33. }
  34. 说明:请求aa.php的,会到aa.com组,请求bb.php的会到bb.com,其他请求全部到bb.com。

案例五(根据不同的目录)


 
 
  1. upstream aaa.com
  2. {
  3. server 192.168.111.6;
  4. }
  5. upstream bbb.com
  6. {
  7. server 192.168.111.20;
  8. }
  9. server {
  10. listen 80;
  11. server_name www.lsylinux.com;
  12. location /aaa/
  13. {
  14. proxy_pass http://aaa.com/aaa/;
  15. proxy_set_header Host $host;
  16. proxy_set_header X-Real-IP $remote_addr;
  17. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  18. }
  19. location /bbb/
  20. {
  21. proxy_pass http://bbb.com/bbb/;
  22. proxy_set_header Host $host;
  23. proxy_set_header X-Real-IP $remote_addr;
  24. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  25. }
  26. location /
  27. {
  28. proxy_pass http://bbb.com/;
  29. proxy_set_header Host $host;
  30. proxy_set_header X-Real-IP $remote_addr;
  31. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  32. }
  33. }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Nginx 反向代理是一种常用的服务器配置方法,它可以将客户端的请求转到后端的多个服务器上,并将响应返回给客户端。通过反向代理,可以实现负载均衡、缓存、安全性等功能。 要配置 Nginx 反向代理,你需要编辑 Nginx 的配置文件(通常是 `nginx.conf`),然后添加相应的配置项。 以下是一个简单的 Nginx 反向代理配置示例: ``` http { upstream backend { server backend1.example.com; server backend2.example.com; server backend3.example.com; } server { listen 80; server_name example.com; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } } ``` 在这个示例中,`upstream` 块定义了后端服务器的列表。`server` 块定义了监听的端口和域名,并在 `location` 块中配置了反向代理。 `proxy_pass` 指令将请求转发到 `http://backend`,其中 `backend` 是 `upstream` 块中定义的后端服务器列表。 `proxy_set_header` 指令用于设置转发请求时的请求头。在示例中,我们设置了 `Host` 和 `X-Real-IP` 请求头。 完成配置后,保存文件并重新加载 Nginx 配置。这样,Nginx 就会将客户端的请求转发到后端服务器,并将响应返回给客户端。 请注意,以上只是一个简单的示例,实际的配置可能因具体需求而有所不同。你可以根据实际情况进行配置,并参考 Nginx 官方文档获取更多信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值