欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Nginx服务器进阶

程序员文章站 2022-03-04 12:56:39
...

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;
        }
    }

}
相关标签: Nginx