草庐IT

Nginx 反向代理工作原理简介与配置详解

Mr授客 2023-03-28 原文
Nginx反向代理工作原理简介与配置详解

 

by:授客  QQ1033553122

 

测试环境 CentOS 6.5-x86_64

 

nginx-1.10.0

下载地址:http://nginx.org/en/download.html

下载地址:http://pan.baidu.com/s/1skNT7zv

 

安装nginx [root@localhost mnt]# tar -xzvf nginx-1.10.0.tar.gz

[root@localhost mnt]# cd nginx-1.10.0

[root@localhost nginx-1.10.0]# ./configure --prefix=/usr/local/ngnix --with-pcre=/mnt/pcre-8.36

Configuration summary

  + using PCRE library: /mnt/pcre-8.36

  + OpenSSL library is not used

  + using builtin md5 code

  + sha1 library is not found

  + using system zlib library

 

  nginx path prefix: "/usr/local/ngnix"

  nginx binary file: "/usr/local/ngnix/sbin/nginx"

  nginx modules path: "/usr/local/ngnix/modules"

  nginx configuration prefix: "/usr/local/ngnix/conf"

  nginx configuration file: "/usr/local/ngnix/conf/nginx.conf"

  nginx pid file: "/usr/local/ngnix/logs/nginx.pid"

  nginx error log file: "/usr/local/ngnix/logs/error.log"

  nginx http access log file: "/usr/local/ngnix/logs/access.log"

  nginx http client request body temporary files: "client_body_temp"

  nginx http proxy temporary files: "proxy_temp"

  nginx http fastcgi temporary files: "fastcgi_temp"

  nginx http uwsgi temporary files: "uwsgi_temp"

  nginx http scgi temporary files: "scgi_temp"

 

注:

1、编译时,指定了pcre安装目录,但是安装出错,解决方法如上,指定源码所在目录

2、如果不指定--with-pcre 选项,会报类似如下的错误

3、需要预先安装gcc-c++

 

[root@localhost nginx-1.10.0]# make && make install

启动ngnix [root@localhost nginx-1.10.0]# /usr/local/ngnix/sbin/nginx -c /usr/local/ngnix/conf/nginx.conf

 

反向代理工作原理 客户端向反向代理发送请求,接着反向代理转发请求至目标服务器,并把获得的内容返回给客户端

 

反向代理配置 测试链接:

http://192.168.1.104/zentaopms/www/index.php

http://192.168.1.104/zentaopms/www/index.php?m=project&f=create

 

如上,想通过192.168.1.103代理服务器访问上述测试链接,具体咋操作呢?如下

 

编辑所使用的配置文件

[root@localhost nginx-1.10.0]# vim /usr/local/ngnix/conf/nginx.conf

 

找到“Server”结点,增加入下带背景色内容

    server {

        listen       80;

        server_name  localhost;

 

        #charset koi8-r;

 

        #access_log  logs/host.access.log  main;

 

        location / {

            root   html;

            index  index.html index.htm;

        }

 

        #error_page  404              /404.html;

 

        # redirect server error pages to the static page /50x.html

        #

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }

 

        location /zentaopms/www/ {

            proxy_pass http://192.168.1.104;

        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80

        #

        #location ~ \.php$ {

        #    proxy_pass   http://127.0.0.1;

        #}

 

重新加载配置文件

[root@localhost nginx-1.10.0]# /usr/local/ngnix/sbin/nginx -s reload

 

访问测试url 如下,OK

 

 

 

说明:

传递请求给被代理服务器

为了把请求传递给被代理服务器,需要在location中指定proxy_pass机制。如下

 

location /some/path/ {

    proxy_pass http://www.example.com/link/;

}

 

proxy_pass既可以是ip地址,也可以是域名,同时还可以指定端口

 

location ~ \.php {

    proxy_pass http://127.0.0.1:8000;

}

 

注意:如果proxy_pass指定的地址携带了URI,如上例中 /link/,那么这里的URI将替换请求URI中匹配location参数的部分,比如 请求 /some/path/page.html,将被替换为http://www.example.com/link/page.html

 

另外,如果请求不是发往http类型的被代理服务器,则选择如下之一:

 

请求也可以发往一命名的组服务器,这种请求下,将根据指定方法,在这些服务器之中进行请求的分发。

 

传递请求头

默认的,nginx在被代理请求中定义两个头域:HostConnection,并且清除包含空值的头域。Host被设置为$proxy_host变量,而Connection则被设置为close

 

使用proxy_set_header机制可修改默认配置及其它头域的值。可以在location中,server上下文,http块或者其它更高层级中指定这种机制。

 

例子:

location /some/path/ {

    proxy_set_header Host $host;

    proxy_set_header X-Real-IP $remote_addr;

    proxy_pass http://localhost:8000;

}

 

如果想阻止某个头域被传递给被代理服务器,可以如下设置头域的值为空

location /some/path/ {

    proxy_set_header Accept-Encoding "";

    proxy_pass http://localhost:8000;

}

 

配置缓冲(Buffer)

默认的,Ngnix buffering来自被代理服务器的响应。Ngnix在内部buffering中存储响应,直到收到整个响应后才发送给客户端。对于慢客户端来说,buffering可优化性能,这样,如果响应从Nginx同步传递给客户端,这将会浪费被代理服务器的时间。但是,如果开启bufferingNginx允许被代理服务器快速处理请求,因为Nginx会尽可能久的存储来自被代理服务器的响应,直到客户端下载它们。

 

使用proxy_buffering机制开启或关闭缓冲。默认的,开启缓冲。

 

proxy_buffers控制buffer大小和分配给请求的buffer数量。来自被代理服务器响应中的第一部分被存储在单一的buffer中,该buffer的大小由proxy_buffer_size设定。该部分通常包含一个相对较小的响应头,其大小可以设置成比用于存储剩余响应部分buffer小。

 

例子:

location /some/path/ {

    proxy_buffers 16 4k;

    proxy_buffer_size 2k;

    proxy_pass http://localhost:8000;

}

 

如果关闭buffering,当从被代理服务器接收到响应时,将被同步把响应发往客户端。这对于想尽快收到请求的快速交互客户端来说。这是其想要的。

 

例子:关闭buffering

location /some/path/ {

    proxy_buffering off;

    proxy_pass http://localhost:8000;

}

 

这种情况下,nginx只用proxy_buffer_size来存储响应的当前部分。

 

选择一个出口 IP地址

如果代理服务器有多个网络接口,有时候需要选择特定的源ip地址来连接到代理服务器。当被代理服务器被设置为只接受来自特定IP地址或者IP范围的连接请求时,这特别有用。

 

例:

location /app1/ {

    proxy_bind 127.0.0.1;

    proxy_pass http://example.com/app1/;

}

 

location /app2/ {

    proxy_bind 127.0.0.2;

    proxy_pass http://example.com/app2/;

}

 

ip地址也可以是一个变量

例:

location /app3/ {

    proxy_bind $server_addr;

    proxy_pass http://example.com/app3/;

}

 

参考链接:

https://www.nginx.com/resources/admin-guide/reverse-proxy/

 

 

有关Nginx 反向代理工作原理简介与配置详解的更多相关文章

  1. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  2. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  3. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  4. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  5. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  6. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  7. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  8. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  9. ruby - JetBrains RubyMine 3.2.4 调试器不工作 - 2

    使用Ruby1.9.2运行IDE提示说需要gemruby​​-debug-base19x并提供安装它。但是,在尝试安装它时会显示消息Failedtoinstallgems.Followinggemswerenotinstalled:C:/ProgramFiles(x86)/JetBrains/RubyMine3.2.4/rb/gems/ruby-debug-base19x-0.11.30.pre2.gem:Errorinstallingruby-debug-base19x-0.11.30.pre2.gem:The'linecache19'nativegemrequiresinstall

  10. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

随机推荐