Nginx反向代理配置

Nginx反向代理

Nginx是一个轻量级的、高性能的WebServer,主要可以干下面两件事:作为http服务器(和apache的功能一样);作为反向代理服务器实现负载均衡。

安装Nginx

Mac上执行

brew install nginx

Ubuntu上执行:

sudo apt-get install nginx 

Nginx基本操作

1) 启动Nginx:start nginx
2) 停止Nginx:nginx -s stop
3) 修改配置后重启:nginx -s reload

关于代理

正向代理

正向代理,作为一个媒介将互联网上获取的资源返回给相关联的客户端。代理和客户端在一个局域网,对于服务端是透明的

反向代理

反向代理,根据客户端的请求,从后端的服务器上获取资源,然后再将这些资源返回给客户端。代理和服务器在一个局域网,对客户端是透明的。

反向代理的作用

  • 提高动态语言的I/O处理能力,Python、PHP、Java这样的动态服务的I/O处理能力不高,反向代理可以缓冲请求,交给后端一个完整的HTTP请求,同样,Nginx也可以缓冲响应,也达到了减轻后端的压力。
  • 加密和SSL加速。
  • 安全。它保护和隐藏了原始资源服务器,还可以用作应用防火墙防御一些网络攻击,比如DDoS。
  • 负载均衡。它帮应用服务器分配请求,以达到资源使用率最佳、吞吐率最大、响应时间最小的目的。
  • 缓存静态内容。代理缓存通常可以满足相当数量的网站请求,大大降低应用服务器上的负载。
  • 支持压缩。通过压缩优化可以提高网站访问速度,还能大大减少带宽的消耗。

在生产环境中,通常会在多个服务器启动多个tornado进程实例,使用Nginx在前端作为反向代理服务器来分发web请求,同时负载均衡。

反向代理实例

tornado服务demo.py

# coding: utf-8
import tornado.ioloop
import tornado.web
from multiprocessing import Pool
import sys
import os


class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world! PID: %s" % os.getpid())

application = tornado.web.Application([
    (r"/", MainHandler),
])

if __name__ == "__main__":
    def run(port):
        print 'Start Process on port: %s' % port
        sys.stdout.flush()
        application.listen(port)
        tornado.ioloop.IOLoop.instance().start()

    pool = Pool(3)
    pool.map(run, [8001, 8002, 8003])

我们运行demo.py,tornado会启动三个进程,分别侦听8001, 8002, 8003三个端口。

调整Nginx配置

负载均衡的目的是为了解决单个节点压力过大,造成Web服务响应过慢,严重的情况下导致服务瘫痪,无法正常提供服务的问题。Nginx负载均衡是通过upstream模块来实现的,内置实现了多种负载策略。Mac上Nginx的配置文件位于/usr/local/etc/nginx,用vim打开进行编辑。

负载均衡配置

upstream tornado.server {
   server 127.0.0.1:8001;
   server 127.0.0.1:8002;
   server 127.0.0.1:8003;
}

upstream指令主要用于负载均衡,设置一系列的后端服务器。nginx 的 upstream默认是以轮询的方式实现负载均衡,这种方式中,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。此外还有ip_hash、weight、url_hash、fair等负载均衡策略。upstream命名和服务器地址根据实际情况修改。我这里是本地起的三个tornado服务,所以server IP地址都配的是127.0.0.1,默认轮询的负载均衡。

反向代理配置

location / {
       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.server;
    }

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

完整配置示例


worker_processes  1;

events {
    worker_connections  1024;
    use kqueue;
}

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

    # 负载均衡配置
    upstream tornado.server {
        server 127.0.0.1:8001;
        server 127.0.0.1:8002;
        server 127.0.0.1:8003;
    }

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # 反向代理配置
        location / {
            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.server;
        }
    }
}

代理地址根据实际情况修改,其他缺省配置项采用默认值就可以。

重新加载ginx.conf

如果已经启动了Nginx,执行sudo nginx -s reload重新加载配置。

访问结果

直接在浏览器中访问http://127.0.0.1/,就可以访问demo应用了。每次刷新都返回了Hello, world! PID:18854,后面跟的pid是交替出现,说明负载均衡生效了。

参考

本文由 络壳 原创或整理,转载请注明出处