Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1868|回复: 0
打印 上一主题 下一主题

nginx HTTP服务器 反向代理服务器 负载均衡

[复制链接]

697

主题

1142

帖子

4086

积分

认证用户组

Rank: 5Rank: 5

积分
4086
跳转到指定楼层
楼主
发表于 2018-11-9 19:02:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 java 于 2018-11-9 19:09 编辑


nginx入门、安装配置与使用详解

本文内容:

1. nginx 简介

2. nginx 安装配置

3. nginx使用

4.nginx配置location总结及rewrite规则写法


一、Nginx 的三大功能



1.HTTP服务器

Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML、图片)通过HTTP协议展现给客户端。


2.反向代理服务器

Nginx也是反向代理服务器。


说反向代理之前先说一下正向代理,正向代理相信很多大陆同胞都在这片神奇的土地上用过了。就是访问国外网被墙了,然后找个代理服务,通过该服务器访问国外网站,这个是正向代理。


反向代理是 客户端访问代理服务器,但是代理服务器没有用户需要的资源,然后代理服务器偷偷访问应用服务器,获取资源返回给用户,用户不知道代理服务器是访问了应用服务器,代理服务器也隐藏了应用服务器的url。(反向代理的典型用途是将 防火墙后面的服务器提供给Internet用户访问)




3.负载均衡

Nginx可以通过反向代理来实现负载均衡。




二、Nginx 安装



2.1 CentOS 7 安装 Nginx

2.1.1.添加Nginx到YUM源


添加CentOS 7 Nginx yum资源库,打开终端,使用以下命令:


sudo rpm -Uvh http://nginx.org/packages/centos ... .el7.ngx.noarch.rpm



2.2.2.安装Nginx


在你的CentOS 7 服务器中使用yum命令从Nginx源服务器中获取来安装Nginx:


sudo yum install -y nginx

Nginx将完成安装在你的CentOS 7 服务器中。


2.2.3. Nginx启动


nginx -c nginx.conf



启动后就可以访问 域名或者本机IP 如果出现下图,说明启动成功。






2.2.4. Nginx 停止


//查询出nginx的pid

ps -ef|grep nginx

//通过kill 命令杀死 nginx

kill pid



注意图中nginx的 pid 为 10497





2.2.5. Nginx配置信息


网站文件存放默认目录


/usr/share/nginx/html

网站默认站点配置


/etc/nginx/conf.d/default.conf

自定义Nginx站点配置文件存放目录


/etc/nginx/conf.d/

Nginx全局配置


/etc/nginx/nginx.conf

2.2 docker 安装 Nginx

2.2.1下载镜像,


docker pull nginx:1.9

2.2.2 启动容器,


docker run -d -p 8080:80 nginx:1.9

把容器内的nginx的80端口,映射到当前服务器的8080端口,假设当前服务器的ip是192.168.0.100,浏览器输入http://192.168.0.100:8080/,就可以看到nginx已启动,


三、Nginx 使用

关于静态资源服务器的使用这里就不做说明了。

3.1 反向代理

小例子:实现访问本机 ip 然后代理 我的博地址 ,也就是在浏览器输入本机地址,然后跳转到我的博客。


3.1.1 本地安装nginx

如果是本地安装的nginx 的话需要修改 /etc/nginx/conf.d/default.conf 配置文件


注释原有的 location 然后替换为新的location


//注释原有的

# location / {

# root /usr/share/nginx/html;

  # index index.html index.htm;

   # }


//新添加的

location / {

    proxy_pass http://blog.csdn.net/u012373815?viewmode=list;

}

然后重启nginx ,访问本机ip 就会代理到“http://blog.csdn.net/u012373815?viewmode=list“ 我的博客地址。




3.1.2 Docker 安装

如果是docker 安装的话,需要本地随意目录下新建default.conf 文件,内容如下:


server {

    listen       80;

    server_name  localhost;


    #charset koi8-r;

    #access_log  /var/log/nginx/log/host.access.log  main;


    location / {

    proxy_pass http://blog.csdn.net/u012373815?viewmode=list;

}



    error_page   500 502 503 504  /50x.html;

    location = /50x.html {

        root   /usr/share/nginx/html;

    }

}

然后重新启动容器,将default.conf 文件映射到docker容器内。

启动命令如下:


docker run -p 8080:80 --name myNginx -v /本地路径/default.conf:/etc/nginx/conf.d/default.conf -d nginx:1.9  

容器启动后 ,访问本机ip 就会代理到“http://blog.csdn.net/u012373815?viewmode=list“ 我的博客地址。




3.2 负载均衡

  上面的配置只实现了反向代理没有实现传说中的负载均衡。所有的请求就都被反向代理到 我的博客地址去了。这样我们反向代理的功能是实现了,可是就能代理到一台服务器上哪有什么负载均衡呀?这就要用到 nginx 的 upstream 模块了。


upstream backend {

    ip_hash;

    server backend1.example.com;

    server backend2.example.com;

    server backend3.example.com;

    server backend4.example.com;

}

location / {

    proxy_pass http://backend;

}

我们在 upstream 中指定了一组机器,并将这个组命名为 backend,这样在 proxypass 中只要将请求转移到 backend 这个 upstream 中我们就实现了在四台机器的反向代理加负载均衡。其中的 iphash指明了我们均衡的方式是按照用户的 ip 地址进行分配。

要让配置生效,我们不必重启 nginx 只需要 reload 配置即可。


负载均衡配置示例


   假设这样一个应用场景:将应用部署在 192.168.1.11:80、192.168.1.12:80、192.168.1.13:80 三台 linux 环境的服务器上。网站域名叫 www.helloworld.com,公网 IP 为 192.168.1.11。在公网 IP 所在的服务器上部署 nginx,对所有请求做负载均衡处理。


nginx.conf 配置如下:


http {

     #设定mime类型,类型由mime.type文件定义

    include       /etc/nginx/mime.types;

    default_type  application/octet-stream;

    #设定日志格式

    access_log    /var/log/nginx/access.log;


    #设定负载均衡的服务器列表

    upstream load_balance_server {

        #weigth参数表示权值,权值越高被分配到的几率越大

        server 192.168.1.11:80   weight=5;

        server 192.168.1.12:80   weight=1;

        server 192.168.1.13:80   weight=6;

    }


   #HTTP服务器

   server {

        #侦听80端口

        listen       80;


        #定义使用www.xx.com访问

        server_name  www.helloworld.com;


        #对所有请求进行负载均衡请求

        location / {

            root        /root;                 #定义服务器的默认网站根目录位置

            index       index.html index.htm;  #定义首页索引文件的名称

            proxy_pass  http://load_balance_server ;#请求转向load_balance_server 定义的服务器列表


            #以下是一些反向代理的配置(可选择性配置)

            #proxy_redirect off;

            proxy_set_header Host $host;

            proxy_set_header X-Real-IP $remote_addr;

            #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP

            proxy_set_header X-Forwarded-For $remote_addr;

            proxy_connect_timeout 90;          #nginx跟后端服务器连接超时时间(代理连接超时)

            proxy_send_timeout 90;             #后端服务器数据回传时间(代理发送超时)

            proxy_read_timeout 90;             #连接成功后,后端服务器响应时间(代理接收超时)

            proxy_buffer_size 4k;              #设置代理服务器(nginx)保存用户头信息的缓冲区大小

            proxy_buffers 4 32k;               #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置

            proxy_busy_buffers_size 64k;       #高负荷下缓冲大小(proxy_buffers*2)

            proxy_temp_file_write_size 64k;    #设定缓存文件夹大小,大于这个值,将从upstream服务器传


            client_max_body_size 10m;          #允许客户端请求的最大单文件字节数

            client_body_buffer_size 128k;      #缓冲区代理缓冲用户端请求的最大字节数

        }

    }

}



四、nginx配置location总结及rewrite规则写法


4.1 正则


. : 匹配除换行符以外的任意字符

? : 重复0次或1次

+ : 重复1次或更多次

* : 重复0次或更多次

\d :匹配数字

^ : 匹配字符串的开始

$ : 匹配字符串的介绍

{n} : 重复n次

{n,} : 重复n次或更多次

[c] : 匹配单个字符c

[a-z] : 匹配a-z小写字母的任意一个

~ 区分大小写匹配

~* 不区分大小写匹配

!~和!~*分别为区分大小写不匹配及不区分大小写不匹配

^ 以什么开头的匹配

$ 以什么结尾的匹配

小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容。正则里面容易让人困惑的是\转义特殊字符。

4.2 常用变量


$args : #这个变量等于请求行中的参数,同$query_string

$content_length : 请求头中的Content-length字段。

$content_type : 请求头中的Content-Type字段。

$document_root : 当前请求在root指令中指定的值。

$host : 请求主机头字段,否则为服务器名称。

$http_user_agent : 客户端agent信息

$http_cookie : 客户端cookie信息

$limit_rate : 这个变量可以限制连接速率。

$request_method : 客户端请求的动作,通常为GET或POST。

$remote_addr : 客户端的IP地址。

$remote_port : 客户端的端口。

$remote_user : 已经经过Auth Basic Module验证的用户名。

$request_filename : 当前请求的文件路径,由root或alias指令与URI请求生成。

$scheme : HTTP方法(如http,https)。

$server_protocol : 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。

$server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。

$server_name : 服务器名称。

$server_port : 请求到达服务器的端口号。

$request_uri : 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。

$uri : 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。

$document_uri : 与$uri相同。

4.3 flag标志位


last : 相当于Apache的[L]标记,表示完成rewrite

break : 停止执行当前虚拟主机的后续rewrite指令集

redirect : 返回302临时重定向,地址栏会显示跳转后的地址

permanent : 返回301永久重定向,地址栏会显示跳转后的地址

#路径重写配置Demo

location /demo/test/ {

    #以/demo/test路径开始

    #原始路径: http://127.0.0.1:8080/demo/test/1.html 重写后:http://127.0.0.1:8888/demo/test2/1.html

    rewrite ^/demo/test/(.*)$ http://127.0.0.1:8888/demo/test2/$1 break;

                        

    #以html文件结尾

    #原始路径: http://127.0.0.1:8080/demo/test/1.html 重写后:http://127.0.0.1:8888/test/demo/test/1.html

    # 此种方式配置会改变浏览器地址,引发跨域请求的问题

    #rewrite ^/(.*\.html)$ http://127.0.0.1:8888/test/$1 break;

   

    # 此种方式,结合proxy_pass 重写后则不会改变浏览器地址,不存在跨域问题

    #rewrite ^/(.*\.html)$ /test/$1 break;

    #proxy_pass http://127.0.0.1:8888;

}

参考资料:

http://blog.csdn.net/u012486840/article/details/52610320

http://www.jb51.net/article/61137.htm


http://seanlook.com/2015/05/17/nginx-location-rewrite/


作者:双斜杠少年 来源:CSDN 原文:https://blog.csdn.net/u012373815/article/details/54911332

http://www.keydatas.com/html/nginx.html

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-11-23 13:08 , Processed in 0.063317 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表