一文搞定Nginx实战运用

Nginx实战

什么是Nginx

Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供IMAP/POP3/SMTP服务。

它的主要功能是反向代理,通过反向代理可以实现集群,负载均衡和路由。同时它支持静态资源虚拟化,即它可以将静态资源虚拟化为一个个服务,随后就可以通过URL去访问这些资源了。

正向代理

我们访问某个网站,不是直接访问,需要经过电信的正向代理,它判断你是否可以访问这个网站。

反向代理

用户请求目标服务器,由代理服务器决定访问哪个IP,比如ping www.taobao.com,ping的IP地址是变化的。

Nginx安装与常用指令

https://nginx.org/

  1. 安装gcc环境

    yum install gcc-c++

  2. 安装PCRE库,用于解析正则表达式

    yum install -y pcre pcre-devel

  3. zlib压缩、解压缩依赖

    yum install -y zlib zlib-devel

  4. SSL安全的加密的套接字协议层,用于HTTP安全传输,即HTTPS

    yum install -y openssl openssl-devel

  5. 解压Nginx.tar包

  6. 创建Nginx临时目录

    mkdir -p /var/temp/nginx

  7. 使用Nginx目录中的configure命令进行配置

    ./configure \
    --prefix=/usr/local/nginx \
    --pid-path=/var/run/nginx/nginx.pid \
    --lock-path=/var/lock/nginx.lock \
    --error-log-path=/var/log/nginx/error.log \
    --http-log-path=/var/log/nginx/access.log \
    --with-http_gzip_static_module \
    --http-client-body-temp-path=/var/temp/nginx/client \
    --http-proxy-temp-path=/var/temp/nginx/proxy \
    --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
    --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
    --http-scgi-temp-path=/var/temp/nginx/scgi 
    

    执行完后,在Nginx目录中会有一个Makefile脚本文件。

  8. make编译

    make

  9. 安装

    make install

  10. 找到Nginx安装的位置

    whereis nginx

  11. 进入sbin目录启动Nginx

    ./nginx

    • 强制停止 ./nginx -s stop,不管连接是否结束,都强制关闭Nginx
    • 安全停止 ./nginx -s quit,等连接结束之后在关闭Nginx
    • 重新启动 ./nginx -s reload
    • 打印Nginx信息 ./nginx -v(简略信息),./nginx -V(详细信息)
    • 帮助提示Nginx ./nginx -h./nginx -?
  12. 访问虚拟机内网IP或服务器的公网IP,即可访问Nginx

解释与说明

之所以访问内网IP可以访问到Nginx,是因为config目录下的Nginx.conf文件中的配置,以及html目录下事先存在的index.html文件。

nginx.conf文件内容:

worker_processes  1; // worker进程数量

events {
    
    
    use epoll; // 这一行自己加的,其实不用加,linux中默认使用epoll策略处理用户连接
    worker_connections  1024; // 一个worker进程最多可以处理多少个连接
    // 如果worker_connections配置过高,则单个worker进程将有可能负责过多的用户连接,造成用户卡顿
    // 通常[1024*2 - 1024*5]是没问题的
}

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

    sendfile        on;

    keepalive_timeout  65;

    // http://localhost:80这个套接字被该server所监听
    server {
    
    
        listen       80; // Nginx默认监听端口是80
        server_name  localhost;

		// 该套接字下的映射路由
        location / {
    
    
            root   html; // 映射根目录
            index  index.html index.htm; // 默认映射资源
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
    
    
            root   html;
        }
    }
}

Nginx修改静态资源不需要重启,但是修改conf配置文件需要重启。

Nginx的进程模型

Nginx启动之后会有两种进程,分别是master进程和worker进程。

[root@localhost sbin]# ps -ef | grep nginx
root      11888      1  0 04:02 ?        00:00:00 nginx: master process ./nginx
nobody    15790  11888  0 04:17 ?        00:00:00 nginx: worker process
root      15792   7733  0 04:17 pts/0    00:00:00 grep --color=auto nginx

默认配置下,master与worker进程都只有一个,但是我们可以通过worker_processes配置worker进程数。

worker_processes  2;

我将worker进程数修改为2,然后./nginx -t验证一下,没问题则重启Nginx./nginx -s reload

[root@localhost conf]# ../sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

[root@localhost conf]# ../sbin/nginx -s reload

[root@localhost conf]# ps -ef | grep nginx
root      11888      1  0 04:02 ?        00:00:00 nginx: master process ./nginx
nobody    15892  11888  0 04:24 ?        00:00:00 nginx: worker process
nobody    15893  11888  0 04:24 ?        00:00:00 nginx: worker process
root      15895   7733  0 04:24 pts/0    00:00:00 grep --color=auto nginx

我们的操作指令,比如./nginx./nginx -s reload./nginx -t等等,都是由master进程接收,但并非由master进程执行。而是master进程接收到这些指令之后,逐个发送给所有的worker进程,由它们去执行。

每一个worker进程,可以有很多连接,处理多个用户请求。

在这里插入图片描述

nginx.conf配置结构详解

user  nobody; # worker进程由什么用户去执行,默认是nobody用户,nobody是linux下默认提供的一个权限很小的用户
worker_processes  1; # worker进程数量

# Nginx日志级别,由低到高:debug info notice warn error crit
#error_log  logs/error.log; # 默认级别是crit
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info; 

events {
    
    
    use epoll; # 这一行自己加的,其实不用加,linux中默认使用epoll策略处理用户连接
    worker_connections  1024; # 一个worker进程最多可以处理多少个连接
    # 如果worker_connections配置过高,则单个worker进程将有可能负责过多的用户连接,造成用户卡顿
    # 通常[1024*2 - 1024*5]是没问题的
}

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

    sendfile        on;

    keepalive_timeout  65;

    # http://localhost:80这个套接字被该server所监听
    server {
    
    
        listen       80; # Nginx默认监听端口是80
        server_name  localhost;

		# 该套接字下的映射路由
        location / {
    
    
            root   html; # 映射根目录
            index  index.html index.htm; # 默认映射资源
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
    
    
            root   html;
        }
    }
}
  • main:最外层称之为main,进行全局配置,也将main称之为容器。

  • event:配置Nginx的工作模式以及连接数,它也被称之为指令块。

  • http:http模块相关的配置,它可以用来导入其他的文件,包括mine.types文件、*.conf文件等等,同时它还包含很多其他的配置。

    http {
          
          
    	##
    	# Basic Settings
    	##
    	
    	sendfile on; #开启高效文件传输模式,on异步,off同步,如果图片显示不正常把这个改成off,如果是以下载为主的应用,可以设置为同步。
    	
    	tcp_nopush on; # 开启优化tcp传输,仅在sendFile开启时生效。
    	tcp_nodelay on; # tcp不延迟发送,即关闭tcp协议nagle算法、关闭tcp发送缓存,对于数据实时性高的应用开启,对于吞吐量高的应用关闭。
    	
    	keepalive_timeout 65; # TCP连接最长保持时间,单位s。
    	types_hash_max_size 2048; # types_hash_max_size越大,就会消耗更多的内存,但散列key的冲突率会降低,检索速度就更快。types_hash_max_size越小,消耗的内存就越小,但散列key的冲突率可能上升。
    	
    	# server_tokens off; 错误页面的标签上是否表示Nginx的版本。
    	# server_names_hash_bucket_size 64;
    	# server_name_in_redirect off; 重定向时是否将服务器名写入head。
    	
    	include /usr/local/nginx/conf/mime.types;
    	default_type application/octet-stream; # 指定mime.types文件中没有记述到的后缀名的处理方法。
    	
    	##
    	# SSL Settings
    	##
    
    	#ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    	#ssl_prefer_server_ciphers on;
    	
    	##
    	# Logging Settings
    	##
    
    	access_log /var/log/nginx/access.log; # 连接日志
    	error_log /var/log/nginx/error.log; # 错误日志
    	
    	##
    	# Gzip Settings
    	##
    
    	gzip on; # 开启压缩传输,降低网络IO,但是提高CPU占用。
    	gzip_disable "MSIE [1-6]\."; # IE6及以下禁用压缩
    	gzip_vary on; # 给CDN和代理服务器使用,针对相同url,可以根据头信息返回压缩和非压缩副本
    	gzip_proxied any; 
    	gzip_comp_level 6; # 压缩级别
    	gzip_buffers 16 8k; # 压缩时缓存的大小,如果不设置,默认是申请跟原始数据相同大小的内存空间去存储gzip压缩结果,这里的缓存大小是16 * 8k。
    	gzip_http_version 1.1; # http1.1以上支持压缩
    	gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # 对这些类型的资源进行压缩
    	gzip_min_length 2k # 超过2k的资源才进行压缩,建议设置为2k,小于2k浪费CPU,并且还可能越压越大。
    	
    	##
    	# Virtual Host Configs
    	##
    
    	include /usr/local/nginx/conf/conf.d/*.conf; # 这个文件只配置virtual host 虚拟主机
    	#include /etc/nginx/sites-enabled/*;
    }
    
    • upstream:用于配置集群即内网服务器,负载均衡的规则由它指定。

      upstream imApiServer {
              
              
          server 127.0.0.1:8050       weight=1 down;
          server 127.0.0.1:8060       weight=1;
          server 127.0.0.1:8060      	weight=1 backup;
          # down:表示当前的server暂时不参与负载。
          # weight:默认为1,weight越大,负载的权重就越大。 
          # backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。
      }
      
    • server:虚拟主机,虚拟主机用于监听指定套接字下的请求,Nginx可以配置很多个虚拟主机(server),并且每个虚拟主机(server)通过server_name指定监听多个域名。

      server {
              
              
        listen 80;
        server_name doc.myworldelite.com www.doc.myworldelite.com; # 他这里是在hosts文件中映射过了
        
        location / {
              
              }
      }
      
      • location:路有映射,它负责对其虚拟主机接收到的请求做出映射,每个虚拟主机(server)只能有一个路由映射(location)。

        # 对当前路径及子路径下的所有资源生效
        location /imooc {
                  
                  
             root /apps/worldelite/api-docs; # 根目录, 并且imooc会拼接到这后面形成真正的根目录
             alias /home/imooc; # 别名,可以隐藏'location /'的后面的imooc,改为'location /static'
             index index.html # 默认页,可以配置多个
             # try_files $uri $uri/ /index.html; # $uri 是Nginx内部提供的一些参数变量,$uri可以获取请求的路由
             # 添加response header的属性
             add_header Access-Control-Allow-Origin *; # 允许所有域名的脚本访问该资源
             add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
             add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
        }
        

Nginx日志处理

手动切割日志文件

/usr/local/nginx/sbin目录下创建cut_log.sh脚本文件,复制如下内容粘贴:

#!/bin/bash
LOG_PATH="/var/log/nginx/"
RECORD_TIME=$(date -d "yesterday" +%Y-%m-%d+%H:%M)
PID=/var/run/nginx/nginx.pid
mv ${LOG_PATH}/access.log ${LOG_PATH}/access.${RECORD_TIME}.log
mv ${LOG_PATH}/error.log ${LOG_PATH}/error.${RECORD_TIME}.log

#向Nginx主进程发送信号,用于重新打开日志文件
kill -USR1 `cat $PID`

以后每次执行cut_log.sh文件就会对Nginx原有的access.logerror.log文件以时间为单位进行切割。

自动切割日志文件

在生产环境建议每天执行一次cut_log.sh脚本。

  • 安装linux定时任务插件

    yum install crontabs

  • crontab -e编辑并添加一行新的任务,这里为了测试,指定的是每分钟执行一次。

    */1 * * * * /usr/local/nginx/sbin/cut_log.sh

  • 重启定时任务

    service crond restart

  • 常用定时任务指令

    service crond start  			# 启动
    service crond stop   			# 停止
    service crond restart  			# 重启
    service crond reload  			# 重新载入配置
    crontab -e 						# 编辑定时任务
    crontab -l  					# 打印已有定时任务列表
    

crontab表达式

* * * * * 							
# 分别代表分、时、日、月、星期
# 范围分别是:
# 0-59 0-23 1-31 1-12 1-7
  • 每分钟执行

    */1 * * * *
    
  • 每天凌晨晚上23:59执行

    59 23 * * *
    
  • 每天凌晨1:00执行

    0 1 * * *
    

location匹配规则

# 对当前路径及子路径下的所有资源匹配
location / {
    
       
    root html;
}

# 对当前路径匹配,子路径下的资源无法匹配,此时访问的是localhost:xx/imooc/img/static/face1.png
location = /imooc/img/face1.png {
    
       
    root static;
}

# 正则表达式匹配, *代表不区分大小写
# 由于这里没有指定开头和结尾,所以只要是访问的资源包含.GIF\.PNG\.BMP\.JPG\.JPEG这些的就可以正确匹配
# \. 是为了转义
location ~* \.(GIF|PNG|BMP|JPG|JPEG) {
    
       
    root static;
}

# 正则表达式匹配, 区分大小写
location ~ \.(GIF|PNG|BMP|JPG|JPEG) {
    
       
    root static;
}

# 正则表达式匹配,^表示以什么开头,~表示匹配到该字符串后停止以正则表达式进行匹配
# localhost:xx/imooc/face1.png   		是可以访问到的
# localhost:xx/imooc/sub/face2.png   	也是可以访问到的
location ^~ /imooc/ {
    
    
    root static;
}

使用switchhosts工具修改域名ip映射

https://github.com/oldj/SwitchHosts

这是一个用于快速切换 hosts 文件的小程序,提供linux、window、mac系统。

Nginx解决跨域问题

跨域,CORS(Cross-Origin Resource Sharing),即跨域资源共享。

它允许浏览器向跨域名(Origin)的服务器发起ajax请求获取响应,一般而言实现跨域可以通过Jsoup、SpringBoot Cors和Nginx。

# 在Nginx中添加跨域支持
server {
    
    
	listen 80;
	server_name admin.test.myworldelite.com;
	
	# 允许跨域请求的域,*代表所有
    add_header 'Access-Control-Allow-Origin' *;
    # 允许带上cookie请求
    add_header 'Access-Control-Allow-Credentials' 'true';
    # 允许请求的方法,比如 GET/POST/PUT/DELETE
    add_header 'Access-Control-Allow-Methods' *;
    # 允许请求的header
    add_header 'Access-Control-Allow-Headers' *;
    
    location / {
    
    }
}

Nginx配置静态资源防盗链

如果服务器不配置防盗链,则任何其他站点都可以通过你资源的url盗用你的静态资源。

# Nginx防盗链配置

server {
    
    
	# 对源站点验证
    valid_referers *.imooc.com; 
    # 非法引入会进入下方判断
    # $invalid_referer是Nginx的内部变量,如果源站点验证未通过,则会进入return 404
    if ($invalid_referer) {
    
    
        return 404;
    } 
}

Nginx构建集群

构建tomcat集群

# nginx服务器ip是192.168.1.172
# 三台tomcat服务器的ip分别是:
# 						192.168.1.173
# 						192.168.1.174
# 						192.168.1.175

# 配置上游服务器
# 如果upstream中只有一台服务器,则Nginx相当于只起到一个反向代理屏蔽端口号的功能
upstream study {
    
    
	server 192.168.1.173:8080;
	server 192.168.1.174:8080;
	server 192.168.1.175:8080;
}

# 配置虚拟主机
server {
    
    
	listen 80;
	server_name localhost; # 虚拟主机的名字,无关紧要
	
	location / {
    
    
		# 指定的proxy_pass必须与upstream指定的字符串一致
		# Nginx拦截到的请求将会通过proxy_pass转发给对应的upstream
		proxy_pass http://tomcats;
	}
}

使用Jmeter测试集群性能

https://jmeter.apache.org/

Apache JMeter™应用程序是开源软件,是一个100%纯Java应用程序,设计用于加载测试功能行为和度量性能。它主要是为测试Web应用程序而设计的。

  • 解压缩后打开JMeter.bat文件(win)
  • 新建一个项目,命名为单tomcat节点测试
  • 在该项目下创建一个线程组(Thread Group),策略为50个线程,循环100次,即5000次请求,这个线程数可以理解为用户数
  • 在该线程组下创建一个取样器(sampler),创建http取样器并填入待测试Tomcat的ip地址和http端口号
  • 为了观测结果,在项目下创建一个监听器(listener),选择聚合报告(Aggregate Report),并再次添加监听器,查看结果树(View Result Tree)、以表格展示结果(View Result in Table)
  • 点击运行,开始测试。

单节点测试结果——50线程,单线程100请求

Label 样本 平均值 中位数 90% 95% 99% 最小值 最大值 异常% 吞吐量 接收KB/sec 发送KB/sec
直接访问tomcat 5000 15 14 28 32 48 1 75 0.0 2206.5 536.5 267.1
TOTAL 5000 15 14 28 32 48 1 75 0.0 2206.5 536.5 267.19715357458074
  • 样本:请求次数
  • 平均值:请求平均响应时间,单位是毫秒
  • 中位数:50%的请求的平均响应时间是14毫秒,而剩余50%的请求响应时间会大于14毫秒;后面同理,90%的请求平均响应时间是28毫秒,剩余的10%的请求响应时间会大于28毫秒。
  • 最小值/最大值:请求与响应的最小耗时时间与最大耗时时间。
  • **异常:**异常的比例。
  • 吞吐量:主要与网络带宽相关。

单节点测试结果——200线程,单线程100请求

Label 样本 平均值 中位数 90% 95% 99% 最小值 最大值 异常% 吞吐量 接收KB/sec 发送KB/sec
直接访问tomcat 20000 48 23 79 194 340 1 3006 18.50% 2468.8 1618.4 243.6
TOTAL 20000 48 23 79 194 340 1 3006 18.50% 2468.8 1618.4 243.6

集群节点测试结果——200线程,单线程100请求

新建一个测试项目,直接请求Nginx地址

Label 样本 平均值 中位数 90% 95% 99% 最小值 最大值 异常% 吞吐量 接收KB/sec 发送KB/sec
直接访问Nginx 20000 68 48 106 149 856 1 1202 0.0 2552.6 615.6 296.6
TOTAL 20000 68 48 106 149 856 1 1202 0.0 2552.6 615.6 296.6

一般而言异常率不超过20%即可,暂时不需要扩容集群。

负载均衡策略

Nginx默认使用轮询策略。

加权轮询

upstream study {
    
    
    server 192.168.95.131:8080 weight=1; 		# tomcat1
    server 192.168.95.5:8080 weight=2; 			# tomcat2
    server 192.168.95.6:8080 weight=2;			# tomcat3
}

此时的轮询情况是:tomcat1 -> tomcat2 -> tomcat3 -> tomcat2 -> tomcat3

ip_hash

它的特点是保证用户访问可以通过请求到上游服务器中的固定的服务器,前提是用户ip没有发生更改。

注意:如果使用ip_hash,则不能将后台服务器直接移除,只能使用down。

# Simple Example
upstream study {
    
    
	ip_hash;
	
	server 192.168.95.131:8080; 			# tomcat1
    server 192.168.95.5:8080 down; 			# tomcat2
    server 192.168.95.6:8080;				# tomcat3
}

upstream指令参数

  • max_conns:

    限制最大连接数,它的默认值是0,即不做任何限制。注:该参数在1.11.5版本之前只对Nginx的商业版开放。

    # Simple Example
    upstream study {
          
          
    	server 192.168.95.5:8080 max_conns=2;
    }
    
  • slow_start:

    让它指定的服务器慢启动,有些场景个别服务器可能不希望一开始就有用户流量打进来,可以配置slow_start注:该参数仅对商业版开放。

    # Simple Example
    upstream study {
          
          
    	# slow_start 会将该主机的权重从0逐渐升级到10
    	# slow_start 仅支持轮询带weight的负载均衡,不支持hash、random负载均衡
    	# slow_start 不支持非集群环境下的主机
    	server 192.168.95.5:8080 weight=10 slow_start=60s;
    	server 192.168.95.6:8080 weight=2;
    }
    
  • down:

    它指定的服务器不参与负载均衡。

    # Simple Example
    upstream study {
          
          
    	# 该主机将不参与负载均衡
    	server 192.168.95.5:8080 down;
    	server 192.168.95.6:8080;
    }
    
  • backup:

    它指定的服务器会成为备用机,正常情况下不会参与负载均衡,只有当其他服务器宕机之后,它才会参与。

    # Simple Example
    upstream study {
          
          
    	# 该主机将不参与负载均衡
    	server 192.168.95.5:8080 backup;
    	server 192.168.95.6:8080 weight=1;
    }
    
  • max_fails / fail_timeout:

    max_fails指定服务器的最大失败次数,如果该服务器处理请求的失败次数达到了指定的阈值,则Nginx会将其剔出集群。

    fail_timeout指定max_fails生效的时间范围与主机剔出集群后重新加入集群的时间,二者结合使用。

    # Simple Example
    upstream study {
          
          
    	# 该主机如果在30s内,处理请求错误的次数达到了20次,则将该主机剔出集群30s,30s后重新加入集群
    	server 192.168.95.5:8080 weight=1 max_fails=20 fail_timeout=30s;
    	server 192.168.95.6:8080 weight=1;
    }
    

Keepalive提高吞吐量

它可以将一部分数量的连接设置为长连接。

# Simple Example
upstream study {
	server 192.168.95.130:8080;
	server 192.168.95.5:8080;
	server 192.168.95.6:8080;
	
	# 保持长连接的数量
	keepalive 32;
}

server {
	...
	
	location / {
		proxy_pass http://study;
		proxy_http_version 1.1; # http1.1支持长连接
		proxy_set_header Connection ""; # 将头信息中的connection清空
	}
}

keepalive吞吐量测试

线程数50、请求次数50。

未开启keepalive情况下,吞吐量为:2164

开启keepalive情况下,吞吐量为:2356

Nginx缓存

两部分缓存

在这里插入图片描述

Nginx到浏览器之间会有一层缓存,浏览器的缓存是面向单用户的。

而上有服务器到Nginx之间也会有一层缓存,因为Nginx将请求反向代理到内网中其他的服务器去请求资源,这个也是有网络传输的,如果这个静态资源可以在Nginx中缓存,则可以节约时间。

设置浏览器缓存

expires [time]

# Simple Example
server {
    
    
	...
	
	# 在/opt/static目录下有一个cache.html文件
	location /static {
    
    
		root /opt;
		# 缓存10s
		expires 10s;
	}
}

设置完成后请求cache.html的响应头:

HTTP/1.1 200 OK
Server: nginx/1.16.1
# 服务器中的文件最后修改的时间
# 如果文件修改了,则会自动重新请求,不经过缓存
Last-Modified: Wed, 24 Mar 2021 14:32:07 GMT
Date: Wed, 24 Mar 2021 14:37:16 GMT 					# 响应时间
Expires: Wed, 24 Mar 2021 14:37:26 GMT 					# 缓存过期时间
Cache-Control: max-age=10								# 缓存最大时间(s)
Content-Type: text/html
Content-Length: 11
ETag: "605b4d67-b"
Accept-Ranges: bytes

expires @[time]

# Simple Example
server {
    
    
	...
	
	# 在/opt/static目录下有一个cache.html文件
	location /static {
    
    
		root /opt;
		# 缓存到今天晚上10点50分
		expires @22h50m;
	}
}

设置完成后请求cache.html的响应头:

HTTP/1.1 200 OK
Server: nginx/1.16.1
Last-Modified: Wed, 24 Mar 2021 14:42:01 GMT
Date: Wed, 24 Mar 2021 14:45:44 GMT
Expires: Wed, 24 Mar 2021 14:50:00 GMT 					# 缓存过期时间
Cache-Control: max-age=256								# 缓存最大时间(s)
Content-Type: text/html
Content-Length: 22
ETag: "605b4fb9-16"
Accept-Ranges: bytes

设置反向代理缓存

http {
    
    
	...
	
	# 设置缓存保存路径,如果该路径不存在会自动创建
	# keys_zone指定了一个共享空间,初始大小是5m
	# max_size指定了共享空间的最大大小,由服务器硬盘空间决定
	# inactive指定了缓存的保存时长,超时后会将共享空间中的缓存数据情况
	# use_temp_path是否使用临时目录,开启可能会对Nginx性能产生影响
	proxy_cache_path /usr/local/nginx/cache keys_zone=nginxCache:5m max_size=1g inactive=8h use_temp_path=off;

    server {
    
    
    	...
    	
    	# 该虚拟主机开启使用缓存
    	proxy_cache nginxCache;
    	# 对200和304状态码的缓存设置过期时间
    	proxy_cache_valid 200 304 16h;
    	
    	location / {
    
    }
    }
}

Nginx配置SSL提供Https访问

如果不配置SSL,则无法通过https访问网站。

以腾讯云为例:

  • 首先需要有一个域名,https协议是需要域名的,并且该域名需要备案。

  • 进入SSL证书,选择申请免费证书,免费证书只能对一级域名提供SSL服务?。

  • 申请证书并通过后将其下载到本地并解压,其中包含ApachellsNginxTomcat,不同的服务器配置是不一样的。

  • Nginx目录中包含.crt文件和.key文件,将这两个文件上传到云服务器中Nginx的conf目录中(方便一点)。

  • 安装SSL模块:

    • 要在Nginx中配置https,就必须安装ssl模块——http_ssl_module

    • 通过Nginx的configure命令添加ssl模块,并编译安装

      # 配置
      ./configure \
      --prefix=/usr/local/nginx \
      --pid-path=/var/run/nginx/nginx.pid \
      --lock-path=/var/lock/nginx.lock \
      --error-log-path=/var/log/nginx/error.log \
      --http-log-path=/var/log/nginx/access.log \
      --with-http_gzip_static_module \
      --http-client-body-temp-path=/var/temp/nginx/client \
      --http-proxy-temp-path=/var/temp/nginx/proxy \
      --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
      --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
      --http-scgi-temp-path=/var/temp/nginx/scgi \
      --with-http-ssl-module
      
      # 重新编译
      make
      
      # 安装
      make install
      
    • 验证SSL模块是否安装成功,进入Nginx目录中的objs目录,打开ngx_modules.c文件,在源代码中搜索,是否包含ssl。

      或者通过指令./nginx -V来验证。

  • 在Nginx的配置文件中添加HTTPS的监听虚拟主机

    # Simple Example
    # HTTPS Server
    server {
          
          
    	listen 443;
    	server_name localhost;
    	
    	location / {
          
          }
    }
    
  • 在Nginx的配置文件中将证书.crt及私钥.key与Nginx服务器绑定

    # 这个配置在腾讯云中有配置样例,可以直接copy
    server {
          
          
    	listen 443;
    	server_name localhost;
    	
    	ssl on;												# 开启ssl
    	ssl_certificate 1_www.imoocdsp.com_bundle.crt;		# 配置ssl证书
    	ssl_certificate_key 2_www.imoocdsp.com.ley;			# 配置证书密钥
    	ssl_session_cache shared:SSL:1m;					# ssl会话cache
    	ssl_session_timeout 5m;								# ssl会话超时时间
    	
    	# 加密套件
    	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;
    	
    	location / {
          
          }
    }
    
  • ./nginx -s reload即可

动静分离的方式——CDN

淘宝在全国各地都有很多服务器,我们在不同的地域访问淘宝,对于静态资源的请求会被分发到距离最近的那个服务器去处理,这就是CDN。

CDN是第三方的,将静态数据交给第三方CDN,如果静态资源在本地,则还是有自己的Nginx来分发。

猜你喜欢

转载自blog.csdn.net/qq_43553923/article/details/115192226