在学习Python的道路上,式的网络工程师

Nginx常见场景代理转发配置,nginx场景转发

注意:本文出自 “阿飞”的博客 ,如果要转载本文章,请与作者联系! 并注明来源: 

在这里分享的不是nginx的配置文件说明,而是nginx常用的转发代理配置(比如线上多域名配置,后端各种转发代理配置以及较为复杂的代理转发配置),另外还会对常用的转发代理参数配置进行说明。

nginx配置文件说明请参考:

1)

2)

一、代理转发

nginx的代理转发主要是在server部分进行配置。如果转向到制定域名或子域名,则需要在godaddy、阿里云等域名解析中预先配置(子)域名并指定IP。本文中主要描述通配符域名的配置,这样更具有通用性。

server部分配置为:

server {
        listen       80;
        server_name  *.yourdomain.com;
......

如果是https则修改listen部分即可:

listen       443 ssl;

* https配置还需要单独配置ssl部分的内容,证书不一样,配置方式也有差异,这里不做介绍。

一般情况下,我们会有如下常见的几种需求

1)指向到公司官网或其他产品网(一级域名)
每个域名单独配置一个server即可,如HTTPS的配置如下:

    server {
        listen          443 ssl;
        server_name     www.yourdomain.com; #修改为需要的一级域名即可

        access_log      logs/ssl.access.log;
        error_log       logs/ssl.error.log crit;

        include ssl_params;

        location / {
                index  index.html index.htm index.php;
                index  proxy_set_header Host $host;
                index  proxy_set_header X-Real-IP $remote_addr;
                index  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_pass http://server_cluster; #后端服务器,具体配置upstream部分即可
        }

    }

2)指向到公司内部管理系统等等(二级域名)

同1)部分的配置,只需要修改server_name部分即可:

server_name     二级域名.yourdomain.com; #修改为需要的二级域名即可

3)二级域名下多个服务转发

比如:

...

而后端服务可能会部署在不同的server容器中,比如tomcat、php-fpm/fastcgi、第三方服务...

server部分需要先配置第2)点部分内容,然后再配置该server下的location转发,常见location配置场景如下:

a)转发到后端Tomcat

      location /location名称/ {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://127.0.0.1:8080/服务名/;
      }

tomcat的转发是很简单的了,这里不需要多说。

b)转发到php-fpm

将所有php页面的请求转给php-fpm处理:

      location ~ .php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(. .php)(/. )$;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
      }

fastcgi_params配置:

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
#fastcgi_param  SERVER_SOFTWARE    nginx;
fastcgi_param  SERVER_SOFTWARE    nginx;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

注意!

配置不具备通用性,需要根据自己服务器及实际业务需要进行配置和调整。

这里的配置仅提供参考。

d)转发到第三方域名(第三方接口服务)

比如做支付时,内部系统需要通过代理转发到银联支付接口:

location /unionpay/ {
         proxy_set_header Host gateway.银联.com;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_pass https://gateway.银联.com/;
}

这里的proxy_set_header Host必须配置。

4)强制http转https访问

80端口部分server配置:

server {
        listen  80;
        server_name     api.yourdomain.com;
        location / {
                rewrite ^/(.*) https://api.yourdomain.com/$1 permanent ;
                break;
        }
        error_page 497 https://$host:$server_port$request_uri;
    }

当用户通过HTTP 80访问时,nginx将强制转换为HTTPS 443访问。

443端口部分server配置:

server {
        listen       443 ssl;
        server_name  api.yourdomain.com;

        access_log logs/ssl.api_access.log;
        error_log  logs/ssl.api_error.log crit;

        include ssl_params;

        location / {
                proxy_pass http://tomcat_servers/$2;
                proxy_set_header Host $host:443;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        location /v1.0/ {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://tomcat_servers/v1.0/;
            proxy_cookie_path /v1.0/ /;
            proxy_redirect off;
        }

}

5)后缀名定向

比如,有URL:www.abc.com/register/user.do,需要将URL定向为uuu.abc.com/register/user.do。则可以在WWW.ABC.COM节点中这样配置:

location / {
        rewrite ^(/register)/user(.*)..*$  break;

        index  index.html index.htm;
        proxy_set_header Host $host:443;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto  $scheme;
        proxy_pass ;
}

6)在location中通过if-else分支,根据请求参数使用不同的proxy_pass进行转发。如:

例如url为:

因此,Nginx中可以对location进行if判断,解决方案如下:

location /test/ {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        if ($arg_n ~* "web01") {
                  proxy_pass ;
                  break;
        }

        if ($arg_n ~* "web02") {
                  proxy_pass ;
                  break;
        }

        .......

}

其中,$arg_n表示url中的n参数,$arg_p表示url中的p参数。

最后,尤其要注意的是!proxy_pass 后的url不能有与请求的url后的路径,如proxy_pass

7)Nginx支持websocket的配置

只需要加上红色字体部分配置即可:

location /drsws/ {
    proxy_set_header Host $host;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    ........

}

二、参数说明

1)proxy_set_header    X-real-ip $remote_addr;

在web服务器端获得用户的真实ip。

但是,实际上要获得用户的真实ip,不是只有这一个方法,下面我们继续看。

 

2)proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for;

我们先看看这里有个X-Forwarded-For变量,这是一个squid开发的,用于识别通过HTTP代理或负载平衡器原始IP一个连接到Web服务器的客户机地址的非rfc标准,如果有做X-Forwarded-For设置的话,每次经过proxy转发都会有记录,格式就是client1, proxy1, proxy2,以逗号隔开各个地址,由于他是非rfc标准,所以默认是没有的,需要强制添加,在默认情况下经过proxy转发的请求,在后端看来远程地址都是proxy端的ip 。也就是说在默认情况下我们使用request.getAttribute("X-Forwarded-For")获取不到用户的ip,如果我们想要通过这个变量获得用户的ip,我们需要自己在nginx添加如下配置:

proxy_set_header            X-Forwarded-For$proxy_add_x_forwarded_for;

意思是增加一个$proxy_add_x_forwarded_for到X-Forwarded-For里去,注意是增加,而不是覆盖,当然由于默认的X-Forwarded-For值是空的,所以我们总感觉X-Forwarded-For的值就等于$proxy_add_x_forwarded_for的值,实际上当你搭建两台nginx在不同的ip上,并且都使用了这段配置,那你会发现在web服务器端通过request.getAttribute("X-Forwarded-For")获得的将会是客户端ip和第一台nginx的ip。

那么$proxy_add_x_forwarded_for又是什么?

$proxy_add_x_forwarded_for变量包含客户端请求头中的"X-Forwarded-For",与$remote_addr两部分,他们之间用逗号分开。

举个例子,有一个web应用,在它之前通过了两个nginx转发,www.linuxidc.com 即用户访问该web通过两台nginx。

在第一台nginx中,使用

proxy_set_header            X-Forwarded-For$proxy_add_x_forwarded_for;

现在的$proxy_add_x_forwarded_for变量的"X-Forwarded-For"部分是空的,所以只有$remote_addr,而$remote_addr的值是用户的ip,于是赋值以后,X-Forwarded-For变量的值就是用户的真实的ip地址了。

到了第二台nginx,使用

proxy_set_header            X-Forwarded-For$proxy_add_x_forwarded_for;

现在的$proxy_add_x_forwarded_for变量,X-Forwarded-For部分包含的是用户的真实ip,$remote_addr部分的值是上一台nginx的ip地址,于是通过这个赋值以后现在的X-Forwarded-For的值就变成了“用户的真实ip,第一台nginx的ip”,这样就清楚了吧。

 

最后我们看到还有一个$http_x_forwarded_for变量,这个变量就是X-Forwarded-For,由于之前我们说了,默认的这个X-Forwarded-For是为空的,所以当我们直接使用proxy_set_header            X-Forwarded-For$http_x_forwarded_for时会发现,web服务器端使用request.getAttribute("X-Forwarded-For")获得的值是null。如果想要通过request.getAttribute("X-Forwarded-For")获得用户ip,就必须先使用proxy_set_header            X-Forwarded-For$proxy_add_x_forwarded_for;这样就可以获得用户真实ip。

此部分内容来自:

三、小结

1)通过本文,应该比较清楚的描述了一级、二级域名的配置;

2)通过各种场景,应该描述清楚了location各种情况的转发配置;

3)引用其他文章,讲解了部分参数的含义

4)各种复杂的情况,还需要根据具体的业务及需求进行配置,这里的例子相对都比较简单。


0


0

查看评论

注意:本文出自 “阿飞”的博客 ,如果要转载本文章,请与作者联系! 并注明来源: ...

在学习Python的道路上,我们应该如何走好这条路。,python走好

当你决定入门 Python 时,需要有一个清晰且短期内可实现的目标,比如通过学习找一份初级程序员工作,目标明确后,你需要知道企业对 Python 程序员的技能有哪些要求,下面是我从拉勾网找的一个初级 Python 工程师的任职要求:

  1. 熟悉 Python 及常用的 Web 开发框架;

  2. 至少熟悉一种数据库的使用,如MySQL、mongodb、redis等;

  3. 熟悉 Linux 操作系统及常用命令;

  4. 良好的编码习惯和文档编写习惯;

做 Python 开发除了熟悉语言本身之外,还需要掌握很多相关联的技能,好比打NBA,你不光要学如何投篮,还要练习力量、技战术等一整套东西。所以,一个普通 Python Web 开发工程师需要掌握的技能包括至少一个Web框架,比如:Django、Flask、Tornado,做业务系统必须熟知一种数据库,还需要对Linux系统的基本操作和常用命令有所了解,因为以后你写到程序基本上都会运行在Linux平台上。

另外Django在配置中很多地方使用字符串来代替模块的导入,那么它是如何把字符串对应到实际的模块上的呢?翻看源码,你就会发现,它使用了__import__内部方法。利用这个方法,我们也可以在自己的项目中用字符串来指定要导入的模块和类。

像这样的体悟是无穷无尽的,每一个框架都是一个学习的宝库,而你使用过的框架则是对你来说挖掘起来更容易的宝库。挖掘、体悟你最熟悉的框架,会让你的编码水平大幅提高。

如何避免成为“消防员”式的网络工程师?,消防员工程师

作者简介:

张永福
大河云联解决方案架构师,一名从事传统网络工作十几年的网络老兵,参与过运营商、金融、政务、交通等多个行业的几十个网络建设项目。自2016年开始加入大河云联公司从事SDN网络相关工作,先后参与SDN产品设计、网络架构设计、运维自动化系统设计、解决方案设计,致力于SDN在商用项目的落地部署,与热爱先进技术的小伙伴一起推动SDN行业发展。

对网络工程师而言,不管是基础网络的运维还是业务驱动的运营,在日常工作中都会碰到各种技术问题及不同类型的网络故障,我们根据经验总结出“网络运维三十六计”,帮助网络工程师在运维工作中减少故障,防微杜渐。“网络运维三十六计”可归纳为如下三类。

  • 基于技术知识的排障思路:工程师通过学习掌握必要的技能知识,提升自身技术水平,善于从每次故障处理过程中吸取教训总结经验,不断提高逻辑思维能力。

  • 运维自动化和运维流程制度:从人工运维到自动化运维,可以降低运维成本及维护复杂度。同时,在流程制度的保障下,能够提高工作效率,减少沟通成本。

  • 跨部门协同工作:网络是衔接各业务系统的中间纽带,网络工程师在工作中与上下游部门的配合必不可少,协作处理恰当可事半功倍。

下面请看两个比较有代表性的案例。

文末观看完整版网络运维三十六计

案例一、在网络排障中锻炼”抽丝剥茧”的能力

网络工程师对技术的掌握可以通过看书、查阅文档、做实验等手段实现,而排障思路不仅需要扎实的基础知识功底,还需要经历大量的现网实战,并善于对故障解决的经验做总结。

这里讲述一个由于欠缺基础知识导致故障处理思路不清晰的案例,希望大家通过这个案例进行反思和总结。我们不怕犯错,但犯错以后一定要及时总结经验和吸取教训,为以后的工作铺平道路。

老高是某运营商骨干网络资深运维工程师,经历无数风风雨雨,处理故障果断沉稳。在一次内部的运维培训课上,老高分享了自己的一段亲身经历,向运维新手强调故障现象分析判断的敏感度非常重要,也就是根据故障现象理清处理思路的能力。如果基础知识不牢固,可能会导致问题恶化,甚至导致最终都无法解决故障。

故障情境再现

当老高还是一个初出茅庐的小高时,曾担任某二级运营商运维部门网络工程师,经常需要值夜班。有一天半夜12点多,值班大厅内的告警铃声突然响起,监控大屏上也翻滚着告警日志信息。

这天正是小高值班,而对于这种场景,小高在运维值班的过程中碰到过多次,基本上都是某个骨干传输瞬断或个别硬件设备故障等容易判断的问题;传输中断的问题一般会直接转到传输部门进行排查,硬件设备故障的问题一般会直接呼叫厂商工程师,值班人员配合厂商工程师做一些信息收集工作。

由于小高勤奋好学,所以也积累了很多通过日志判断故障原因的经验。

本文由ca88手机版登录发布于亚洲城官网,转载请注明出处:在学习Python的道路上,式的网络工程师

TAG标签: ca88手机版登录
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。