Nginx 压缩功能

ngx_http_gzip_module

  1. #ngx_http_gzip_module
  2. gzip方法压缩响应数据,节约带宽
  3.  
  4. #启用或禁用gzip压缩,默认关闭
  5. gzip on | off;
  6.  
  7. #压缩比由低到高从1到9,默认为1
  8. gzip_comp_level level;
  9.  
  10. #禁用IE6 gzip功能
  11. gzip_disable "MSIE [1-6]\.";
  12.  
  13. #gzip压缩的最小文件,小于设置值的文件将不会压缩
  14. gzip_min_length 1k;
  15.  
  16. #启用压缩功能时,协议的最小版本,默认HTTP/1.1
  17. gzip_http_version 1.0 | 1.1;
  18.  
  19. #指定Nginx服务需要向服务器申请的缓存空间的个数*大小,默认32 4k|16 8k;
  20. gzip_buffers number size;
  21.  
  22. #指明仅对哪些类型的资源执行压缩操作;默认为gzip_types text/html,不用显示指定,否则出错
  23. gzip_types mime-type ...;
  24.  
  25. #如果启用压缩,是否在响应报文首部插入“Vary: Accept-Encoding”
  26. gzip_vary on | off;
  27.  
  28. #nginx充当代理服务器时,对于后端服务器的响应报文,在何种条件下启用压缩功能
  29. gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
  30.  
  31. #off:不启用压缩
  32.  
  33. #expired,no-cache, no-store,private:对后端服务器的响应报文首部Cache-Control值任何一个,启用压缩功能

示例:

  1. gzip on;
  2. gzip_comp_level 6;
  3. gzip_min_length 64;
  4. gzip_vary on;
  5. gzip_types text/xml text/css application/javascript;

实战演练:

1、在Nginx服务器上开启压缩功能,并指定压缩类型。

 2、在nginx服务端data/site1目录下创建一个f1.html大文件。

  1. [root@centos27site1]#!dd
  2. dd if=/dev/zero of=f1.html bs=1M count=40
  3. 40+0 records in
  4. 40+0 records out
  5. 41943040 bytes (42 MB) copied, 0.320604 s, 131 MB/s

 3、在客户端进行压缩访问效果。

  1. [root@centos17apps]#curl --compress www.baidu.net/f1.html

4、在nginx服务端进行跟踪日志,查看压缩大小。

https 功能

Web网站的登录页面都是使用https加密传输的,加密数据以保障数据的安全,HTTPS能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议,HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。

  1. https 实现过程如下:
  2. 1.客户端发起HTTPS请求:
  3. 客户端访问某个web端的https地址,一般都是443端口
  4.  
  5. 2.服务端的配置:
  6. 采用https协议的服务器必须要有一套证书,可以通过一些组织申请,也可以自己制作,目前国内很多网站都自
  7. 己做的,当你访问一个网站的时候提示证书不可信任就表示证书是自己做的,证书就是一个公钥和私钥匙,就像
  8. 一把锁和钥匙,正常情况下只有你的钥匙可以打开你的锁,你可以把这个送给别人让他锁住一个箱子,里面放满
  9. 了钱或秘密,别人不知道里面放了什么而且别人也打不开,只有你的钥匙是可以打开的。
  10.  
  11. 3.传送证书:
  12. 服务端给客户端传递证书,其实就是公钥,里面包含了很多信息,例如证书得到颁发机构、过期时间等等。
  13.  
  14. 4.客户端解析证书:
  15. 这部分工作是有客户端完成的,首先回验证公钥的有效性,比如颁发机构、过期时间等等,如果发现异常则会弹
  16. 出一个警告框提示证书可能存在问题,如果证书没有问题就生成一个随机值,然后用证书对该随机值进行加密,
  17. 就像2步骤所说把随机值锁起来,不让别人看到。
  18.  
  19. 5.传送4步骤的加密数据:
  20. 就是将用证书加密后的随机值传递给服务器,目的就是为了让服务器得到这个随机值,以后客户端和服务端的通
  21. 信就可以通过这个随机值进行加密解密了。
  22.  
  23. 6.服务端解密信息:
  24. 服务端用私钥解密5步骤加密后的随机值之后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行
  25. 对称加密,对称加密就是将信息和私钥通过某种算法混合在一起,这样除非你知道私钥,不然是无法获取其内部
  26. 的内容,而正好客户端和服务端都知道这个私钥,所以只要机密算法够复杂就可以保证数据的安全性。
  27.  
  28. 7.传输加密后的信息:
  29. 服务端将用私钥加密后的数据传递给客户端,在客户端可以被还原出原数据内容。
  30.  
  31. 8.客户端解密信息:
  32. 客户端用之前生成的私钥获解密服务端传递过来的数据,由于数据一直是加密得,因此即使第三方获取到数据也
  33. 无法知道其详细内容。

选择SSL证书品牌(CA供应商)

阿里云SSL证书申请:

  1. https://www.aliyun.com/product/cas?spm=a2c4g.11174283.2.1.47676fd4baNCYX

支持阿里云颁发数字证书的安全CA中心包括:

1、Symantec:赛门铁克(Symantec)是全球第一大数字证书颁发机构、全球最值得信赖的SSL证书品牌,所有证书都采用业界领先的加密技术,为不同的网站和服务器提供安全解决方案

2、CFCA: 中国金融认证中心(CFCA)通过国际WebTrust认证,遵循全球统一鉴证标准,是国际CA浏览器联盟组织成员。CFCA全球信任SSL证书,由中国权威数字证书认证机构自主研发,纯国产证书。CFCA提供 7x24 小时金融级的安全保障服务,且有完善的风险承保计划。提供中文版全球信任体系电子认证业务规则(CPS),便于用户理解双方权利和义务

3、GeoTrust: GeoTrust 是全球第二大数字证书颁发机构, 也是身份认证和信任认证领域的领导者,采用各种先进的技术使任何大小的机构和公司都能安全、低成本地部署SSL数字证书和实现各种身份认证

4、GlobalSign: GMO GlobalSign是全球最早的数字证书认证机构之一,一直致力于网络安全认证及数字证书服务,是一个备受信赖的CA和SSL数字证书提供商

选择证书类型

阿里云联合有资质的CA中心推荐以下几种数字证书配置组合方案:

免费型DV SSL: 免费型DV SSL证书是基础级SSL产品

  1. 说明 目前仅Symantec提供免费型数字证书,该证书仅支持绑定一个域名
  2. 只验证域名所有权,数小时内即可颁发
  3. 只提供通信链路加密功能
  4. 根证书一般使用CA中心认证的根证书
  5. 支持绑定一个明细子域名,且不支持通配符域名

通配符DV SSL:通配符DV SSL证书属于DV型SSL证书(Domain Validation SSL)

  1. 只验证域名所有权,数小时内即可颁发
  2. 提供高强度通信链路加密功能
  3. 支持绑定一个带有通配符的域名

ssl 配置参数

nginx 的https 功能基于模块ngx_http_ssl_module实现,因此如果是编译安装的nginx要使用参数
ngx_http_ssl_module开启ssl功能,但是作为nginx的核心功能,yum安装的nginx默认就是开启的,编译安装的
nginx需要指定编译参数--with-http_ssl_module开启,官方文档: https://nginx.org/en/docs/http/ngx_http_ssl_
module.html,配置参数如下:

  1. ssl on | off;
  2. #为指定的虚拟主机配置是否启用ssl功能,此功能在1.15.0废弃,使用listen [ssl]替代。
  3.  
  4. ssl_certificate /path/to/file;
  5. #当前虚拟主机使用使用的公钥文件,一般是crt文件
  6.  
  7. ssl_certificate_key /path/to/file;
  8. #当前虚拟主机使用的私钥文件,一般是key文件
  9.  
  10. ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
  11. #支持ssl协议版本,早期为ssl现在是TSL,默认为后三个
  12.  
  13. ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
  14. #配置ssl缓存
  15. off 关闭缓存
  16. none: 通知客户端支持ssl session cache,但实际不支持
  17. builtin[:size]:使用OpenSSL内建缓存,为每worker进程私有
  18. [shared:name:size]:在各worker之间使用一个共享的缓存,需要定义一个缓存名称和缓存空间大小,一兆可以存储4000个会话信息,多个虚拟主机可以使用相同的缓存名称。
  19.  
  20. ssl_session_timeout time;
  21. #客户端连接可以复用ssl session cache中缓存的有效时长,默认5m

示例:

  1. server {
  2. listen 443 ssl;
  3. server_name www.magedu.com;
  4. root /vhosts/ssl/htdocs;
  5. ssl on;
  6. ssl_certificate /etc/nginx/ssl/nginx.crt;
  7. ssl_certificate_key /etc/nginx/ssl/nginx.key;
  8. ssl_session_cache shared:sslcache:20m;
  9. ssl_session_timeout 10m;
  10. }

自签名证书 

1、在指定的/etc/pki/tls/certs目录下创建公私钥对。

  1. [root@centos27certs]#cd /etc/pki/tls/certs
  2. [root@centos27certs]#make magedu.crt # 自定义一个证书名称
  3. umask 77 ; \
  4. /usr/bin/openssl genrsa -aes128 2048 > magedu.key
  5. Generating RSA private key, 2048 bit long modulus
  6. ........................................................................+++
  7. ...............................................................+++
  8. e is 65537 (0x10001)
  9. Enter pass phrase:
  10. Verifying - Enter pass phrase:
  11. umask 77 ; \
  12. /usr/bin/openssl req -utf8 -new -key magedu.key -x509 -days 365 -out magedu.crt
  13. Enter pass phrase for magedu.key:
  14. You are about to be asked to enter information that will be incorporated
  15. into your certificate request.
  16. What you are about to enter is what is called a Distinguished Name or a DN.
  17. There are quite a few fields but you can leave some blank
  18. For some fields there will be a default value,
  19. If you enter '.', the field will be left blank.
  20. -----
  21. Country Name (2 letter code) [XX]:CN #国家
  22. State or Province Name (full name) []:shanghai #省份
  23. Locality Name (eg, city) [Default City]:shanghai #城市
  24. Organization Name (eg, company) [Default Company Ltd]:magedu.com #公司名称
  25. Organizational Unit Name (eg, section) []:opt #部门
  26. Common Name (eg, your name or your server's hostname) []:www.magedu.net #通用名称
  27. Email Address []: #邮箱

 2、此时生成的私钥是加密状态,访问网站时用户也会需要输入密码,我们需要对其进行解密处理。

  1. [root@centos27certs]#openssl rsa -in magedu.key -out magedu.net.key 将私钥进行解密。
  2. [root@centos27certs]#mv magedu.crt magedu.net.crt 将证书与私钥文件格式一致。
  3. [root@centos27certs]#ll
  4. total 28
  5. lrwxrwxrwx. 1 root root 49 Aug 22 15:23 ca-bundle.crt -> /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
  6. lrwxrwxrwx. 1 root root 55 Aug 22 15:23 ca-bundle.trust.crt -> /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
  7. -rw------- 1 root root 1371 Dec 9 09:30 localhost.crt
  8. -rw------- 1 root root 1766 Dec 13 11:37 magedu.key
  9. -rw------- 1 root root 1342 Dec 13 11:37 magedu.net.crt
  10. -rw-r--r-- 1 root root 1679 Dec 13 11:38 magedu.net.key
  11. -rwxr-xr-x. 1 root root 610 Oct 31 2018 make-dummy-cert
  12. -rw-r--r--. 1 root root 2516 Oct 31 2018 Makefile
  13. -rwxr-xr-x. 1 root root 829 Oct 31 2018 renew-dummy-cert

3、新建一个存放私钥和crt文件的目录,并修改成600权限,保证安全

  1. [root@centos27certs]#mkdir /etc/nginx/ssl
  2. [root@centos27certs]#mv magedu.net.* /etc/nginx/ssl/
  3. [root@centos27certs]#chmod 600 /etc/nginx/ssl/magedu.net*

4、修改相关的配置文件,可以将80端口和443端口同时监听在一个虚拟机中。

  1. vim /etc/nginx/conf.d/test.conf
  2. server {
  3. listen 443 ssl;
  4. listen 80;
  5. server_name www.magedu.net;
  6. root /data/ssl/;
  7. ssl_certificate /etc/nginx/ssl/magedu.net.crt;
  8. ssl_certificate_key /etc/nginx/ssl/magedu.net.key;
  9. ssl_session_cache shared:sslcache:20m;
  10. ssl_session_timeout 10m;
  11. access_log /var/log/nginx/access_json.ssl.log access_json;
  12. }

修改windows机器的C:\Windows\System32\drivers\etc\hosts文件,写入域名解析。

在nginx服务端创建一个网页:

  1. echo /data/ssl/test.html > /data/ssl/index.html

验证网站访问效果:

实现自动跳转至https加密网站

  1. vim /etc/nginx/conf.d/test.conf
  2. server {
  3. listen 443 ssl;
  4. listen 80;
  5. server_name www.magedu.net;
  6. root /data/ssl/;
  7. ssl_certificate /etc/nginx/ssl/magedu.net.crt;
  8. ssl_certificate_key /etc/nginx/ssl/magedu.net.key;
  9. ssl_session_cache shared:sslcache:20m;
  10. ssl_session_timeout 10m;
  11. access_log /var/log/nginx/access_json.ssl.log access_json;
  12. location / {
  13. if ( $scheme = http ){
  14. return 301 https://www.magedu.net/;
  15. }
  16. }
  17. }

在客户端验证效果:

  1. [root@centos17apps]#curl -Lk https://www.magedu.net 其中-k是忽略密码验证
  2. /data/ssl/test.html

Nginx Rewrite相关功能

Nginx服务器利用ngx_http_rewrite_module 模块解析和处理rewrite请求,所以说此功能依靠 PCRE(perl
compatible regularexpression),因此编译之前要安装PCRE库,rewrite是nginx服务器的重要功能之一,用于实现
URL的重写,URL的重写是非常有用的功能,比如它可以在我们改变网站结构之后,不需要客户端修改原来的书
签,也无需其他网站修改我们的链接,就可以设置为访问,另外还可以在一定程度上提高网站的安全性。

ngx_http_rewrite_module模块指令 

将用户请求的URI基于PCRE regex所描述的模式进行检查,而后完成重定向替换

示例:

  1. http://www.magedu.com/hn --> http://www.magedu.com/henan
  2. http://www.magedu.com --> https://www.magedu.com/

https://nginx.org/en/docs/http/ngx_http_rewrite_module.html  

if指令  

用于条件匹配判断,并根据条件判断结果选择不同的Nginx配置,可以配置在server或location块中进行配置,
Nginx的if语法仅能使用if做单次判断,不支持使用if else或者if elif这样的多重判断,用法如下:

  1. 示例:
  2. location /test {
  3. index index.html;
  4. default_type text/html;
  5. if ( $scheme = http ){
  6. return 301 https://www.magedu.net/;
  7. }
  8. if ( $scheme = https ){
  9. echo "if ----> $scheme";
  10. }

使用正则表达式对变量进行匹配,匹配成功时if指令认为条件为true,否则认为false,变量与表达式之间使用以下
符号链接:

  1. =: #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false。
  2. !=: #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false。
  3. ~: #表示在匹配过程中区分大小写字符,(可以通过正则表达式匹配),满足匹配条件为真,不满足为假。
  4. ~*: #表示在匹配过程中不区分大小写字符,(可以通过正则表达式匹配),满足匹配条件为真,不满足问假。
  5. !~:#区分大小写不匹配,不满足为真,满足为假,不满足为真。
  6. !~*:#为不区分大小写不匹配,满足为假,不满足为真。
  7. -f ! -f:判断请求的文件是否存在和是否不存在
  8. -d ! -d: #判断请求的目录是否存在和是否不存在。
  9. -x ! -x: #判断文件是否可执行和是否不可执行。
  10. -e ! -e: #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)。

注: 如果$变量的值为空字符串或是以0开头的任意字符串,则if指令认为该条件为false,其他条件为true。

set指令:

指定key并给其定义一个变量,变量可以调用Nginx内置变量赋值给key,另外set定义格式为set $key $value,及无
论是key还是value都要加$符号。

示例:

  1. location /main {
  2. root /data/nginx/html/pc;
  3. index index.html;
  4. default_type text/html;
  5. set $name magedu;
  6. echo $name;
  7. set $my_port $server_port;
  8. echo $my_port;
  9. }

return指令

停止处理,并返回给客户端指定的响应码(包括: 204, 400, 402 — 406, 408, 410, 411, 413, 416, 500 — 504),并对 301, 302, 303, 307, 308跳转到URL

  1. return code [text]; #返回客户端指定的状态码和文本说明
  2. return code URL;
  3. return URL;

是否开启重写日志, 发送至error_log(notice level)

  1. rewrite_log on | off;  
  1. 示例:
  1. location /test {
  2. root /data/nginx/html/pc;
  3. default_type text/html;
  4. index index.html;
  5. if ( $scheme = http ){
  6. #return 666;
  7. #return 666 "not allow http";
  8. #return 301 http://www.baidu.com;
  9.     return 500 "service error";
  10.     echo "if-----> $scheme"; #return后面的将不再执行
  11. }
  12. if ( $scheme = https ){
  13.    echo "if ----> $scheme";
  14. }

rewrite指令 

1、将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为replacement指定的新的URI。

2、注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查。

3、隐含有循环机制,但不超过10次;如果超过,提示500响应码,[flag]所表示的标志位用于控制此循环机制。

4、如果replacement是以http://或https://开头,则替换结果会直接以重向返回给客户端, 即永久重定向301。

rewrite flag使用介绍  

last:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后对新的URI启动新一轮重写检查;提前重启新一轮循环

break:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块后的其它配置;结束循环

redirect:临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;可使用相对路径,或http://或https://开头,此重定向信息不可缓存,状态码:302

permanent:重写完成后以永久重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求,此重定向信息可缓存,状态码:301

last 和 break用法:

break:匹配成功后不再向下匹配,也不会跳转到其他的location,即直接结束匹配并给客户端返回结果数据

last:对某个location的URL匹配成功后会停止当前location的后续rewrite规则,并结束当前location,然后将匹配生成的新URL跳转至其他location继续匹配,直到没有location可匹配后将最后一次location的数据返回给客户端

last实验演练:

1、先在编译安装的nginx服务器进行修改配置文件,实现test1跳转至test2,以及hn跳转至henan。

  1. [root@centos17conf]#vim /apps/nginx/conf/nginx.conf
  2. location /test1 {
  3. rewrite ^/test1/(.*)$ /test2/$1 last;
  4. }
  5. location /hn {
  6. rewrite ^/hn/(.*)$ /henan/$1 last;
  7. }
  8.  
  9. location /test2 {
  10. default_type text/html;
  11. echo test2;
  12. }
  13.  
  14. location /hn {
  15. default_type text/html;
  16. echo henan;
  17. }

2、修改完nginx配置文件之后,重新加载nginx : nginx  -s  reload,并创建hn和test1的文件。

  1. [root@centos17conf]#mkdir /apps/nginx/html/test1
  2. [root@centos17conf]#echo /apps/nginx/html/test1/test1.html > /apps/nginx/html/test1/index.html
  3. [root@centos17conf]#mkdir /apps/nginx/html/hn
  4. [root@centos17conf]#echo /apps/nginx/html/hn/hn.html > /apps/nginx/html/hn/index.html

 3、在客户端开始验证效果:

  1. [root@centos27~]#curl http://192.168.37.17/hn/
  2. henan
  3. [root@centos27~]#curl http://192.168.37.17/test1/
  4. test2

网页访问效果:

break用法:

1、在nginx服务器中修改成break用法的配置文件,实现hn跳转至henan ,修改完配置文件之后进行重新加载:nginx  -s reload

 vim /apps/nginx/conf/nginx.conf

  1. location /test1 {
  2. rewrite ^/test1/(.*)$ /test2/$1 last;
  3. }
  4. location /hn {
  5. rewrite ^/hn/(.*)$ /henan/$1 break; 实现hn跳转到henan页面,只会在本location跳转,不会跳转至下一个Location,如果本地没有henan对应的html文件,就会提示无法找到文件。
  6. }
  7.  
  8. location /test2 {
  9. default_type text/html;
  10. echo test2;
  11. }
  12.  
  13. location /henan {
  14. default_type text/html;
  15. echo henan;
  16. }

2、如果nginx服务端的/apps/nginx/html/目录下不新建一个henan目录及henan目录下的html文件,就会提示403错误信息,只会在本地的location跳转,不会跳转至下一个location,如果匹配到就会直接返回给用户,如果没有就会显示错误。 

  1. [root@centos17conf]#mkdir /apps/nginx/html/henan 新建henan目录
  2. [root@centos17conf]#echo /apps/nginx/html/henan/index.html > /apps/nginx/html/henan/index.html henan目录下新建一个html文件

3、在客户端访问网页效果:

  1. [root@centos27~]#curl http://192.168.37.17/hn/
  2. henan

permanent永久重定向用法:

1、在nginx服务器端修改配置文件,实现pernanent永久重定向,并重新加载服务:

vim /apps/nginx/conf/nginx.conf

  1. location /henan {
  2. rewrite ^/henan/(.*)$ /hn/$1 permanent;
  3. default_type text/html;
  4. echo henan;
  5. }

2、在网页访问效果, 此时已经实现了永久跳转的效果。

总结:301和302可以在用户访问的页面跳转,用户可以直观的看到跳转,而last和break是后端跳转,用户无法发现,301和302实际中用的比较多。 

rewrite案例-自动跳转https(临时重定向和永久重定向,生产中使用)

要求:基于通信安全考虑公司网站要求全站https,因此要求将在不影响用户请求的情况下将http请求全部自动跳
转至https,另外也可以实现部分location跳转。

1、在nginx服务端修改配置文件,实现http跳转至https加密,修改完成之后重新加载ngixn服务:nginx  -s reload

  1. server {
  2. listen 443 ssl;
  3. listen 80;
  4. server_name www.magedu.net;
  5. root /data/site1/;
  6. ssl_certificate /etc/nginx/ssl/magedu.net.crt;
  7. ssl_certificate_key /etc/nginx/ssl/magedu.net.key;
  8. ssl_session_cache shared:sslcache:20m;
  9. ssl_session_timeout 10m;
  10. access_log /var/log/nginx/access_json.log access_json;
  11. location / {
  12. if ( $scheme = http ) { 判断scheme如果是http,就跳转至https网站,进行加密设置。
  13. rewrite ^/(.*)$ https://www.magedu.net/$1 redirect; 实现临时重定向,若想实现永久重定向,只需要将redirect改为permanent即可。
  14. }
  15. }
  16. }

2、在nginx服务端新建一个site1目录,并在此目录下新建一个html文件。

  1. [root@centos27~]#mkdir /data/site1
  2. [root@centos27~]#echo /data/site1/test.html > /data/site1/index.html

3、在客户端验证效果:

  1. [root@centos17~]#curl -IL -k http://www.magedu.net
  2. HTTP/1.1 302 Moved Temporarily
  3. Server: nginx/1.16.1
  4. Date: Sun, 15 Dec 2019 02:43:15 GMT
  5. Content-Type: text/html
  6. Content-Length: 145
  7. Connection: keep-alive
  8. Keep-Alive: timeout=65
  9. Location: https://www.magedu.net/
  10.  
  11. HTTP/1.1 200 OK
  12. Server: nginx/1.16.1
  13. Date: Sun, 15 Dec 2019 02:43:15 GMT
  14. Content-Type: text/html
  15. Content-Length: 20
  16. Last-Modified: Fri, 13 Dec 2019 04:12:32 GMT
  17. Connection: keep-alive
  18. Keep-Alive: timeout=65
  19. ETag: "5df30fb0-14"
  20. Accept-Ranges: bytes
  21.  
  22. [root@centos17~]#curl -L -k http://www.magedu.net 忽略秘钥验证检查结果
  23. /data/site1/test.html/

实现多个网站的跳转至https加密网站 

1、nginx服务器端:在/etc/pki/tls/certs目录下修改Makefile配置文件,将生成后的证书文件不进行加密。

  1. [root@centos27certs]#cd /etc/pki/tls/certs
  2. [root@centos27certs]#vim Makefile

2、在nginx服务器端,开始自签名证书

  1. [root@centos27certs]#make magedu.org.crt
  2. umask 77 ; \
  3. #/usr/bin/openssl genrsa -aes128 2048 > magedu.org.key
  4. /usr/bin/openssl genrsa 2048 > magedu.org.key
  5. Generating RSA private key, 2048 bit long modulus
  6. .......+++
  7. ......+++
  8. e is 65537 (0x10001)
  9. umask 77 ; \
  10. /usr/bin/openssl req -utf8 -new -key magedu.org.key -x509 -days 365 -out magedu.org.crt
  11. You are about to be asked to enter information that will be incorporated
  12. into your certificate request.
  13. What you are about to enter is what is called a Distinguished Name or a DN.
  14. There are quite a few fields but you can leave some blank
  15. For some fields there will be a default value,
  16. If you enter '.', the field will be left blank.
  17. -----
  18. Country Name (2 letter code) [XX]:CN
  19. State or Province Name (full name) []:beijing
  20. Locality Name (eg, city) [Default City]:beijing
  21. Organization Name (eg, company) [Default Company Ltd]:magedu.org
  22. Organizational Unit Name (eg, section) []:opt
  23. Common Name (eg, your name or your server's hostname) []:www.magedu.org
  24. Email Address []:

 3、在nginx服务端修改配置文件,原来已经添加了一个网站:www.magedu.net,此时新添加一个需要加密的网站:www.magedu.org

  1. server {
  2. listen 443 ssl;
  3. listen 80;
  4. server_name www.magedu.net;
  5. root /data/site1/;
  6. ssl_certificate /etc/nginx/ssl/magedu.net.crt;
  7. ssl_certificate_key /etc/nginx/ssl/magedu.net.key;
  8. ssl_session_cache shared:sslcache:20m;
  9. ssl_session_timeout 10m;
  10. access_log /var/log/nginx/access_json.log access_json;
  11. location / {
  12. if ( $scheme = http ) {
  13. rewrite ^/(.*)$ https://www.magedu.net/$1 redirect;
  14. }
  15. }
  16. }
  17.  
  18. server {
  19. listen 443 ssl;
  20. listen 80;
  21. server_name www.magedu.org; 新添加一个网址
  22. root /data/site2/;
  23. ssl_certificate /etc/nginx/ssl/magedu.org.crt; 指定证书路径
  24. ssl_certificate_key /etc/nginx/ssl/magedu.org.key; 指定私钥路径
  25. ssl_session_cache shared:sslcache:20m;
  26. ssl_session_timeout 10m;
  27. access_log /var/log/nginx/magedu_org.access_json.log access_json;
  28. location / {
  29. if ( $scheme = http ) {
  30. rewrite ^/(.*)$ https://www.magedu.org/$1 redirect;
  31. }
  32. }
  33. }

在nginx服务器上访问的html文件和存放证书、私钥的目录,并将证书和私钥文件存在指定的ssl目录下

  1. [root@centos27site2]#mkdir /etc/nginx/ssl
  2. [root@centos27site2]#echo /data/site2/test2.html > /data/site2/index.html
  3. [root@centos27site2]#mv magedu.org.* /etc/nginx/ssl/

 4、在客户端验证效果,此时访问新的网站也可以访问。

  1. [root@centos17~]#curl -L -k www.magedu.org
  2. /data/site2/test2.html

rewrite案例-访问页面不存在重定向到主页面(生产中实用)

1、修改nginx服务的配置文件,判断访问的文件是否存在,如果不存在,就跳转至www.magedu.net网页下访问。

  1. server {
  2. listen 443 ssl;
  3. listen 80;
  4. server_name www.magedu.net;
  5. root /data/site1/;
  6. ssl_certificate /etc/nginx/ssl/magedu.net.crt;
  7. ssl_certificate_key /etc/nginx/ssl/magedu.net.key;
  8. ssl_session_cache shared:sslcache:20m;
  9. ssl_session_timeout 10m;
  10. access_log /var/log/nginx/access_json.log access_json;
  11. location / {
  12. if ( !-f $request_filename ) { 判断文件是否存在,不存在就跳转至www.magedu.net网页下,其中-f和-e区别:-e判断文件存在性,-f判断普通文件是否存在。
  13. rewrite ^/(.*)$ https://www.magedu.net/index.html redirect; 如果判断文件性,用-e选项,则index.html文件不需要加,如果-f选项,就需要加上默认的index.html文件
  14. }
  15. }
  16. }

 2、修改完ngixn配置文件之后,然后重新加载nginx服务:nginx  -s reload,并在指定的/data/site1目录下新建一个index.html文件。

  1. [root@centos27site1]#mkdir /data/site1
  2. [root@centos27site1]#echo /data/site1/test.html > /data/site1/index.html

3、验证效果,此时网址后面输错内容,就会跳转到加密的网址后面。

  1. [root@centos17apps]#curl -L -k https://www.magedu.net/xxx.html
  2. /data/site1/test.html

rewrite 生产案例

要求:将 http:// 请求跳转到 https://

  1. location / {
  2. if ($scheme = http ) {
  3. rewrite / https://www.magedu.net/ redirect;
  4. }
  5. }

要求:当用户访问到公司网站的时输入了一个错误的URL,可以将用户重定向至官网首页

  1. location / {
  2. root /data/nginx/html/pc;
  3. index index.html;
  4. if (!-f $request_filename) {
  5. #return 404 "No exsit";
  6. rewrite (.*) http://www.magedu.net/index.html;
  7. }
  8. }

Nginx防盗链

防盗链基于客户端携带的referer实现,referer是记录打开一个页面之前记录是从哪个页面跳转过来的标记信息,如
果别人只链接了自己网站图片或某个单独的资源,而不是打开了网站的整个页面,这就是盗链,referer就是之前的
那个网站域名,正常的referer信息有以下几种:

  1. ngx_http_referer_module模块:
  2. 用来阻止Referer首部无有效值的请求访问,可防止盗链。
  3. valid_referers none|blocked|server_names|string ...;
  4. 定义referer首部的合法可用值,不能匹配的将是非法值
  5. none:请求报文首部没有referer首部
  6. blocked:请求报文有referer首部,但无有效值
  7. server_namesreferer首部中包含本主机名
  8. arbitrary_string:任意字符串,但可使用*作通配符
  9. regular expression:被指定的正则表达式模式匹配到的字符串,要使用~开头,例如: ~.*\.magedu\.com

实现web盗链 

1、先创建两个网址,分别是www.magedu.net和www.magedu.org,此时实现net网站盗用org网站的图片。

vim /etc/nginx/conf.d/test.conf

  1. server {
  2. listen 443 ssl;
  3. listen 80;
  4. server_name www.magedu.net;
  5. root /data/site1/;
  6. ssl_certificate /etc/nginx/ssl/magedu.net.crt;
  7. ssl_certificate_key /etc/nginx/ssl/magedu.net.key;
  8. ssl_session_cache shared:sslcache:20m;
  9. ssl_session_timeout 10m;
  10. access_log /var/log/nginx/access_json.log access_json;
  11.  
  12. location / {
  13. if ( !-e $request_filename ) {
  14. rewrite ^/(.*)$ http://www.magedu.net/ redirect;
  15. }
  16. }
  17. }
  18.  
  19. server {
  20. listen 443 ssl;
  21. listen 80;
  22. server_name www.magedu.org;
  23. root /data/site2/;
  24. ssl_certificate /etc/nginx/ssl/magedu.org.crt;
  25. ssl_certificate_key /etc/nginx/ssl/magedu.org.key;
  26. ssl_session_cache shared:sslcache:20m;
  27. ssl_session_timeout 10m;
  28. access_log /var/log/nginx/magedu_org.access_json.log access_json;
  29. }

在/data/site1目录下,创建一个盗链网站:

  vim  /data/site1/daolian.html

  1. 盗链
  2. <img src=http://www.magedu.org/sun.jpg>

2、此时访问magedu.net/daolian.html网站,此时就是盗链了magedu.org网站的sun.jgp图片。

  1. [root@centos17apps]#curl http://www.magedu.net/daolian.html
  2. 盗链
  3. <img src=http://www.magedu.org/sun.jpg>

实现防盗链

基于访问安全考虑,nginx支持通过ungx_http_referer_module模块 https://nginx.org/en/docs/http/ngx_http_re
ferer_module.html#valid_referers 检查访问请求的referer信息是否有效实现防盗链功能,定义方式如下:

防止盗链生产案例:

  1. valid_referers none block server_names
  2. *.magedu.com magedu.* *.mageedu.com mageedu.* ~\.magedu\. ~\.google\. ~\.baidu\.;
  3. if ($invalid_referer) {
  4. return 403 "Forbidden Access";
  5. }

自定义防止盗链:  

  1. server {
  2. listen 443 ssl;
  3. listen 80;
  4. server_name www.magedu.net;
  5. root /data/site1/;
  6. ssl_certificate /etc/nginx/ssl/magedu.net.crt;
  7. ssl_certificate_key /etc/nginx/ssl/magedu.net.key;
  8. ssl_session_cache shared:sslcache:20m;
  9. ssl_session_timeout 10m;
  10. access_log /var/log/nginx/access_json.log access_json;
  11.  
  12. location / {
  13. if ( !-e $request_filename ) {
  14. rewrite ^/(.*)$ http://www.magedu.net/ redirect;
  15. }
  16. }
  17. }
  18.  
  19. server {
  20. listen 443 ssl;
  21. listen 80;
  22. server_name www.magedu.org;
  23. root /data/site2/;
  24. ssl_certificate /etc/nginx/ssl/magedu.org.crt;
  25. ssl_certificate_key /etc/nginx/ssl/magedu.org.key;
  26. ssl_session_cache shared:sslcache:20m;
  27. ssl_session_timeout 10m;
  28. access_log /var/log/nginx/magedu_org.access_json.log main;
  29. valid_referers none block server_names *.magedu.com ~\.google\. ~\.baidu\.; 定义有效referer;除了定义的这个通配符、正则表达式的网址可以调用,其他网址都不可以调用本网址的资源
  30. if ($invalid_referer) { 出定义的referer外,其他网址就会返回状态:错误403
  31. return 403 "Forbidden Access";
  32. }
  33. }

重启nginx进行访问测试。  

nginx的压缩、https加密实现、rewrite、常见盗链配置的更多相关文章

  1. Nginx Configuration 免费HTTPS加密证书

    Linux就该这么学 2018-05-11 实验环境:CentOS Linux release 7.3.1611 (Core) 内核版本:Linux version 3.10.0-514.el7.x8 ...

  2. nginx强制使用https访问(多站点多域名配置)

    很多配置过https模板的人都知道,配置https 时 ,站在用户的角度http 和https 的区别根本不清楚.有时候敲 http 时会出现 404 错误,而实际上我们是https. 有朋友找我配置 ...

  3. Nginx从安装到虚拟主机、https加密、重定向的设置

    编译前的设置: 在源代码文件中把版本号注释掉,这是为了防止针对特定版本的恶意攻击 关闭编译时的调试模式 解决编译前的依赖性 进行配置参数: 对参数进行解读: 编译和安装: 做软链接方便调用: 创建ng ...

  4. Nginx采用https加密访问后出现的问题

    线上的一个网站运行了一段时间,应领导要求,将其访问方式更改为https加密方式.更改为https后,网站访问正常,但网站注册功能不能正常使用了! 经过排查,是nginx配置里结合php部分漏洞了一个参 ...

  5. nginx安装Lets Encrypt SSL免费HTTPS加密证书

    Linux Nginx网站:Certbot安装配置Lets Encrypt SSL免费HTTPS加密证书 原文地址:https://renwole.com/archives/157 实验环境:Cent ...

  6. Nginx https加密以及nginx日志配置与管理

    Nginx https加密以及nginx日志配置与管理 使用Nginx的优点Nginx作为WEB服务器,Nginx处理静态文件.索引文件.自动索引的效率非常高.Nginx作为代理服务器,Nginx可以 ...

  7. NGINX之——配置HTTPS加密反向代理訪问–自签CA

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46695495 出于公司内部訪问考虑,採用的CA是本机Openssl自签名生成的,因 ...

  8. Nginx上部署HTTPS

    Nginx上部署HTTPS依赖OpenSSL库和包含文件,即须先安装好libssl-dev,且ln -s /usr/lib/x86_64-linux-gnu/libssl.so  /usr/lib/, ...

  9. Nginx上部署HTTPS + HTTP2

    Nginx上部署HTTPS依赖OpenSSL库和包含文件,即须先安装好libssl-dev(或者OpenSSL),且ln -s /usr/lib/x86_64-linux-gnu/libssl.so ...

随机推荐

  1. 003-maven开发Java脚手架archrtype-技术点说明

    一.概述 二.技术点说明 2.1.项目结构 凡auto包或文件件,均会被代码生成器再次生成二修改 1.model层 po:BasePO基础类,统一了数据库的基础字段[数据库必须添加如下,与mybati ...

  2. Ubuntu新建用户并指定目录

    例如我要新建一个nginx用户,并指定目录,允许使用bash登录 sudo useradd -d "/home/nginx" -m -s "/bin/bash" ...

  3. 【Shell常用命令一】echo bash alias history 输出重定向 快捷键

    echo输出命令 echo [选项] [输出内容] -e : 支持反斜线控制的字符转换 赋予执行权限 直接运行 chmond 755 hello.sh ./hello.sh 通过bash调用执行脚本 ...

  4. 修改服务器时间以后 cookie无法保存

    修改了服务器时间以后发现,cookie无法保存.通过查看异步请求的响应头信息  Date是之前修改的信息,并不是当前的时间. header('Date: Mon, 17 Mar 2015 05:34: ...

  5. POJ 1221 UNIMODAL PALINDROMIC DECOMPOSITIONS

    总时间限制: 1000ms 内存限制: 65536kB 描述 A sequence of positive integers is Palindromic if it reads the same f ...

  6. springboot统一返回json数据格式并配置系统异常拦截

    本文链接:https://blog.csdn.net/syystx/article/details/82870217通常进行前后端分离开发时我们需要定义统一的json数据交互格式并对系统未处理异常进行 ...

  7. 【剑指offer】面试题 8. 二叉树的下一个结点

    面试题 8. 二叉树的下一个结点 NowCoder 题目描述 给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指 ...

  8. Servlet知识点小结

    Servlet: server applet * 概念:运行在服务器端的小程序 * Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则. * 将来我们自定义一个类,实 ...

  9. Python之 random 模块

    #!/usr/bin/env python # -*- coding:utf8 -*- import random ''' 如果想要随机的内容的话,就可以使用这个模块来完成 ''' ######### ...

  10. Word样式教程

    目录 写在前面 样式可以解决什么问题? 本文适合于 快速入门 一切皆样式 样式与格式的关系 如何修改样式 建立新的样式 样式的匹配和更新 根据样式更新所选段落 根据所选段落更新样式 小结 进一步了解 ...