架构师之路(一)Nginx系列之进阶配置

1、301 和 302 区别:

301和302第一次请求都一样, 第一次请求旧域名,请求里有host信息,请求的域名信息;旧域名响应信息,包含跳转信息,应该访问新域名;客户端再发起新的请求,访问新域名,新域名响应要访问的页面。

301 第二次, 只通过一次请求就访问到新域名,相当于浏览器直接告诉客户端, 直接访问新域名,而302 还会先访问旧域名,302 依旧是发送两次请求。 

301 和302 浏览器域名 会发生改变。

2、return

也是跳转;效果上用户体验一样。

位置:server、location、if

www.jd.com/oldboy.html 匹配上了--->  return  301   www.jx.com/oldboy.html
www.jd.com/oldboy.html 匹配上了--->  return  200 ‘ok’  # 页面显示ok

3、页面跳转实践操作

3.1、last 和 break 区别示例

server {
           listen            80;
           server_name       rewrite.oldboy.com;
           root              /html;
           index             index.html;
           location  ~ ^/break/ {
               rewrite  ^/break/  /test/  break;
           }
           location  ~ ^/last/  {
               rewrite  ^/last/  /test/  last;  
           }
           location   /test/ {
               default_type   application/json;
               return 200 'ok';
           }
        }


    break:一旦跳转完毕,默认停止后续操作(没有相应信息)  不会再地址栏显示跳转页面地址
    last: 一旦跳转完毕,会继续访问页面配置信息
    last 和 break 不会改变浏览器 显示的url 地址。

3.2、root 和alias 区别:

location ^~ /t/ {
     root /www/root/html/;
}


如果一个请求的URI是/t/a.html时,web服务器将会返回服务器上的/www/root/html/t/a.html的文件。
alias实例:


location ^~ /t/ {
 alias /www/root/html/new_t/;
}
如果一个请求的URI是/t/a.html时,web服务器将会返回服务器上的/www/root/html/new_t/a.html的文件。注意这里是new_t,因为alias会把location后面配置的路径丢弃掉,把当前匹配到的目录指向到指定的目录。


注意:


1. 使用alias时,目录名后面一定要加"/"。


3. alias在使用正则匹配时,必须捕捉要匹配的内容并在指定的内容处使用。
4. alias只能位于location块中。(root可以不放在location中)

3.3、跳转示例

# uri 跳转示例
用户访问course-11-22-33.html实际上真实访问是/course/11/22/33/course_33.html
       #http://www.oldboy.com/course-11-22-33.html ==> http://www.oldboy.com/course/11/22/33/course_33.html  
       跳转目的,不要让用户得知企业站点目录结构
     
       第一个里程 准备真实的访问路径
       [root@web03 ~]# mkdir /html/course/11/22/33/ -p
       [root@web03 ~]# echo "Curl docs.etiantian.org" > /html/course/11/22/33/course_33.html


       第二个里程 Nginx跳转配置
       [root@web03 conf.d]# cat ccbb.conf 
       server {
               listen 80;
               root /code;
               index index.html;
               location / {
                   #灵活rewrite ^/course-(.*)-(.*)-(.*).html$ /course/$1/$2/$3/course_$3.html redirect;
                   #固定rewrite ^/course-(.*)  /course/11/22/33/course_33.html redirect;
               }
           
       第三个里程 重启Nginx服务
       [root@web03 ~]# systemctl restart nginx
     说明:last break 做跳转不会显示跳转的地址信息
# url 跳转示例
curl -Lv -H host:rewrite.edu.com 10.0.0.7 # 不用hosts解析了
-L 跳转之后,继续追踪显示继续

错误示例:

正确方法一:中断连续跳转

正确方法二:if判断访问的域名

[root@nginx_web01 conf.d]# cat rewrite.conf 
server {
        listen 80;
        server_name 10.0.0.151 www.houbinglei.com;
        location / {
                index new/index.html;
                if ($http_host ~* 10.0.0.151) {
                rewrite ^/(.*) http://www.houbinglei.com/$1 redirect;
                }
        }
}

4、http跳转https 

4.1 部署https 网站

第一个历程:环境准备工作
     安装nginx程序时,需要开启ssl模块功能() --with-http_ssl_module
     
     第二个历程:配置文件中加载ssl配置信息
# 官网链接  http://nginx.org/en/docs/http/ngx_http_ssl_module.html
     server {
          listen              443 ssl;
          server_name         rewrite.oldboy.com;
          ssl_certificate     /etc/nginx/server.crt;    # 相当于公钥
          ssl_certificate_key /etc/nginx/server.key;    # 相当于私钥
     }

当访问京东时,京东会返回给浏览器一个证书.crt (ca对私钥签名生成),下次访问,浏览器拿着证书 跟 京东服务器的私钥进行验证。

# ssh 密钥对原理

ssh密钥对登录的基本思路是:要登录谁,就把公钥放到谁身上,就可以授权登录谁。

第三个历程: 创建私钥和证书
     先有私钥:
     openssl genrsa -idea -out server.key 2048
     私钥密码
     
     创建证书:
     openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt
     -days 36500     --- 设置证书时效
     -x509           --- 设置证书文件信息格式
     -sha256         --- 证书数据加密方式
     -nodes -newkey  --- 去掉密码信息
     rsa:2048        --- 识别私钥加密信息
     -keyout         --- 读取私钥文件
     -out            --- 输出一个证书
     
     第四个历程:重启nginx服务,进行测试
     
     第五个历程:实现http跳转为HTTPs
[root@web01 nginx]# cat /etc/nginx/conf.d/rewrite.conf 
       server {
          listen 80;
          server_name rewrite.oldboy.com;
          rewrite ^(.*) https://$server_name$1 redirect;
          #return 302 https://$server_name$request_uri;
              }
       server {
          listen            443 ssl;
          server_name       rewrite.oldboy.com;
          ssl_certificate     /etc/nginx/server.crt;
          ssl_certificate_key /etc/nginx/server.key;
          location / {
              root   /html;
              index  index.html index.htm;
          }
       }
     
## scheme 示例     
#    rewrite ^(.*) $scheme://rewrite.oldboyedu.com$request_uri redirect;
#    https://rewrite.oldboy.com/oldboy.jpg  ---> https://rewrite.oldboyedu.com/oldboy.jpg
Rewrite常用内置变量,在匹配过程中可以引用一些Nginx的全局变量
       $server_name       当前用户请求的域名
       $request_filename  当前请求的文件路径名(带网站的主目录/html/images/test.jpg)
       $request_uri       当前请求的文件路径名(不带网站的主目录/images/test.jpg)
       $scheme            用的协议,比如http或者https

5、 nginx 配置文件加载顺序

配置文件匹配的优先顺序 

当在/etc/nginx/conf.d/目录下有多个Nginx配置文件,且监听的端口号相同时,会优先选择配置了匹配的server_name且值不为localhost的配置文件;

如果server_name只有为localhost的配置文件和没有配置server_name的配置文件,则会选择localhost的配置文件;

如果监听的端口号及server_name配置的值都一样,则优先选择该目录下第一个配置文件。

发布了51 篇原创文章 · 获赞 0 · 访问量 480

猜你喜欢

转载自blog.csdn.net/qq_40902339/article/details/103501921