Nginx的入门使用

官网:Nginx官网. 建议下载最新版本。
下载后,目录结构如下:
这里写图片描述

在/conf/文件夹下,找到nginx.conf文件,复制一份重命名为nginx-xxx.conf。下面是一个nginx的常用配置

worker_processes  4;

events {
    worker_connections  1024;
}


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

    sendfile        on;

    keepalive_timeout  65;

    upstream tbk_tomcats {
        server 127.0.0.1:9001 weight=1;
    }

    server {
        listen       80;
        server_name  localhost;

        location / {
            proxy_pass http://tbk_tomcats;
        }
    }

    server {
        listen       8001;
        server_name  localhost;

        location / {
            root   D://tbk//images;         
        }
    }   

    server {
        listen       9000;
        server_name  localhost;

        location / {
            proxy_pass http://tbk_tomcats;
        }
    }   
}

启动nginx, 新建一个startup.bat, 代码如:

nginx.exe -c conf/nginx-xxx.conf

关闭nginx, 新建一个stop.bat, 代码如:

nginx.exe -s stop
  1. Nginx解析图片静态资源实现动静分离
    静态资源尽量不要走应用服务器,而直接走web服务器。ngnix可以直接指定目录,执行配置的域名可以跳转到指定目录下的静态资源文件。
    静态资源如图片、css、js、html(静态资源处理时并发非常高).传统项目是把资源一起放到war中,而动静分离是把静态资源从war中剥离出来,单独放到一个目录中。这样当访问静态资源时,就有nginx直接重定向文件资源。当访问动态资源就由tomcat解析。nginx解析静态比tomcat快很多。
    nginx默认配置
location / {
root   html;  #相对路径,配置了一个html目录,我们可以将网站所用到的所有的静态资源从war中移除,放到这个目录下。
index  index.html index.htm;        #配置的欢迎页面
}
 进入conf文件夹,找到nginx.conf文件,为了保留原生配置文件, 我们可以选择拷  贝一份(拷贝的新文件名为:项目名.ngnix.conf),并在上面做我们的修改。下面是一个简单的代理静态资源的配置文件。如果这个时候要访问C://images-upload下的某个静态资源,如image.jpg. 只需要在浏览器中输入`http://image.项目名.com/image.jpg`即可。(如果没有把该域名绑定到DNS中,只是想本机测试模拟,可以配置本地的hosts文件,配置方式会在下面介绍。)
worker_processes  1;

events {
    worker_connections  1024;
}


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

    sendfile        on;

    keepalive_timeout  65;

    server {
        listen       80;
        #要访问的域名
        server_name  image.项目名.com;   
        location / {
            #root表示文件夹目录
            #目录  C://images-upload//images//1.jpg
            #访问  http://image.项目名.com//images//1.jpg
            root   C://images-upload;
        }        
    }
}
  1. 保证开发环境的请求和真实环境的请求地址一致
    可以通过修改本地hosts文件来修改域名映射,模拟在本地访问指定域名。注意不要开代理或者翻墙软件,否则可能造成不能正确转向。
    这里写图片描述

这里写图片描述

每次这样修改hosts文件比较麻烦, 这里推荐一款可视化工具:SwitchHosts
这里写图片描述
改完后,点击右下角的按钮即生效,非常方便。

  1. ngnix实现高负载均衡服务器
    Nginx (“engine x”) 是一个高性能HTTP和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器
    nginx的完整配置文件:
#worker_rlimit_nofile 一个nginx进程打开最多的文件数目,配置和Linux下文件打开个数一直。 ulimit -n来查看,最大可设置为65535
#对应系统哪个用户,最好专为nginx创建用户和组,并单独设置权限,这样安全。 如:user nginx
#events I/O模型, Linux下推荐使用epoll模型
#尽量打开GZIP压缩, gzip_comp_level通畅设置为3~5,太高会占用cpu
#user  nobody; 

#习惯配置成当前服务器的core数相同,或者2倍
worker_processes  1;

#日志,运行期间设置crit,可以减少I/O操作
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    #开启数为实际数量的1/4, 浏览器访问时会自动发起2个;反向代理tomcat又是两个。这个数值和操作系统能打开的文件数。理论上并发数=worker_processes * worker_connections.跟物理内存大小也有关系,因为系统打开的文件数和系统的内存成正比。一般1GB内存也可打开大约10w左右。
    worker_connections  1024;
}


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

    #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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   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   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;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

我们可以用使用bat或shell命令来操作nginx
启动 nginx.exe -c conf/项目名.nginx.conf
停止 nginx.exe -s stop
注意:windows下有时停止会无效,造成开启太多,这时候应该手动在进程管理器中找到nginx的进出并结束。

  1. Linux下部署Nginx
    yum安装

yum install nginx #yum安装nginx,方便它的依赖包自动安装
where is nginx #查看安装后的各目录

启动停止和重启

nginx #直接执行,配置文件/etc/nginx/nginx.conf
nginx -s stop #停止
nginx -s reload #重启

测试

nginx -t #测试nginx是否正常
执行结果
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

查看进程

ps -ef|grep nginx

  1. 正向代理和反向代理
    正向代理:

和日常我们上网不同,在公司我们上网时,不是所有电脑直接访问外网,而是访问一个代理服务器,由代理服务器再访问我们要访问的网站,代理服务器获得访问网站的返回信息后,再返回给我们。这种代理我们的电脑的方式叫做正向代理。

反向代理:

nginx和正向代理有所不同,它实现的也是代理,但是代理的后台服务器,我们访问nginx,而ngnix代理后的服务器,由它去决定具体访问哪台服务器。这种方式和正向代理刚好反过来,所以把这种方式称作反向代理。反向代理它屏蔽了后台具体的服务器,我们访问者根本不知道访问的哪台服务器,这样使访问更加安全。

  1. 请求转发
    当使用下面配置时,用户访问http://localhost:80, nginx将这个请求什么也不做,只负责转发到tomcat的访问地址http://localhost:8080
server {
        listen       80;
        server_name  localhost;

        location / {                                #拦截所有的资源
            proxy_pass   http://127.0.0.1:8080; #转向tomcat的地址
        }

}
  1. Nginx +Tomcat 实现Tomcat集群
    将项目和Tomcat部署到多台主机中(或虚拟机中,如VMWare)
    nginx提供了5种负载均衡策略

    1. 轮询:默认配置。每个请求按时间顺序轮流分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
      配置一个upstream, 声明一个名称 XX_tomcats, 配置多个ip地址转向,默认就是轮询。如:

      upstream状态参数

weight 默认为1. weight越大,负载的权重就越大
max_fails允许请求失败的次数默认为1,当超过最大次数时,返回proxy_next_upstream模块定义的错误
fail_timeout 超时时间
max_fails 多少次失败后,暂停的时间
backup 其他所有的非backup及其down或者忙的时候,请求backup及其。所以这台机器压力会最轻。

upstream XX_tomcats {
    server 127.0.0.1:8080;
    server 127.0.0.1:8090;
    server 127.0.0.1:8100;
}

server {
    listen 80;
    server_name www.xx.com;
    location / {   #拦截所有资源
       proxy_pass http://XX_tomcats  #引用定义的upstream
    }
}

轮询方式存在问题:服务器有性能比较好的,有性能比较差的。新的服务器的配置比旧的服务器强悍很多。cpu核也多,内存也大,硬盘容量也大,速度还快。如果还使用轮询的方式,就会造成新服务器资源的浪费,旧的服务器资源压力大。显然资源分配不合理,应该多劳多得。
 2. 权重:指定轮训几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
 在upstream中加入weight关键字就能够实现权重。
upstream XX_tomcats {
    server 127.0.0.1:8080 weight=8; #访问请求分成9份,这个tomcat负责8份。
    server 127.0.0.1:8090 weight=1; #访问请求分成9成,这个tomcat负责1份。
    server 127.0.0.1:8100 down; #这个tomcat暂时不参加负载均衡
    server 127.0.0.1:8110 backup; #其他非backup机器down或忙时,请求这个。
}

server {
    listen 80;
    server_name www.xx.com;
    location / {   #拦截所有资源
       proxy_pass http://XX_tomcats  #引用定义的upstream
    }
}
 3. IP_HASH : 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,针对解决session共享问题。
upstream XX_tomcats {
    ip_hash;  #ip_hash方式来实现session共享
    server 127.0.0.1:8080 weight=8; #访问请求分成9份,这个tomcat负责8份。
    server 127.0.0.1:8090 weight=1; #访问请求分成9成,这个tomcat负责1份。
    server 127.0.0.1:8100 down; #这个tomcat暂时不参加负载均衡
}

server {
    listen 80;
    server_name www.xx.com;
    location / {   #拦截所有资源
       proxy_pass http://XX_tomcats  #引用定义的upstream
    }
}
 4. URL_HASH(第三方):访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,响应时间短的优先分配。针对解决session共享问题。

解决session共享问题:
访问一个网站时,有两类请求。一种请求叫做无状态的请求,一种请求叫做有状态。
无状态:例如登陆页面,类似这种页面,哪个tomcat给我们的响应都是一样的,不需要区分。这是我们最喜欢的。集群的动态伸缩性(增加节点、移除节点)
有状态,例如系统登陆后,加入用户请求被转发到tomcat1上,这时系统会写一个当前用户的信息放入session中。这种情况就称为有状态的,那么问题来了。nginx负载均衡后,下一次用户的请求就被转发tomcat2上。tomcat2上没有session。系统就会要求用户登陆,这显然是不合理的。这问题称作session共享问题。解决方案:
(1). session同步 : Tomcat支持动态将某个tomcat下的session复制到其他的tomcat中。但是这个方式早期的企业级应用习惯的方式,现在很少使用。这种方式在集群数量很少时,结果还是可以的。但如果集群数量庞大。都需要复制session,这时会因为网络延迟,或者session的内容非常大。都会造成隐患,这时可能读到脏数据。
(2). Session黏着:对ip地址或者域名地址进行hash;或者uri进行hash. 缺点:用户浏览器的ip地址hash以后满足单调性。会可能造成资源的分配不均衡,负载均衡就达不到目的。有的服务器负载均衡过重,有的服务器负载过轻,显然没有充分利用资源。因为uri比ip地址相应数量多,变化就多,因此uri-hash比ip-hash分布更均衡些。uri-hash需要第三方软件支持
(3). 将信息放到cookie - 也就是放在客户端
session存在服务器端,会对服务器产生压力。如果将信息保存到cookie中,减轻了服务器的压力,同时每个客户端的压力也很小。因为只保存自己的信息。这种方式在实际的开发中广泛的采用。但是cookie可以被禁用,cookie要随着浏览器传递,增大了传输的内容,cookie大小也有限制。
(4).单点登录, 比较推荐的做法,将状态如session从系统中独立出来。Apache shiro顶级安全框架,它的session管理就是独立出来的。目前主流做法是利用redis作为session管理的实现,因为redis访问极其快速。

nginx支持故障自动切换。nginx转发请求道tomcat, 如果某个tomcat宕机,tomcat会进行超时判断,如果某个tomcat宕机,访问不了。它会自动的把这个请求转发给其他的tomcat.保证不会因为一个tomcat宕机导致业务无法继续访问。

猜你喜欢

转载自blog.csdn.net/zhangningkid/article/details/73851079