nginx 反向代理配置(一)

      文章转载:https://blog.csdn.net/physicsdandan/article/details/45667357

      什么是代理?

      代理在普通生活中的意义就是本来应该你做的事情,你让别人代你做了,那么那个帮你做的人就是你的代理。和在计算机网络中代理的概念差不多,

本来是要客户端做的网络访问,现在移交给另外一台机器做,那么那个机器就被称为代理服务器,代理服务器帮你访问。过程如下:

      正常情况:

      client-(send request)->server

      代理情况:

      client-(send request)->client proxy(send request)->server

      什么是反向代理?

      反向代理在计算机网络中是指这么一个过程,一般来说正向代理是客户端找人来代理把自己的请求转发给服务器,但是如果是反向代理,找代理的人不再

是客户端,而是服务端这边把自己接受的请求转发给背后的其他机器。

     反向代理情况:

     client-(send request)->server proxy(send request)->other server

      下面看一个示例:

#① part start
#运行nginx进程的账户
user www;
#
worker_process 1;
error_log /var/log/nginx/error.log
pid /var/run/nginx.pid;

events{
    use epoll;
    worker_connections 1024;
}

http{
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    access_log  /var/log/nginx/access.log  main;
    #
    sendfile        on;
    #
    keepalive_timeout  65;
    gzip  on;

    index   index.html index.htm;
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
    #② part start
    # 定义上游服务器列表组
    upstream web1 {
        server 127.0.0.1:111 weight=1;
        server 127.0.0.1:222 weight=1;
    }
    upstream web2 {
        server 127.0.0.2:111 weight=1;
        server 127.0.0.2:222 weight=6;
        server 127.0.0.2:333 weight=7;
    }
    #定义一个服务器,其监听80端口,配置的域名是www.company.com
    server{
        listen 80;
        # using www  domain to access the main website
        server_name www.company.com;
        access_log  /var/log/nginx/www.log

        location / {
            root /home/website_root;

        }
    }
    #③ part start
    #定义第二个服务器,其同样监听80端口,但是匹配域名是web.company.com
    server{
        listen 80;
        # using web sub domain to access
        server_name web.company.com;
        access_log  /var/log/nginx/web_access.log

        location / {
            root /home/web2_root;
            proxy_pass http://127.0.0.1:8080/web/;
            proxy_read_timeout 300;
            proxy_connect_timeout 300;
            proxy_redirect     off;

            proxy_set_header   X-Forwarded-Proto $scheme;
            proxy_set_header   Host              $http_host;
            proxy_set_header   X-Real-IP         $remote_addr;
        }
    }
    #定义第三个服务器,其同样监听80端口,但是匹配域名是web1.company.com,并把请求转发到web1上游服务
    server{
        listen 80;
        # using web1 sub domain to access
        server_name web1.company.com;
        access_log  /var/log/nginx/web1_access.log

        location / {
            root /home/web1_root;
            proxy_pass http://web1;
            proxy_read_timeout 300;
            proxy_connect_timeout 300;
            proxy_redirect     off;

            proxy_set_header   X-Forwarded-Proto $scheme;
            proxy_set_header   Host              $http_host;
            proxy_set_header   X-Real-IP         $remote_addr;
        }
    }
        #定义第三个服务器,其同样监听80端口,但是匹配域名是web2.company.com,并把请求转发到web2上游服务
    server{
        listen 80;
        # using web2 sub domain to access
        server_name web2.company.com;
        access_log  /var/log/nginx/web2_access.log

        location / {
            root /home/web2_root;
            proxy_pass http://web2;
            proxy_read_timeout 300;
            proxy_connect_timeout 300;
            proxy_redirect     off;

            proxy_set_header   X-Forwarded-Proto $scheme;
            proxy_set_header   Host              $http_host;
            proxy_set_header   X-Real-IP         $remote_addr;
        }
    }
}

       这个示例都做了什么?

       1.第一部分,定义了 nginx 通用规则

       2.第二部分,开始定义上游服务器组

       3.第三部分,开始定义 server,并指定如何使用第二部分定义的 upstream

       总体来说上面的示例提供了四个服务,www、web、web1、web2 4个网站,这个例子很适合一台机器,但是又想避免访问 url 中带有端口号,统一使用

域名方式访问。4个网站都监听 80 端口,但是分配不同的二级域名即可。这就需要 nginx 反向代理,具体如何实现,我们重新举一个例子,如下所示:

       (1) 只有一台服务器,一个 IP,一个域名 www.xsgzs.com

       (2) 这台服务器上有多个应用运行在不同端口,如:

           127.0.0.1:4000 运行着一个 博客应用

           127.0.0.1:3009 运行着一个博客后台管理系统

           我们不期望在访问的 url 中携带有端口号,统一使用域名方式访问,可以为运行在不同端口号的应用分配二级域名,同时把二级域名都解析到 80 端口,

但是转发到不同的端口去,希望访问  www.blog.xsgzs.com 能访问到 127.0.0.1:4000 ,访问 www.admin.xsgzs.com 能访问到 127.0.0.1:3009 

       具体步骤:

       (1) 在 nginx.conf 文件新增 upstream server(上游服务器)

upstream blog.xsgzs {
      server 127.0.0.1:4000
}

upstream admin.xsgzs {
      server 127.0.0.1:3009
}

  (2) 在配置文件中添加 server,都监听 80 端口

server {      
                              listen      80;      
                              server_name www.blog.xsgzs.com;      
                              location / {      
                                          proxy_pass http://blog.xsgzs;      
                              }      
                              error_page  500 502 503 504  /50x.html;    
                              location = /50x.html {        
                                              root  html;      
                              }
 }

 server {      
                              listen      80;      
                              server_name www.admin.xsgzs.com;      
                              location / {      
                                      proxy_pass http://admin.xsgzs;      
                              }      
                              error_page  500 502 503 504  /50x.html;    
                              location = /50x.html {        
                                          root  html;      
                                }
 }

       为什么需要反向代理?

       作为服务端代理,自然是一台机器处理不过来了,需要转发、分散请求给其他服务器做。下面列出一些适用场景:

       1.负载均衡:

       上面的例子1中 web1 和 web2 上游服务器组都使用了负载均衡,把请求转发向一组服务器。具体转发给哪台服务器,nginx 提供了多种负载均衡策略,上面使用的是加权方式

       2.一个域名,多个网站。 如上面的例2

       3.反向代理另一个作用就是隐藏后面的真实服务,以此达到一定的安全性

       仔细讲解各个模块

       nginx 配置文件主要分为六个区域

(1) main 全局设置
(2) events (nginx 工作模式)
(3) http (http设置)
(4) server (主机设置)
(5) location (URL匹配)
(6) upstream (负载均衡服务器设置)

  main 模块(全局设置)

       下面是一个 main 区域,它是一个全局设置

user nobody nobody;
worker_processes 2;
error_log  /usr/local/var/log/nginx/error.log  notice;
worker_rlimit_nofile 1024;

  user 用来设置运行 nginx 服务器的用户或用户组,语法格式:

user user [group]

  user , 指定可以运行 nginx 服务器的用户

       group,可选项,指定可以运行 nginx 服务器的用户组

       注:只有被指定的用户或用户组才有权限启动 nginx 进程,如果是其他用户 (test_user) 尝试启动 nginx 进程,将会报错

nginx: [emerg] getpwnam("test_user") failed (2:No such file or directory) in /Nginx/conf/nginx.conf:2

  从上面的报错信息中可以知道,nginx 无法运行的原因是查找 test_user 失败,引起错误的原因在 nginx.conf 文件第二行即

配置运行 nginx 服务器的用户或用户组

        如果希望所有的用户或用户组都有权限启动 nginx 进程,有两种方式:一是将此行指令注释掉、而是将用户或用户组设置

为 nobody,这也是 user 指令的默认值

        worker_processes  用来指定 nginx 要开启的子进程数目

        worker prcocess 是 nginx 服务器实现并发处理的关键所在,从理论上来说,worker process 的值越大,可以支持的并发处理量越大,但实际上它还要受到来自软件本身、

操作系统本身资源和能力、硬件设备(如:CPU 和 磁盘驱动器)等制约,其语法格式:

worker_processes number | auto

  number,来指定 nginx 要开启的子进程数目

       auto,nginx 自动检测

       在默认配置文件中,number = 1,启动 nginx 服务器之后,使用以下命令可以看到此时的 nginx 除了主进程 master process 之外还生成了一个 worker process,在这里我将

number 指定为 4 ,除了主进程 master process 之外还生成了 4 个 worker process

        error_log 关于错误日志的配置可以参考这一篇文章:

猜你喜欢

转载自www.cnblogs.com/leeyongbard/p/10883346.html
今日推荐