精华内容
下载资源
问答
  • nginx应用场景

    千次阅读 多人点赞 2018-07-04 15:18:23
    一:nginx简介 HTTP(S) server and reverse proxy, and IMAP/POP3 proxy server Nginx (engine x). 是一款轻量级的Web服务器 、反向代理服务器、电子邮件(IMAP/POP3)代理服务器、通用TCP/UDP代理服务器、...
    分享一个朋友的人工智能教程(请以“右键”->"在新标签页中打开连接”的方式访问)。比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看。

    一:HTTP服务器

    Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。

    1、 首先在文档根目录Docroot(/usr/local/var/www)下创建html目录, 然后在html中放一个test.html;
    这里写图片描述
    2、 配置nginx.conf中的server

    user mengday staff;
    
    http {
    	server {
    		listen       80;
    		server_name  localhost;
    		client_max_body_size 1024M;
    		
    		# 默认location
    		location / {
    		    root   /usr/local/var/www/html;
    		    index  index.html index.htm;
    		}
    	}
    }
    

    3、访问测试

    • http://localhost/ 指向/usr/local/var/www/index.html, index.html是安装nginx自带的html
    • http://localhost/test.html 指向/usr/local/var/www/html/test.html

    注意:如果访问图片出现403 Forbidden错误,可能是因为nginx.conf 的第一行user配置不对,默认是#user nobody;是注释的,linux下改成user root; macos下改成user 用户名 所在组; 然后重新加载配置文件或者重启,再试一下就可以了, 用户名可以通过who am i 命令来查看。

    4、指令简介

    • server : 用于定义服务,http中可以有多个server块
    • listen : 指定服务器侦听请求的IP地址和端口,如果省略地址,服务器将侦听所有地址,如果省略端口,则使用标准端口
    • server_name : 服务名称,用于配置域名
    • location : 用于配置映射路径uri对应的配置,一个server中可以有多个location, location后面跟一个uri,可以是一个正则表达式, / 表示匹配任意路径, 当客户端访问的路径满足这个uri时就会执行location块里面的代码
    • root : 根路径,当访问http://localhost/test.html,“/test.html”会匹配到"/"uri, 找到root为/usr/local/var/www/html,用户访问的资源物理地址=root + uri = /usr/local/var/www/html + /test.html=/usr/local/var/www/html/test.html
    • index : 设置首页,当只访问server_name时后面不跟任何路径是不走root直接走index指令的;如果访问路径中没有指定具体的文件,则返回index设置的资源,如果访问http://localhost/html/ 则默认返回index.html

    5、location uri正则表达式

    . : 匹配除换行符以外的任意字符
    ? : 重复0次或1次
    + : 重复1次或更多次
    * : 重复0次或更多次
    \d :匹配数字
    ^ : 匹配字符串的开始
    $ : 匹配字符串的结束
    {n} : 重复n次
    {n,} : 重复n次或更多次
    [c] : 匹配单个字符c
    [a-z] : 匹配a-z小写字母的任意一个
    (a|b|c) : 属线表示匹配任意一种情况,每种情况使用竖线分隔,一般使用小括号括括住,匹配符合a字符 或是b字符 或是c字符的字符串
    \ 反斜杠:用于转义特殊字符
    
    小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容。正则里面容易让人困惑的是\转义特殊字符。
    

    二: 静态服务器

    在公司中经常会遇到静态服务器,通常会提供一个上传的功能,其他应用如果需要静态资源就从该静态服务器中获取。

    1、在/usr/local/var/www 下分别创建images和img目录,分别在每个目录下放一张test.jpg

    这里写图片描述

    http {
    	server {
    		listen       80;
    		server_name  localhost;
    		
    		
    		set $doc_root /usr/local/var/www;
    		
    		# 默认location
    		location / {
    		    root   /usr/local/var/www/html;
    		    index  index.html index.htm;
    		}
    		
    		location ^~ /images/ {
                root $doc_root;
           }
            
           location ~* \.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$ {
               root $doc_root/img;
           }
    	}
    }
    
    

    自定义变量使用set指令,语法 set 变 量 名 值 ; 引 用 使 用 变量名 值; 引用使用 ;使变量名; 这里自定义了doc_root变量。

    静态服务器location的映射一般有两种方式:

    • 使用路径,如 /images/ 一般图片都会放在某个图片目录下,
    • 使用后缀,如 .jpg、.png 等后缀匹配模式

    访问http://localhost/test.jpg 会映射到$doc_root/img

    访问http://localhost/images/test.jpg 当同一个路径满足多个location时,优先匹配优先级高的location,由于^~ 的优先级大于 ~, 所以会走/images/对应的location

    常见的location路径映射路径有以下几种:

    =		进行普通字符精确匹配。也就是完全匹配。
    ^~ 		前缀匹配。如果匹配成功,则不再匹配其他location。
    ~ 		表示执行一个正则匹配,区分大小写
    ~* 		表示执行一个正则匹配,不区分大小写
    /xxx/   常规字符串路径匹配
    / 		通用匹配,任何请求都会匹配到
    

    location优先级

    当一个路径匹配多个location时究竟哪个location能匹配到时有优先级顺序的,而优先级的顺序于location值的表达式类型有关,和在配置文件中的先后顺序无关。相同类型的表达式,字符串长的会优先匹配。

    以下是按优先级排列说明:

    1. 等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项,停止搜索。
    2. ^~类型表达式,不属于正则表达式。一旦匹配成功,则不再查找其他匹配项,停止搜索。
    3. 正则表达式类型(~ ~*)的优先级次之。如果有多个location的正则能匹配的话,则使用正则表达式最长的那个。
    4. 常规字符串匹配类型。按前缀匹配。
    5. / 通用匹配,如果没有匹配到,就匹配通用的

    优先级搜索问题:不同类型的location映射决定是否继续向下搜索

    • 等号类型、^~类型:一旦匹配上就停止搜索了,不会再匹配其他location了
    • 正则表达式类型(~ ~*),常规字符串匹配类型/xxx/ : 匹配到之后,还会继续搜索其他其它location,直到找到优先级最高的,或者找到第一种情况而停止搜索

    location优先级从高到底:

    (location =) > (location 完整路径) > (location ^~ 路径) > (location ,* 正则顺序) > (location 部分起始路径) > (/)

    location = / {
    	# 精确匹配/,主机名后面不能带任何字符串 /
    	[ configuration A ]
    }
    location / {
    	# 匹配所有以 / 开头的请求。
    	# 但是如果有更长的同类型的表达式,则选择更长的表达式。
    	# 如果有正则表达式可以匹配,则优先匹配正则表达式。
    	[ configuration B ]
    }
    location /documents/ {
    	# 匹配所有以 /documents/ 开头的请求,匹配符合以后,还要继续往下搜索。
    	# 但是如果有更长的同类型的表达式,则选择更长的表达式。
    	# 如果有正则表达式可以匹配,则优先匹配正则表达式。
    	[ configuration C ]
    }
    location ^~ /images/ {
    	# 匹配所有以 /images/ 开头的表达式,如果匹配成功,则停止匹配查找,停止搜索。
    	# 所以,即便有符合的正则表达式location,也不会被使用
    	[ configuration D ]
    }
    
    location ~* \.(gif|jpg|jpeg)$ {
    	# 匹配所有以 gif jpg jpeg结尾的请求。
    	# 但是 以 /images/开头的请求,将使用 Configuration D,D具有更高的优先级
    	[ configuration E ]
    }
    
    location /images/ {
    	# 字符匹配到 /images/,还会继续往下搜索
    	[ configuration F ]
    }
    
    
    location = /test.htm {
        root   /usr/local/var/www/htm;
        index  index.htm;
    }
    
    
    注意:location的优先级与location配置的位置无关
    

    三: 反向代理

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

    简单来说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。
    反向代理通过proxy_pass指令来实现。

    启动一个Java Web项目,端口号为8081

    server {
        listen       80;
        server_name  localhost;
    
        location / {
            proxy_pass http://localhost:8081;
            proxy_set_header Host $host:$server_port;
            # 设置用户ip地址
    		 proxy_set_header X-Forwarded-For $remote_addr;
    		 # 当请求服务器出错去寻找其他服务器
    		 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; 
        }
        
    }   
    

    当我们访问localhost的时候,就相当于访问 localhost:8081了

    四:负载均衡

    负载均衡也是Nginx常用的一个功能,负载均衡其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。而Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略。

    负载均衡通过upstream指令来实现。

    1. RR(round robin :轮询 默认):

    每个请求按时间顺序逐一分配到不同的后端服务器,也就是说第一次请求分配到第一台服务器上,第二次请求分配到第二台服务器上,如果只有两台服务器,第三次请求继续分配到第一台上,这样循环轮询下去,也就是服务器接收请求的比例是 1:1, 如果后端服务器down掉,能自动剔除。轮询是默认配置,不需要太多的配置

    同一个项目分别使用8081和8082端口启动项目

    upstream web_servers {  
       server localhost:8081;  
       server localhost:8082;  
    }
    
    server {
        listen       80;
        server_name  localhost;
        #access_log  logs/host.access.log  main;
    
    
        location / {
            proxy_pass http://web_servers;
            # 必须指定Header Host
            proxy_set_header Host $host:$server_port;
        }
     }
    

    访问地址仍然可以获得响应 http://localhost/api/user/login?username=zhangsan&password=111111 ,这种方式是轮询的

    2. 权重

    指定轮询几率,weight和访问比率成正比, 也就是服务器接收请求的比例就是各自配置的weight的比例,用于后端服务器性能不均的情况,比如服务器性能差点就少接收点请求,服务器性能好点就多处理点请求。

    upstream test {
        server localhost:8081 weight=1;
        server localhost:8082 weight=3;
        server localhost:8083 weight=4 backup;
    }
    

    示例是4次请求只有一次被分配到8081上,其他3次分配到8082上。backup是指热备,只有当8081和8082都宕机的情况下才走8083

    3. ip_hash

    上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用iphash了,iphash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

    upstream test {
        ip_hash;
        server localhost:8080;
        server localhost:8081;
    }
    

    4. fair(第三方)

    按后端服务器的响应时间来分配请求,响应时间短的优先分配。这个配置是为了更快的给用户响应

    upstream backend {
        fair;
        server localhost:8080;
        server localhost:8081;
    }
    

    5. url_hash(第三方)

    按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

    upstream backend {
        hash $request_uri;
        hash_method crc32;
        server localhost:8080;
        server localhost:8081;
    }
    

    以上5种负载均衡各自适用不同情况下使用,所以可以根据实际情况选择使用哪种策略模式,不过fair和url_hash需要安装第三方模块才能使用。

    五:动静分离

    动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路。

    upstream web_servers {  
           server localhost:8081;  
           server localhost:8082;  
    }
    
    server {
        listen       80;
        server_name  localhost;
    
        set $doc_root /usr/local/var/www;
    
        location ~* \.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$ {
           root $doc_root/img;
        }
    
        location / {
            proxy_pass http://web_servers;
            # 必须指定Header Host
            proxy_set_header Host $host:$server_port;
        }
    
        error_page 500 502 503 504  /50x.html;  
        location = /50x.html {  
            root $doc_root;
        }
        
     }
    

    六:其他

    1.return指令

    返回http状态码 和 可选的第二个参数可以是重定向的URL

    location /permanently/moved/url {
        return 301 http://www.example.com/moved/here;
    }
    

    2. rewrite指令

    重写URI请求 rewrite,通过使用rewrite指令在请求处理期间多次修改请求URI,该指令具有一个可选参数和两个必需参数。 第一个(必需)参数是请求URI必须匹配的正则表达式。 第二个参数是用于替换匹配URI的URI。 可选的第三个参数是可以停止进一步重写指令的处理或发送重定向(代码301或302)的标志

    location /users/ {
        rewrite ^/users/(.*)$ /show?user=$1 break;
    }
    

    3. error_page指令

    使用error_page指令,您可以配置NGINX返回自定义页面以及错误代码,替换响应中的其他错误代码,或将浏览器重定向到其他URI。 在以下示例中,error_page指令指定要返回404页面错误代码的页面(/404.html)。

    error_page 404 /404.html;
    

    4. 日志

    访问日志:需要开启压缩 gzip on; 否则不生成日志文件,打开log_format、access_log注释

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
                          
    access_log  /usr/local/etc/nginx/logs/host.access.log  main;
    
    gzip  on;
    

    5. deny 指令

    # 禁止访问某个目录
    location ~* \.(txt|doc)${
        root $doc_root;
        deny all;
    }	
    

    6. 内置变量

    nginx的配置文件中可以使用的内置变量以美元符$开始,也有人叫全局变量。其中,部分预定义的变量的值是可以改变的。

    - $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相同
    
    
    展开全文
  • nginx应用:使用nginx进行负载均衡

    千次阅读 2018-06-01 07:18:59
    经常会说七层负载均衡还是四层负载均衡,其实根据ISO的OSI网络模型的所在层的叫法而决定的,nginx因为在使用http协议在应用层进行负载均衡的操作,所以被称为七层负载均衡。而诸如LVS在TCP层进行负载均衡操作的则被...

    这里写图片描述
    nginx一般可以用于七层的负载均衡,这篇文章将介绍一些负载均衡的基本知识以及使用nginx进行负载均衡的简单的例子。

    四层负载均衡 vs 七层负载均衡

    经常会说七层负载均衡还是四层负载均衡,其实根据ISO的OSI网络模型的所在层的叫法而决定的,nginx因为在使用http协议在应用层进行负载均衡的操作,所以被称为七层负载均衡。而诸如LVS在TCP层进行负载均衡操作的则被称为四层负载均衡。一般来说,有如下层的负载均衡分类:

    类别OSI模型层说明
    二层负载均衡MAC层根据MAC地址进行响应
    三层负载均衡IP层根据IP地址进行响应
    四层负载均衡TCP层在IP地址的基础上结合端口号进行响应
    七层负载均衡HTTP层在四层的基础上,可继续根据URL/浏览器类别等七层的信息进行进一步的响应

    常见软件的支持

    软件四层负载均衡七层负载均衡
    nginx轻量实现支持http和mail,性能与haproxy相近
    haproxy-支持七层负载均衡
    LVS支持四层负载均衡,实现较重-
    F5硬件实现,成本高-

    常见的负载均衡算法

    负载均衡常见有如下几种算法:

    负载均衡算法负载均衡算法(E)nginx支持与否说明适用场景
    普通轮询Round Robin支持权重相同的轮询适用于外部服务请求和内部服务器都相对均衡的场景
    权重轮询Weighted Round Robin支持(weight)可以设定不同权重进行轮询服务器的处理能力不同,或则希望进行流量的控制,比如Canary Release
    随机均衡Random-随机分配给服务器外部和内部均非常均衡的场合,或者需要随机的分配的需求较强
    权重随机Weighted Random-结合权重随机分配给服务器可结合权重调节随机策略,更好地适应现实中分布状况
    响应速度Response Time支持(fair)根据服务器的响应速度进行分配服务器性能和服务器当前运行状况的结合,此种策略能动态的调整状态,避免能者已经不能的情况下仍然被大量分配作业
    最少连接Least Connection根据连接的数量进行分配轮询做的是分配任务,由于实际情况中无法控制轮训分配的任务,但是无法确认任务完成的速度,会导致反映真实服务器负荷的连接数产生不同,适合于长时间提供长连接服务的业务,比如网上的客服的WebSocket的实现,或者FTP/SFTP等服务。
    DNS响应Flash DNS-根据最快返回的DNS解析结果来继续请求服务,忽略其他DNS返回的IP地址适用于具有全局负载均衡的情况下,比如CDN

    负载均衡演示实例:普通轮询

    接下来使用nginx来演示一下如何进行普通轮询:

    负载均衡算法负载均衡算法(E)nginx支持与否说明适用场景
    普通轮询Round Robin支持权重相同的轮询适用于外部服务请求和内部服务器都相对均衡的场景

    事前准备

    事前在7001/7002两个端口分别启动两个服务,用于显示不同信息,为了演示方便,使用tornado做了一个镜像,通过docker容器启动时传递的参数不同用于显示服务的不同。

    [root@kong ~]# docker run -d -p 7001:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "User Service 1: 7001"
    ddba0abd24524d270a782c3fab907f6a35c0ce514eec3159357bded09022ee57
    [root@kong ~]# docker run -d -p 7002:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "User Service 1: 7002"
    95deadd795e19f675891bfcd44e5ea622c95615a95655d1fd346351eca707951
    [root@kong ~]# 
    [root@kong ~]# curl http://192.168.163.117:7001
    Hello, Service :User Service 1: 7001
    [root@kong ~]# 
    [root@kong ~]# curl http://192.168.163.117:7002
    Hello, Service :User Service 1: 7002
    [root@kong ~]# 

    启动nginx

    [root@kong ~]# docker run -p 9080:80 --name nginx-lb -d nginx 
    9d53c7e9a45ef93e7848eb3f4e51c2652a49681e83bda6337c89a3cf2f379c74
    [root@kong ~]# docker ps |grep nginx-lb
    9d53c7e9a45e        nginx                      "nginx -g 'daemon ..."   11 seconds ago      Up 10 seconds       0.0.0.0:9080->80/tcp                                                 nginx-lb
    [root@kong ~]#

    nginx代码段

    准备如下nginx代码段将其添加到nginx的/etc/nginx/conf.d/default.conf中

    http {
    upstream nginx_lb {
        server 192.168.163.117:7001;
        server 192.168.163.117:7002;
    }
    server {
        listen       80;
        server_name  www.liumiao.cn 192.168.163.117;
        location / {
            proxy_pass http://nginx_lb;
        }
    
    }

    修改default.conf的方法

    可以通过在容器中安装vim达到效果,也可以在本地修改然后通过docker cp传入,或者直接sed修改都可。如果在容器中安装vim,使用如下方式即可

    [root@kong ~]# docker exec -it nginx-lb sh
    # apt-get update
    ...省略
    # apt-get install vim
    ...省略

    修改前

    # cat default.conf
    server {
        listen       80;
        server_name  localhost;
    
        #charset koi8-r;
        #access_log  /var/log/nginx/host.access.log  main;
    
        location / {
            root   /usr/share/nginx/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   /usr/share/nginx/html;
        }
    
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}
    
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}
    
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }
    
    #

    修改后

    # cat default.conf
    upstream nginx_lb {
        server 192.168.163.117:7001;
        server 192.168.163.117:7002;
    }
    
    server {
        listen       80;
        server_name  www.liumiao.cn 192.168.163.117;
    
        #charset koi8-r;
        #access_log  /var/log/nginx/host.access.log  main;
    
        location / {
            #root   /usr/share/nginx/html;
            #index  index.html index.htm;
            proxy_pass http://nginx_lb;
        }
    
        #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   /usr/share/nginx/html;
        }
    
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}
    
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}
    
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }
    
    #

    重启nginx容器

    [root@kong ~]# docker restart nginx-lb
    nginx-lb
    [root@kong ~]#

    确认结果

    可以清晰地看到按照顺序,进行轮询:

    [root@kong ~]# curl http://localhost:9080
    Hello, Service :User Service 1: 7001
    [root@kong ~]# curl http://localhost:9080
    Hello, Service :User Service 1: 7002
    [root@kong ~]# curl http://localhost:9080
    Hello, Service :User Service 1: 7001
    [root@kong ~]# curl http://localhost:9080
    Hello, Service :User Service 1: 7002
    [root@kong ~]#

    负载均衡演示实例:权重轮询

    而在此基础上,进行权重轮询只需要加上weight即可

    负载均衡算法负载均衡算法(E)nginx支持与否说明适用场景
    权重轮询Weighted Round Robin支持(weight)可以设定不同权重进行轮询服务器的处理能力不同,或则希望进行流量的控制,比如Canary Release

    修改default.conf

    按照如下修改default.conf

    # cp default.conf default.conf.org
    # vi default.conf
    # diff default.conf default.conf.org
    2,3c2,3
    <     server 192.168.163.117:7001 weight=100;
    <     server 192.168.163.117:7002 weight=200;
    ---
    >     server 192.168.163.117:7001;
    >     server 192.168.163.117:7002;
    #

    重启nginx容器

    [root@kong ~]# docker restart nginx-lb
    nginx-lb
    [root@kong ~]#

    确认结果

    可以看到轮询结果按照1/3和2/3的比重在进行了:

    [root@kong ~]# curl http://localhost:9080
    Hello, Service :User Service 1: 7001
    [root@kong ~]# curl http://localhost:9080
    Hello, Service :User Service 1: 7002
    [root@kong ~]# curl http://localhost:9080
    Hello, Service :User Service 1: 7002
    [root@kong ~]# 
    展开全文
  • Nginx应用场景,Nginx是用来干什么的

    千次阅读 2019-09-06 00:00:16
    工作中经常用到Nginx,经常看到什么正向代理,反向代理,负载均衡,静态资源缓存之类的名词,这篇博客主要介绍一下什么时候会用到Nginx,用到它的哪种功能,暂时不涉及具体配置方法。

    写这篇博客的目的

    这篇文章不涉及具体配置方法
    工作中经常用到Nginx,经常看到什么正向代理,反向代理,负载均衡,静态资源缓存之类的名词,这篇博客主要介绍一下什么时候会用到Nginx,用到它的哪种功能。

    处理静态资源

    缓解后台服务器压力,将静态资源在不经过tomcat等容器的情况下,返回给客户端,减少tomcat等后端容器接受到的请求数量。为什么用Nginx处理静态资源

    正向代理

    什么是正向代理

    正向代理的特点
    Nginx根据接收到的参数,判断出应该到哪个地址,发送什么数据,然后根据这些获取数据,获取后返回给客户端

    • Nginx根据传入参数确定去哪个地址获取数据,而不是根据url地址(在未接收到请求之前,不知道会去连接哪台服务器)
    • Nginx拥有自己的地址,但是这个地址不是数据来源
      举个例子(小明又出现了):
    委托小明去快递站B取快递
    取快递
    小明 联系方式xxxx
    快递站B
    要求Nginx去获取www.baidu.com的内容
    根据浏览器给的参数www.baidu.com去获取内容
    浏览器
    Nginx ip地址 xxx.xxx.xxx.xxx
    baidu服务器

    如上所示,我委托小明去快递站B帮我取一件快递,取件号6-4-3001,小明到快递站获取快递,交给我。在这个过程中,小明是根据我告诉他的信息知道应该去快递站B,告诉快递站取件号是6-4-3001,然后获取快递。在这个过程中,小明是我的代理人,代替我去取快递。这个过程中小明起的作用就是正向代理。

    • 我们是根据小明的手机号联系的小明,不是通过快递站联系的小明
    • 小明与快递站没有关系,他可能去顺丰的快递站,也会帮忙取外卖,也可以帮忙买火车票
    • 快递,外卖,火车票都与小明没有关系,小明只是根据客户要求取指定的东西

    什么时候会用到正向代理

    说实话,我在工作中从来没有用到过正向代理,大概跟我接触的公司都不算太大,我也不是运维有关。能想到的场景就是以下几个

    • 在限制连接互联网的内网设置一台代理来连接外网,根据规则限制内网访问的网站(还没研究能不能完成这个)
    • 两个局域网之间的通信
    • 开放一个公司内网的机器到公网做代理,员工通过这台机器访问公司内网。

    反向代理

    什么是反向代理

    Nginx根据接收到的请求的端口,域名,url,将请求转发给不同的机器,不同的端口(或者直接返回结果),然后将返回的数据返回给客户端。(匹配规则在这里不再介绍,有机会再详细说明)

    反向代理特点

    • Nginx没有自己的地址,它的地址就是服务器的地址,如www.baidu.com,对外部来讲,它就是数据的生产者
    • Ngxin明确的知道应该去哪个服务器获取数据(在未接收到请求之前,已经确定应该连接哪台服务器)
      举个例子:
    打快递公司电话xxxxx问我的快递在没在他们那
    问员工C快递在不在这
    小明 快递公司前台
    快递公司员工C
    www.baidu.com
    根据配置分配给后方服务器
    浏览器
    Nginx 域名www.baidu.com
    baidu服务器

    如上所示,我要查询我的快递在不在快递站,打快递站电话(对外公开的域名),首先由前台小明接受我的请求,然后小明根据我的请求,把查询的任务分配给公司内具体的某人,查询出结果返回给小明,小明再告诉我。在这个过程中,小明把我的请求交给谁,具体谁处理,我是不知道的。而且小明只会处理查询之类与快递公司有关的业务。我只知道快递公司对外的联系电话,不知道公司内有小花,小兰这些员工,他们对我来说是透明的,我只与快递公司的代表小明打交道。

    • 我是根据快递公司电话(域名)联系到小明的,小明对我来说不具有自己的联系方式
    • 对我来说,小明就是数据的生产方,具体小明的数据是从哪获取的,我并不关心。

    什么时候会用到反向代理

    反向代理应用的地方还是很多的

    • 多个项目要用相同域名对外提供服务
    • 负载均衡(与反向代理同时配置)
    • 微服务
    • 非法请求过滤

    负载均衡

    什么是负载均衡

    Nginx根据反向代理规则匹配之后,再根据负载均衡配置的规则,将请求分配给不同的服务器(这些服务器提供的服务都是相同的)
    如反向代理中例子

    打快递公司电话xxxxx问我的快递在没在他们那
    选择一个员工C问快递在不在这
    小明 快递公司前台
    快递公司员工C
    快递公司员工D
    快递公司员工F
    快递公司员工G
    只负责发件的快递员工H

    公司有好多员工,可以提供各种不同的服务,C,D,F,G都可以帮忙查询快递有没有在公司,H只负责发件
    客户A来公司发件,小明会将快递交给H,客户B来公司询问快递在不在,那么可以选择CDFG,这样就可以有多个人来处理这种事情,达到加快速度的目的。

    什么时候会用到负载均衡

    业务量增长,单台服务器压力过大,不足以支撑业务,需要多台服务器同时工作分担压力。

    未完待续,不定时更新

    展开全文
  • Nginx主要应用

    2017-06-28 10:38:36
    Nginx服务器应用
     
    

    1. 反向代理


    反向代理应该是Nginx做的最多的一件事了,什么是反向代理呢,以下是百度百科的说法:反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。简单来说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。

    server {  
            listen       80;                                                        
            server_name  localhost;                                              
            client_max_body_size 1024M;
    
            location / {
                proxy_pass http://localhost:8080;
                proxy_set_header Host $host:$server_port;
            }
    }

    保存配置文件后启动Nginx,这样当我们访问localhost的时候,就相当于访问 localhost:8080 了。

    2. 负载均衡

    负载均衡也是Nginx常用的一个功能,负载均衡其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。而Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略。

    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

     upstream test {
            server localhost:8080;
            server localhost:8081;
        }
        server {
            listen       81;                                                        
            server_name  localhost;                                              
            client_max_body_size 1024M;
    
            location / {
                proxy_pass http://test;
                proxy_set_header Host $host:$server_port;
            }
        }

    负载均衡的核心代码为 -

    upstream test {
            server localhost:8080;
            server localhost:8081;
        }

    这里配置了2台服务器,当然实际上是一台,只是端口不一样而已,而8081的服务器是不存在的,也就是说访问不到,但是我们访问 http://localhost 的时候,也不会有问题,会默认跳转到 http://localhost:8080 具体是因为Nginx会自动判断服务器的状态,如果服务器处于不能访问(服务器挂了),就不会跳转到这台服务器,所以也避免了一台服务器挂了影响使用的情况,由于Nginx默认是RR策略,所以我们不需要其他更多的设置。

    2、权重

    指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 例如

        upstream test {
            server localhost:8080 weight=9;
            server localhost:8081 weight=1;
        }
    
     
    Shell

    那么10次一般只会有1次会访问到8081,而有9次会访问到8080 -

    3、ip_hash

    上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用iphash了,iphash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

        upstream test {
            ip_hash;
            server localhost:8080;
            server localhost:8081;
        }

    4、fair(第三方)

    按后端服务器的响应时间来分配请求,响应时间短的优先分配。

     upstream backend {
            fair;
            server localhost:8080;
            server localhost:8081;
        }

    5、url_hash(第三方)

    按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

        upstream backend {
            hash $request_uri;
            hash_method crc32;
            server localhost:8080;
            server localhost:8081;
        }
    
     
    Shell

    以上5种负载均衡各自适用不同情况下使用,所以可以根据实际情况选择使用哪种策略模式,不过fair和url_hash需要安装第三方模块才能使用,由于本文主要介绍Nginx能做的事情,所以Nginx安装第三方模块不会再本文介绍

    3. HTTP服务器

    Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,同时现在也很流行动静分离,就可以通过Nginx来实现,首先看看Nginx做静态资源服务器

        server {
            listen       80;                                                        
            server_name  localhost;                                              
            client_max_body_size 1024M;
    
    
            location / {
                   root   E:/wwwroot;
                   index  index.html;
               }
        }
    
     
    Shell

    这样如果访问 http://localhost 就会默认访问到Ewwwroot目录下面的index.html,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。

    4. 动静分离

    动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路。

    upstream test{  
           server localhost:8080;  
           server localhost:8081;  
        }  
    
        server {  
            listen       80;  
            server_name  localhost;  
    
            location / {  
                root   e:/wwwroot;  
                index  index.html;  
            }  
    
            # 所有静态请求都由nginx处理,存放目录为html  
            location ~ .(gif|jpg|jpeg|png|bmp|swf|css|js)$ {  
                root    e:/wwwroot;  
            }  
    
            # 所有动态请求都转发给tomcat处理  
            location ~ .(jsp|do)$ {  
                proxy_pass  http://test;  
            }  
    
            error_page   500 502 503 504  /50x.html;  
            location = /50x.html {  
                root   e:/wwwroot;  
            }  
        }

    这样我们就可以吧HTML以及图片和css以及js放到wwwroot目录下,而tomcat只负责处理jsp和请求,例如当我们后缀为gif的时候,Nginx默认会从wwwroot获取到当前请求的动态图文件返回,当然这里的静态文件跟Nginx是同一台服务器,我们也可以在另外一台服务器,然后通过反向代理和负载均衡配置过去就好了,只要搞清楚了最基本的流程,很多配置就很简单了,另外localtion后面其实是一个正则表达式,所以非常灵活。

    5. 正向代理

    正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。当你需要把你的服务器作为代理服务器的时候,可以用Nginx来实现正向代理,但是目前Nginx有一个问题,那么就是不支持HTTPS,虽然我百度到过配置HTTPS的正向代理,但是到最后发现还是代理不了,当然可能是我配置的不对,所以也希望有知道正确方法的同志们留言说明一下。

    resolver 114.114.114.114 8.8.8.8;
        server {
    
            resolver_timeout 5s;
    
            listen 81;
    
            access_log  e:/wwwrootproxy.access.log;
            error_log   e:/wwwrootproxy.error.log;
    
            location / {
                proxy_pass http://$host$request_uri;
            }
        }

    resolver是配置正向代理的DNS服务器,listen 是正向代理的端口,配置好了就可以在ie上面或者其他代理插件上面使用服务器ip+端口号进行代理了。

    Nginx是支持热启动的,也就是说当我们修改配置文件后,不用关闭Nginx,就可以实现让配置生效,当然我并不知道多少人知道这个,反正我一开始并不知道,导致经常杀死了Nginx线程再来启动。。。Nginx从新读取配置的命令是 -

    nginx -s reload
    
     
    Shell

    windows下面就是

    nginx.exe -s reload




    
    展开全文
  • Nginx主要应用场景

    2021-01-27 11:40:17
    正向代理以上就是了解到的Nginx在不依赖第三方模块能处理的事情,下面详细说明每种功能怎么做反向代理应该是Nginx做的最多的一件事了,什么是反向代理呢,以下是百度百科的说法:反向代理(ReverseProxy)方式是指以...
  • 1.首先保证k8s的服务已经安装配置完成可参考K8s安装配置教程 ...3.创建deployment文件 vinginx-deployment.yaml 内容如下 apiVersion: extensions/v1beta1 #与k8s集群版本有关,使用 kubectl ...
  • 一、nginx服务简介 Nginx是一个高性能的HTTP和反向代理服务器,也是一个 IMAP/POP3/SMTP代理服务器。Nginx 已经因为它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名了。 使用 Nginx 前必须了解的...
  • nginx的高级应用

    2019-11-01 09:48:16
    1 nginx的高级应用 1.使用alias实现虚拟目录 虚拟目录配置如下图 # nginx -t #验证配置文件是否有错误 # nginx -s reload #配置文件无误后平滑启动nginx vim /etc/nginx/nginx.conf 配置完成后,使用浏览访问...
  • Nginx典型应用场景

    2020-09-02 20:42:40
    nginx服务器映射外网ip,业务服务器无需映射外网ip,外网用户访问时首先访问nginx服务器,然后再由nginx服务器访问业务服务器资源后转发给用户。 二、统一访问 场景需求 若有很多业务系统需要使用同一个ip或者域名...
  • nginx命令行参数 不像许多其他软件系统,Nginx 仅有几个命令行参数,完全通过配置文件来配置 -c 为 Nginx 指定一个配置文件,来代替缺省的。 -t 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确...
  • k8s——部署一个nginx应用

    千次阅读 2019-11-01 11:25:55
    创建nginx-deployment.yaml文件 apiVersion: apps/v1 kind: Deployment metadata: name: nginxdeploy spec: replicas: 1 selector: matchLabels: name: nginxdeploy template: metadata: la...
  • 在linux系统下使用nginx作为web应用服务,用来提升网站访问速度的经验已五年多了,今天在此对nginx的使用做一简单总结。 一、nginx服务简介 Nginx是一个高性能的HTTP和反向代理服务器,也是一个 IMAP/POP3/SMTP代理...
  • Nginx 主要应用场景

    2017-10-16 14:27:11
    前言 本文只针对 Nginx 在不加载第三方模块的情况能处理哪些事情,由于第三方模块太多所以也介绍不完,当然本文本身也可能介绍的不完整,毕竟只是我个人使用过和了解到过得。所以还请见谅,同时欢迎留言交流。  ...
  • 负载均衡-rides和nginx应用

    千次阅读 热门讨论 2016-06-24 16:08:56
    种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器 上,而接收到请求的服务器独立地回应客户的请求。 均衡负载能够平均分配客户请求到服务器列阵,籍此提供快速获取重要数据, 解决大量并发...
  • 前段时间将应用使用nginx部署在服务器上的时候无任何异常。但是,在浏览器中就是访问不到,经过了以下步骤的排查: 一、反复比对ip地址,端口,发现没有任何问题 二、查询nginx进程,发现进程已经启动 三、...
  • Nginx 调优

    万次阅读 2021-07-28 08:27:30
    Nginx 调优
  • 本文只针对Nginx在不加载第三方模块的情况能处理哪些事情,由于第三方模块太多所以也介绍不完,当然本文本身也可能介绍的不完整,毕竟只是我个人使用过和了解到过得。所以还请见谅,同时欢迎留言交流 Nginx能做什么 ...
  • 需求:在 Docker 容器中部署 Nginx,并通过外部机器访问 Nginx 实现步骤 ① 搜索 nginx镜像 ② 拉取 nginx 镜像 ③ 创建容器,设置端口映射、目录映射和创建配置文件 ④ 测试访问 ① 搜索 nginx 镜像 docker ...
  • Server 可以对外服务,但是我们可能不想对外暴露服务器上开放的端口,这时可以利用 Nginx 作为我们的应用服务器,通过配置来映射 host 到我们的 Server 上,通俗点讲就是通过配置的形式使外部访问一个 host 的时候让...
  • 写本文的初衷并非只是讲解下ingress-nginx如何使用,而是对如何接入生产环境发现的一些问题进行总结。 部署 先决条件通用部署命令 # yaml文件 wget ...
  • nginx默认启动80端口,映射的静态目录是/usr/share/nginx/html 如果要为一个nginx增加配置,比如使用 8080 端口监听/usr/...因为在nginx的镜像里 文件 /ect/nginx/nginx.conf有这样一句话 include /etc/nginx/c...
  • 使用uWSGI和Django将NGINXNGINX Plus用作应用程序网关2.1 介绍2.2 关于uWSGI和Django2.3 配置NGINXNGINX Plus以与uWSGI和Django一起使用2.4 结论参考文档 1. 压缩和解压缩     本节介...
  • 该操作员是使用RedHat的Operator-SDK构建的,可以管理在容器平台外部运行的NGINX Plus负载均衡器。 该操作员旨在与NGINX控制器一起使用,以提供以应用程序为中心的部署模型。 NGINX控制器提供了一个启用了RBAC的...
  • Nginx简介和反向代理应用实践 Nginx简介 一、Nginx简介 Nginx(engine x)是一个高性能的Web服务器和反向代理服务器,也可以作为邮件代理服务器。 Nginx是由俄罗斯人Igor Sysoev采用C语言开发编写的,第一个公开...
  • 一、Nginx 介绍 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,621
精华内容 15,848
关键字:

nginx应用外部