nginx反向代理原理和配置讲解

本文详细介绍了Nginx反向代理的工作原理和两种模型,包括作为内容服务器的替身以增强安全性,以及作为负载均衡器提高服务器处理能力。通过配置示例展示了如何设置Nginx反向代理,包括对Apache、Tornado等服务器的反向代理配置,以及如何通过upstream进行负载均衡。此外,还分享了如何在Windows和Linux环境下配置Nginx以支持PHP。
摘要由CSDN通过智能技术生成

最近不是太忙,想着研究一下nginx的反向代理服务器。因为公司的项目基本上都是内网访问。只知道项目都是通过nginx转发到其他服务器上访问的,但是不知道怎么配置。所以搜集了一些资料整理一下。以作日后工作学习参考使用。

一、概述

  反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

  通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。由于外部网络上的主机并不会配置并使用这个代理服务器,普通代理服务器也被设计为Internet上搜寻多个不确定的服务器,而不是针对Internet上多个客户端的请求访问某一个固定的服务器,因此普通的Web代理服务器不支持外部对内部网络的访问请求。当一个代理服务器能够代理外部网路上的主机访问内部网络时,这种代理服务的方式成为反向代理服务。此时代理服务器对外就表现为一个Web服务器,外部网络就可以简单把它当作一个标准的Web服务器而不需特定的配置。不同之处在于,这个服务器没有保存任何网页的真实数据,所有的静态网页或者CGI程序,都保存在内部的Web服务器上。因此对于反向代理服务器的攻击并不会使网页信息遭到破坏,这样就增强了Web服务器的安全性。

  反向代理方式和包过滤方式或者普通代理方式并无冲突,因此可以在防火墙设备中同时使用这两种方式,其中反向代理用于外部网络访问内部网络时使用,正向代理或者包过滤方式用于拒绝其他外部访问方式并提供内部网络对外部网络的访问能力。因此可以结合这些方式提供最佳的安全访问方式。
在这里插入图片描述

二、反向代理服务器的工作原理

  反向代理服务器通常有两种模型,它可以作为内容服务器的替身,也可以作为内容服务器集群的负载均衡器。

1、作内容服务器的替身

  如果您的内容服务器具有必须保持安全的敏感信息,如信用卡号数据库,可在防火墙外部设置一个代理服务器作为内容服务器的替身。当外部客户机尝试访问内容服务器时,会将其送到代理服务器。实际内容位于内容服务器上,在防火墙内部受到安全保护。代理服务器位于防火墙外部,在客户机看来就像是内容服务器。

  当客户机向站点提出请求时,请求将转到代理服务器。然后,代理服务器通过防火墙中的特定通路,将客户机的请求发送到内容服务器。内容服务器再通过该通道将结果回传给代理服务器。代理服务器将检索到的信息发送给客户机,好像代理服务器就是实际的内容服务器(参见图 2)。如果内容服务器返回错误消息,代理服务器会先行截取该消息并更改标头中列出的任何 URL,然后再将消息发送给客户机。如此可防止外部客户机获取内部内容服务器的重定向 URL。

   这样,代理服务器就在安全数据库和可能的恶意攻击之间提供了又一道屏障。与有权访问整个数据库的情况相对比,就算是侥幸攻击成功,作恶者充其量也仅限于访问单个事务中所涉及的信息。未经授权的用户无法访问到真正的内容服务器,因为防火墙通路只允许代理服务器有权进行访问。

在这里插入图片描述
  可以配置防火墙路由器,使其只允许特定端口上的特定服务器(在本例中为其所分配端口上的代理服务器)有权通过防火墙进行访问,而不允许其他任何机器进出。

2、作为内容服务器的负载均衡器

  可以在一个组织内使用多个代理服务器来平衡各 Web 服务器间的网络负载。在此模型中,可以利用代理服务器的高速缓存特性,创建一个用于负载平衡的服务器池。此时,代理服务器可以位于防火墙的任意一侧。如果 Web 服务器每天都会接收大量的请求,则可以使用代理服务器分担 Web 服务器的负载并提高网络访问效率。

  对于客户机发往真正服务器的请求,代理服务器起着中间调停者的作用。代理服务器会将所请求的文档存入高速缓存。如果有不止一个代理服务器,DNS 可以采用“循环复用法”选择其 IP 地址,随机地为请求选择路由。客户机每次都使用同一个 URL,但请求所采取的路由每次都可能经过不同的代理服务器。

  可以使用多个代理服务器来处理对一个高用量内容服务器的请求,这样做的好处是内容服务器可以处理更高的负载,并且比其独自工作时更有效率。在初始启动期间,代理服务器首次从内容服务器检索文档,此后,对内容服务器的请求数会大大下降。
在这里插入图片描述
参考内容:

1、百度百科
2、http://www.oracle.com/technetwork/indexes/documentation/index.html

Nginx基本操作释疑
1、Nginx的端口修改问题
2、Nginx 301重定向的配置
3、Windows下配置Nginx使之支持PHP
4、Linux下配置Nginx使之支持PHP
5、以源码编译的方式安装PHP与php-fpm
6、Nginx多站点配置的一次实践
7、Nginx反向代理的配置

Nginx 作为 web 服务器一个重要的功能就是反向代理。其实我们在前面的一篇文章《Nginx多站点配置的一次实践》里,用的就是 Nginx 的反向代理,这里简单再提一下。
下面是配置 Nginx 作为 tornado 的反向代理的设置:

	upstream tornado {
	    server 127.0.0.1:8888;
	}
	  
	server {
	    listen   80;
	    root /root/nmapp2_venv;
	    index index.py index.html;
	  
	    server_name server;
	  
	    location / {
	        #if (!-e $request_filename) {
	        #    rewrite ^/(.*)$ /index.py/$1 last;
	        #}
	    }
	  
	    location ~ /index\.py {
	        proxy_pass_header Server;
	        proxy_set_header Host $http_host;
	        proxy_set_header X-Real-IP $remote_addr;
	        proxy_set_header X-Scheme $scheme;
	        proxy_pass http://tornado;

Nginx 反向代理的指令不需要新增额外的模块,默认自带 proxy_pass 指令,只需要修改配置文件就可以实现反向代理。

再举一个例子吧。比如要配置后端跑 apache 服务的 ip 和端口,也就是说,我们的目标是实现通过 http://ip:port 能访问到你的网站。

只要新建一个 vhost.conf,加入如下内容(记得修改 ip 和域名为你的 ip 和域名)。修改nginx.conf,添加 include quancha.conf 到http{}段, reload nginx就可以了。

Nginx 反向代理模板:

	## Basic reverse proxy server ##
	upstream apachephp  {
	    server ip:8080; #Apache
	}
	  
	## Start www.nowamagic.net ##
	server {
	    listen 80;
	    server_name  www.nowamagic.net;
	  
	    access_log  logs/quancha.access.log  main;
	    error_log  logs/quancha.error.log;
	    root   html;
	    index  index.html index.htm index.php;
	  
	    ## send request back to apache ##
	    location / {
	        proxy_pass  http://apachephp;
	  
	        #Proxy Settings
	        proxy_redirect     off;
	        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_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
	        proxy_max_temp_file_size 0;
	        proxy_connect_timeout      90;
	        proxy_send_timeout         90;
	        proxy_read_timeout         90;
	        proxy_buffer_size          4k;
	        proxy_buffers              4 32k;
	        proxy_busy_buffers_size    64k;
	        proxy_temp_file_write_size 64k;
	   }
	}

这就完成了 Nginx 反向代理配置。

本地使用的配置:

# 分发模块
upstream usersCenter-web-outer
{
    # 后端支持的服务列表
    # 根据session,如果session一致,每次请求的都是同一个服务,不会发现登陆的a服务,登陆后会跳转到b服务;(ip绑定的)
    ip_hash;
    # ip:端口
    server 192.168.1.146:20001;
}

server {
    listen       10005;
    server_name  localhost;


    default_type 'text/html';
        charset utf-8;
        # 客户端上传文件大小限制
        client_max_body_size 20M;

    # 位置;是url的根目录;tomcat下面的项目名/ROOT项目
    location /file/ {
        # 列出目录结构
        autoindex   on;
        # 文件大小
        autoindex_exact_size    on;
        # 文件的修改时间
        autoindex_localtime on;

        # 访问静态html的路径;如果修改了目录,一定要将setlinux关闭
        root   /data/file/;
        #if ($request_filename ~* ^.*?.(txt|doc|pdf|rar|gz|zip|docx|exe|xlsx|ppt|pptx|jpg|png)$){
        #                add_header Content-Disposition attachment;                  
        #     }
        if ($request_filename ~* ^.*?.(txt|doc|pdf|rar|gz|zip|docx|exe|xlsx|ppt|pptx)$){
                        add_header Content-Disposition attachment;
             }
        # 首页
        index  index.html index.htm;

        #mp4;
        #    mp4_buffer_size       1m;
        #    mp4_max_buffer_size   5m;
        #    mp4_limit_rate        on;
        #    mp4_limit_rate_after  30s
    }

     # 请求转发服务;url下面的docs目录tomcat下面的项目名/docs项目
    # docs要和proxy_pass和upstream后面的名字一模一样
    location /usersCenter-web-back {
        proxy_pass http://usersCenter-web-back;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host:$server_port;
    }
}

------使用过的配置

#user nobody;
worker_processes 4;
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;
worker_rlimit_nofile 204800;

events {
worker_connections 16384;
multi_accept on;
use epoll;
}

http {
include mime.types;
default_type application/octet-stream;

log_format test166 '$remote_addr - r e m o t e u s e r [ remote_user [ remoteuser[time_local] “KaTeX parse error: Double superscript at position 34: … '̲status b o d y b y t e s s e n t " body_bytes_sent " bodybytessent"http_referer” ’
'“ h t t p u s e r a g e n t " " http_user_agent" " httpuseragent""http_x_forwarded_for” ’
'"[ r e q u e s t t i m e ] " " [ request_time]" "[ requesttime]""[upstream_response_time]" ’
'"[ c o n n e c t i o n ] " " [ connection]" "[ connection]""[connection_requests]" ’
‘“ h t t p i m e i " " http_imei" " httpimei""http_mobile” “ h t t p t y p e " " http_type" " httptype""http_key” “$cookie_sfpay_jsessionid”’;
access_log logs/access.log test166;

sendfile on;
#tcp_nopush on;
underscores_in_headers on;

keepalive_timeout 65;
proxy_connect_timeout 120;
proxy_read_timeout 120;
proxy_send_timeout 60;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_temp_path /home/temp_dir;
proxy_cache_path /home/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;

client_header_buffer_size 12k;
open_file_cache max=204800 inactive=65s;
open_file_cache_valid 30s;
open_file_cache_min_uses 1;

gzip on;
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png image/jpg;

upstream ims-oms {
server 1.1.240.31:8001;
}

upstream anruy-tomcat {
server 1.1.231.54:8080;
server 1.1.231.55:8080;
keepalive 40;
}

upstream anruy-tomcat {
server 1.1.231.84:8080;
server 1.1.231.85:8080;
keepalive 40;
}

HTTP server

server {
listen 8080;
server_name anruy01-sit;

location ~ (etc/passwd|.php|.asp|win.ini)$ {
deny all;
}
location /nginx_status {
stub_status on;
access_log off;
}
location /ims/{
proxy_pass http://ims-oms/ims/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;

}
location /anruy/ {
proxy_pass http://anruy-tomcat/anruy/remote/interface;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host:1443;
proxy_http_version 1.1;
proxy_set_header Connection keep-alive;
proxy_set_header Keep-Alive 600;
keepalive_timeout 600;
}

location /anruy-front/ {
proxy_pass http://anruy-tomcat/anruy-front/remote/interface;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host:1443;
proxy_http_version 1.1;
proxy_set_header Connection keep-alive;
proxy_set_header Keep-Alive 600;
keepalive_timeout 600;
}

location / {
root html;
index index.html index.htm;
}
# client_body_temp_path /usr/local/nginx/html/tmp;
# dav_access group:rw all:r;
# index index.html index.htm *.jsp ;
# proxy_set_header X-Real-IP $remote_addr;
# client_max_body_size 100m;
}
}

转载自:https://www.cnblogs.com/anruy/p/4989161.html

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值