Nginx服务器进阶

1.Nginx 动静态资源分离

1.配置反向代理

1.基本的配置

# 修改配置文件需要重启服务器
user  liujun liu;
worker_processes  1;
events {
    worker_connections  1024;
}

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

    # 1.创建虚拟主机(主机名称为:www.liujun.com)
    server {
        listen       8090;
        server_name  www.liujun.com;

        location / {
            # 2.把所有对 www.liujun.com:8090 的请求转发到 https://www.taobao.com
            proxy_pass  https://www.taobao.com;   
        }
    }
}

这种反向代理可以实现 把 HTTP 转换成更安全的 HTTPS 的方案

2.其它配置

代理其他的服务器

# 修改配置文件需要重启服务器
user  liujun liu;
worker_processes  1;
events {
    worker_connections  1024;
}

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

    # 1.创建虚拟主机(主机名称为:www.liujun.com)
    server {
        listen       8090;
        server_name  www.liujun.com;

        location / {
            # 2.把所有对 www.liujun.com:8090 的请求转发到 https://news-at.zhihu.com
            proxy_pass  https://news-at.zhihu.com;

            # 3.其它配置
            proxy_redirect off;    # off使 location 或者 refresh 字段维持不变
            # 默认情况下反向代理是不会转发请求中的 Host 头部的。如果需要转发,那么必须加上下面的配置
            proxy_set_header   Host             $proxy_host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }
    }
}

浏览器访问:http://www.liujun.com:8090/api/4/news/latest 反向代理后变成请求 https://news-at.zhihu.com/api/4/news/latest,最终获取到结果.

地址栏没有变还是http://www.liujun.com:8090/api/4/news/latest

代理同一台服务器的同一个端口

# 修改配置文件需要重启服务器
user  liujun liu;
worker_processes  1;
events {
    worker_connections  1024;
}

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

    # 1.创建虚拟主机(主机名称为:www.liujun.com)
    server {
        listen       8090;
        server_name  www.liujun.com;

        location / {
            # 2.把所有对 www.liujun.com:8090 的请求转发到 www.new.liujun.com:8090
            proxy_pass  http://www.new.liujun.com:8090;

            # 3.其它配置
            proxy_redirect off;    # off使 location 或者 refresh 字段维持不变
            # 默认情况下反向代理是不会转发请求中的 Host 头部的。如果需要转发,那么必须加上下面的配置
            # 参考文章:https://blog.csdn.net/felix_yujing/article/details/51682655
            proxy_set_header   Host             $proxy_host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }
    }

      # 2.创建第二个虚拟主机(虚拟主机名称为:www.new.liujun.com)
      server {
            listen       8090;
            server_name  www.new.liujun.com;  # 本地测试要在hosts中添加对 www.new.liujun.com 的解析
            location / {
                root  /usr/local/var/www/webapps/new; # (new项目中只有一个index.html)
                index  index.html index.htm;
            }
      }
}

浏览器访问:http://www.liujun.com:8090/ 显示的是new项目的网页

地址栏没有变还是http://www.liujun.com:8090/

2.配置动静态资源的分离

1.动态资源 :api接口 、文件 、压缩包 、软件 、 .jsp 、.php 、.shtml 、.ejs 等等

2.静态资源:html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css

# 修改配置文件需要重启服务器
user  liujun liu;
worker_processes  1;
events {
    worker_connections  1024;
}

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

    # 创建虚拟主机(主机名称为:www.liujun.com)
    server {
        listen       8090;
        server_name  www.liujun.com;

	   # 1.动态资源的加载。
        location / {
            #   把所有对 www.liujun.com:8090 的动态资源的请求转发到 https://news-at.zhihu.com
            proxy_pass  https://news-at.zhihu.com;

            # 其它配置
            proxy_redirect off;
            proxy_set_header   Host             $proxy_host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }

        # 2.静态资源的加载。匹配以.html 、.htm 、.gif、.jpg、.jpeg结尾的请求
        #    ( ~ 表示匹配 URI 时是字母大小写敏感的; ~* 大小写不敏感; \. 是转译.)
        location ~* \.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
             root  /usr/local/var/www/webapps/new;  # (new项目中只有一个index.html)
             # expires定义用户浏览器缓存的时间为3天,如静态页不常更新,可以设更长
             expires  30d;
        }

    }
}

上面两个 location 配置快是并列关系

1)浏览器访问:http://www.liujun.com:8090 反向代理到:https://news-at.zhihu.com 这个网站( 地址栏不变 )

2)浏览器访问:http://www.liujun.com:8090/api/4/news/latest 反向代理到 :https://news-at.zhihu.com/api/4/news/latest 这个api 接口

3)浏览器访问:http://www.liujun.com:8090/index.html 直接获取本地的服务器 /usr/local/var/www/webapps/new; 路径下的静态资源。

2.Nginx 负载均衡

由于 Nginx 具有“强悍”的高并发高负载能力,因此一般会作为前端的服务器直接向客户端提供静态文件服务。但也有一些复杂、多变的业务不适合放到 Nginx 服务器上,这时会用Apache、Tomcat 等服务器来处理。于是Nginx 通常会被配置为既是静态 Web 服务器也是反向代理服务器,不适合 Nginx 处理的请求就会直接转发到上游服务器中处理。而upstream 块定义了一个上游服务器的集群,便于反向代理中的 proxy_pass 使用。

# 修改配置文件需要重启服务器
user  liujun liu;
worker_processes  1;
events {
    worker_connections  1024;
}

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

  	#4.负载均衡配置。负载均衡是指选择一种策略,尽量把请求平均地分布到每一台上游服务器上
    # weight: 设置向这台上游服务器转发的权重,默认为 1;
    # max_fails: 与 fail_timeout 配合使用,在fail_timeout时间内检查max_fails次数,失败则剔除均衡
    # fail_timeout: 表示该时间段内转发失败多少次后就认为上游服务器暂时不可用,用于优化反向代理功能
	upstream backend_api_service{  # backend_api_service 是负载均衡的名称  
      server   www.liujun.com:8888  weight=1 max_fails=2  fail_timeout=30s;
      server   www.liujun.com:9999  weight=1 max_fails=2  fail_timeout=30s;
	}
  
    # 1.创建虚拟主机(主机名称为:www.liujun.com)
    server {
        listen       8090;
        server_name  www.liujun.com;

        location / {
            # 4.把所有对 www.liujun.com:8090 动态资源的请求转发到 http://backend_api_service
            proxy_pass  http://backend_api_service;  # backend_api_service 是负载均衡的名称  
          
            # 5.其它配置
            #  如果后端的服务器返回502,504执行超时等错误,自动将请求转发到upstream负载均衡池
            #  中的另一台服务器,实现故障转移
            proxy_next_upstream http_502 http_504 error timeout invalid_header;
        }
      	
      	location ~* \.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
             root  /usr/local/var/www/webapps/blog;  # (blog项目中只有一个index.html)
             expires  30d;
        }
    }
  
   # 2.创建虚拟主机(主机名称为:www.liujun.com)
   server {
        listen       8888;
        server_name  www.liujun.com;

        location / {							 
            root   /usr/local/var/www/webapps/new; # 2.修改发布项目的目录
            index  index.html index.htm;
        }
    }
  
   # 3.创建虚拟主机(主机名称为:www.liujun.com)
   server {
        listen       9999;
        server_name  www.liujun.com;

        location / {							 
            root   /usr/local/var/www/webapps/music; # 2.修改发布项目的目录
            index  index.html index.htm;
        }
    }
  
  
}

1)浏览器访问:http://www.liujun.com:8090/index.html 访问的blog项目

2)浏览器访问:http://www.liujun.com:8090 访问的是new 项目 或者 是music项目

真实环境中负载均衡backend_api_service里面配的都是同一个项目发布在不同的服务器上

3.Nginx 的性能优化

1.全局的配置的优化

user  liujun liu;

# 1.Nginx worker 进程个数 (启动进程数,通常和cpu的数量相等)
worker_processes  8;

# 2.绑定 Nginx worker 进程到指定的 CPU 内核。( 为每个进程分配cpu,上例将8个进程分配到8个cpu,
#   当然可以写多个,或者将一个进程分配到多个cpu )
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

#3.*指定 Nginx worker 进程可以打开的最大句柄描述符个数。( 指当一个nginx进程打开的最多文件描述数目,
#  理论应该是最多打开文件数 ulimit -n 与 nginx进程数相除,但是nginx分配请求并不是那么均匀,
#  所以最好以ulimit -n的值保持一致 )
worker_rlimit_nofile 102400;

# 4.全局error 日志的设置(语法:error_log /path/file level;)
#   错误等级level[ debug | info | notice | warn | error | crit ]

# error_log  logs/error.log;  # 这种写法nginx启动失败,要编写全路径,并且该文件要存在(如下写法)
error_log  /usr/local/etc/nginx/logs/error.log error;
error_log  /usr/local/etc/nginx/logs/error.log  info;

# 5.pid 文件的路径( 保存 master 进程 ID 的 pid 文件存放路径,例如:/usr/local/nginx/nginx.pid )
pid        /usr/local/etc/nginx/logs/nginx.pid;  # 要编写全路径,并且该文件要存在


events {
    worker_connections  1024;
}

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


    server {
        listen       8090;
        server_name  localhost;
        location / {
            root   /usr/local/var/www/webapps/blog; # 2.修改发布项目的目录
            index  index.html index.htm;
        }
    }
}

2.event 配置块的优化

user  liujun liu;

worker_processes  1;

events {
    # 1.选择事件模型(epoll是多路复用io中的一种方式,但是 仅用linux2.0 以上的内核。
    #   可以处理大并发连接,大大提高nginx的性能)
    # use epoll;

    # 2.每个 worker 的最大连接数( 单个后台worker process进程的最大并发链接数:最大连接=连接数*进程数 )
    worker_connections  102400;

    # 3.批量建立新连接 (尽可能多的接受请求)
    multi_accept on;

}

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


    server {
        listen       8090;
        server_name  localhost;
        location / {
            root   /usr/local/var/www/webapps/blog; # 2.修改发布项目的目录
            index  index.html index.htm;
        }
    }
}

3.http配置块的优化(一)

user  liujun liu;

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    # 1.设定mime类型,类型由/usr/local/etc/nginx/mime.types文件定义
    include       mime.types;

    # 2.当找不到相应的 MIME type 与文件扩展名之间的映射时,
    #   使用默认的 MIME type 作为HTTP header 中的 Content-Type
    #  ( 默认的数据流:octet-stream是下载数据流)
    default_type  application/octet-stream;

    # 3.keepalive 超时时间( 默认 keepalive_timeout 75; 秒 )
    # 客户端到服务器端的连接持续有效时间。当出现对服务器请求之后,继续请求,它可避免建立或者重新建立连接,提高性能
    keepalive_timeout  65;

    # 4.定义日志格式。可以使用负载均衡功能提供的变量( 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"';

    # 5.将负载均衡时的一些信息记录到 access_log 日志中(配置http访问日志的保存路径)
    access_log  /usr/local/etc/nginx/logs/access.log  main;  # 注意:access.log文件要存在


    server {
        listen       9090;
        server_name  localhost;
        location / {
            root   /usr/local/var/www/webapps/blog; # 2.修改发布项目的目录
            index  index.html index.htm;
        }
    }
}

4.http配置块的优化(二)

http://nginx.org/en/docs/http/ngx_http_core_module.html

user  liujun liu;

worker_processes  1;

events {
    worker_connections  1024;
}

http {

    include       mime.types;
    default_type  application/octet-stream;
    keepalive_timeout  65;

    # 1.指定nginx是否调用sendfile函数(zero copy方式)来输出文件,对于普通的应用必须为on
    #    如果用来进行下载等应用磁盘IO负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的uptime
    sendfile       on;

    # 2.在打开 sendfile 选项时,确定是否开启 FreeBSD 系统上的 TCP_NOPUSH 或 Linux 系统上
    #   的 TCP_CORK 功能。打开 tcp_nopush 后,将会在发送响应时把整个响应包头放到一个 TCP 包中发送
    #   ( 防止网络阻塞 )
    tcp_nopush    on;

	# 3.开始目录列表访问,适合下载服务器(例如:镜像下载网站),默认关闭
	autoindex on;

	# 4.提高数据的实时响应性
	tcp_nodelay  on;


	# 5.打开文件缓存( 这个将为打开文件制定缓存,默认是没有启用的,max制定缓存数量,建议和打开文件数一致
	#   , inactive 是指经过多长时间文件没有被请求后删除缓存。)
	open_file_cache max=102400 inactive=20s;

	# 6.检验缓存中元素有效性的频率, 默认60s( 这个是指定多长时间检查一次缓存有效信息 )
	open_file_cache_valid 30s;

	# 7.不被淘汰的最小访问次数( open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果
    #   超过这个数字,文件描述符一直是在缓存中打开的)
	open_file_cache_min_uses 1;


    server {
        listen       9090;
        server_name  localhost;
        location / {
            root   /usr/local/var/www/webapps/blog; # 2.修改发布项目的目录
            index  index.html index.htm;
        }
    }

}

5.http配置块的优化(三)

http://nginx.org/en/docs/http/ngx_http_gzip_module.html

user  liujun liu;

worker_processes  1;

events {
    worker_connections  1024;
}

http {

    include       mime.types;
    default_type  application/octet-stream;
    keepalive_timeout  65;

	# 1.启动gzip压缩( 可以对css , js, image静态资源压缩)
    gzip  on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.1;

    # 2.压缩级别大小,最大为9,最小为1,压缩后比例越小越好,cpu处理更快(例如下面:100k-> 80k)
    #   设值的值越大,消耗cpu比较高(例如设置 9 :100k-> 10k )
    gzip_comp_level 2;

    server {
        listen       9090;
        server_name  localhost;
        location / {
            root   /usr/local/var/www/webapps/new; # 2.修改发布项目的目录
            index  index.html index.htm;
        }
    }

}

6.http配置块的优化(四)

http://nginx.org/en/docs/http/ngx_http_core_module.html

user  liujun liu;

worker_processes  1;

events {
    worker_connections  1024;
}

http {

    include       mime.types;
    default_type  application/octet-stream;
    keepalive_timeout  65;

	# 1.HTTP 请求包体的最大值。允许客户端请求的最大单个文件字节数(php后端用的多)
	client_max_body_size 10m;

	# 2.存储 HTTP 包体的内存 buffer 大小( 缓存区代理缓冲用户端请求的最大字节数 )
	client_body_buffer_size 128k;

	# 3.存储超大 HTTP 头部的内存 buffer 大小(设定请求缓冲)
	large_client_header_buffers 4 4k;

	# 4.存储 HTTP 头部的内存 buffer 大小
	# 客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k
	# 不过由于一般系统分页都要大于1k, 所以这里设置分页大小为4k
	client_header_buffer_size 4k;

    server {
        listen       9090;
        server_name  localhost;
        location / {
            root   /usr/local/var/www/webapps/new; # 2.修改发布项目的目录
            index  index.html index.htm;
        }
    }

}

7.http配置块的优化(五)

http://nginx.org/en/docs/http/ngx_http_proxy_module.html

user  liujun liu;

worker_processes  1;

events {
    worker_connections  1024;
}

http {

    include       mime.types;
    default_type  application/octet-stream;
    keepalive_timeout  65;

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

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

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

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

	# 5.proxy_buffers 缓冲区,网页平均在32k一下的话,着用设置
	proxy_buffers 4 32k;

	# 6.高负荷下缓冲大小( 一般等于=proxy_buffer *  2 )
	proxy_busy_buffers_size 64k;

    server {
        listen       9090;
        server_name  localhost;
        location / {
            root   /usr/local/var/www/webapps/new; # 2.修改发布项目的目录
            index  index.html index.htm;
        }
    }

}

7.server配置块的优化

http://nginx.org/en/docs/http/ngx_http_core_module.html

user  liujun liu;

worker_processes  1;

events {
    worker_connections  1024;
}

http {

    include       mime.types;
    default_type  application/octet-stream;
    keepalive_timeout  65;

    server {

        listen       9090;
        server_name  localhost;

        # 1.使用的字符集
        #charset koi8-r;

        location / {
            root   /usr/local/var/www/webapps/new; # 2.修改发布项目的目录
            index  index.html index.htm;
        }

        # 2.错误码404跳转的页面
        error_page  404          /404.html;

        # 3.定义错误提示页面(错误码404跳转的页面)
        error_page   500 502 503 504  /50x.html;

        location = /50x.html {
             # 5.只有当用户请求是 /50x.html 时,才会使用该 location 下的配置
             root   html;
        }

        # 6.设定查看Nginx状态的地址:http://localhost:9090/NginxStatus
        location /NginxStatus {
            stub_status on;
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值