整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Nginx的rewrite案例之目录自动添加斜杠

文讨论,如何对目录自动加/

第一步,打开conf的配置文件


第二步 监听8082端口,配置server_name localhost;内容

root查html目录,index搜索其中的index.html文件

server块 {
    listen 8082;


    server_name localhost;
    location /heima {
        root html;
        index index.html;


    }
}

第三步:这里出现了404的错误,错误的原因是因为文件资源寻找需要到 /heima目录下的 html文件的index.html文件,现在没有,找不到出错了

第四步 切换到html页面,创建heima文件,切换,利用>将内容装进去

第五步 利用cat可以查看index.html页面的内容

带个/和不带/的区别是什么?

把/去掉之后,它发送的请求有两个,一个是301短期重定向,一个是200永久重定向

但如果是访问的/访问的路径,最终只有一个请求,就是200

分析:

如果不加斜杠,Nginx服务器内部会自动做一个301的重定向,重定向的地址会有一个指令叫server_name_in_redirec onloff;来决定重定向的地址:

如果该指令为on 重定向的地址为: http://server_name/目录名/;

如果该指令为off 重定向的地址为: http://原URL中的域名/目录名/;

这句话什么意思?

如果把server_name_in_redirec 设置成了on 路径就会变为了http://localhost:8082/heima/这个路径,会变成localhost

端口未提供服务,就会报错

所以就拿刚才的地址来说, http://192.168.200.133/hm如果不加斜杠, 那么按照上述规则,如果指令server_name_in_redirect为on,则301重 定向地址变为 http://localhost/hm/,如果为off,则301重定向地址变为 ttp://192.168.200.133/ht/。后面这个是正常的,前面地址就有问题。

注意server_name_in_redirect指令在Nginx的0.8.48版本之前默认都是 on,之后改成了off,所以现在我们这个版本不需要考虑这个问题,但是 如果是0.8.48以前的版本并且server_name_in_redirect设置为on,我们 如何通过rewrite来解决这个问题?

手动给他改一下,第一步,切换到conf文件下,vim打开配置文件

手动配置,在server_name_in_redirect on中进行打开

打开之后就会出现一个明显的问题,带/就能够正常访问

不带/就不能够正常访问,就转圈圈了,因为它最终会把自己的服务重定向到localhost/heima/

这种情况,主要适用于,目录加/的情况,如果访问的是一个html页面,真实在使用的情况中,只有添加了目录,才最好加/

$host就是自己设置的主机IP,$server_port获取的是8082,加上下面if这句话的意思是主要判断,

index.html,设置的是一个页面,不发生映射跳转

如果是永久重定向,用permanent进行设置

测试经过 192.168.200.133:8082/heima/ 这种带/最终返回了200状态码

如果不带/,会发送一个302和200的状态码,同时下面的内容也多了一个/

为什么多了一个/,原因是下面的在匹配的时候,已经匹配了/,所以在URL重定向的路径多了一个/,解决多了/的方法是

将server_port后面/去掉,直接加上就好了

最终//的内容消失不见了

记录10】华为云耀云服务器L实例-使用Docker拉取nginx镜像的部署示例

Docker 是一个开源平台,用于开发、运输和运行应用程序。它使用容器化技术来包装应用程序及其依赖项,以便在任何环境中都能一致地运行。简单来说,Docker 可以将应用程序及其所有依赖项打包成一个容器,这样就可以确保它无论在哪里运行都表现一致。

### Docker 的主要组件:

1. **Docker Engine**:核心组件,负责创建和运行容器。

2. **Docker Image**:一个轻量级、独立的可执行软件包,包含运行应用所需的所有内容——代码、运行时、库、环境变量和配置文件。

3. **Docker Container**:Docker 图像的运行实例。容器是隔离的环境,其中运行应用程序和其依赖项。

4. **Docker Hub**:一个公共的图像注册中心,你可以从中拉取图像或推送自己的图像。

5. **Docker Compose**:一个用于定义和运行多容器 Docker 应用程序的工具。

6. **Docker Swarm/Kubernetes**:用于容器编排和集群管理的工具。

### Docker 的主要优点:

1. **一致性**:由于应用程序和所有依赖项都被打包在同一个容器中,你可以确保应用程序在不同环境中的行为是一致的。

2. **可移植性**:你可以在任何支持 Docker 的系统上运行 Docker 容器,无论是本地机器、数据中心还是云服务。

3. **易于管理**:Docker 提供了强大的命令行和图形界面工具,用于管理容器的生命周期。

4. **隔离性**:每个容器都在其自己的隔离环境中运行,这增加了应用程序的安全性和可靠性。

5. **微服务架构**:Docker 非常适合微服务架构,因为你可以为每个服务创建一个单独的容器。

### 常见用途:

- **开发和测试**:开发人员可以在本地机器上使用与生产环境相同的容器进行开发和测试。

- **持续集成和持续部署(CI/CD)**:自动化构建、测试和部署应用程序。

- **应用程序部署**:在单个服务器或跨多个服务器的集群中部署应用程序。

- **服务编排**:使用工具如 Docker Swarm 或 Knubernetes 自动管理多个容器。

Nginx(发音为 "Engine-X")是一个开源的、高性能的 HTTP 和反向代理服务器,也可以用作 IMAP/POP3/SMTP 代理服务器。它是由 Igor Sysoev 开发的,最初发布于 2004 年。Nginx 旨在提供低内存占用和高并发性,因此它通常用于服务高流量的网站和应用。

### Nginx 的主要特点:

1. **高性能和高并发**: Nginx 能够处理数以千计的并发连接,这主要得益于其基于事件的架构。

2. **反向代理**: Nginx 可以作为反向代理服务器,将客户端请求转发到后端服务器,并将后端服务器的响应返回给客户端。

3. **负载均衡**: Nginx 可以分发进入的客户端请求到多个后端服务器,以实现负载均衡。

4. **静态文件服务**: Nginx 非常擅长于快速地提供静态资源,如 HTML、CSS、JavaScript 和图像文件。

5. **缓存**: Nginx 提供了灵活的缓存机制,可以缓存来自后端服务器的响应。

6. **安全**: 提供 SSL/TLS 支持,还有其他一些安全特性,如 HTTP 基础认证、IP 黑名单等。

7. **灵活的配置**: Nginx 的配置文件格式相对简单,易于理解和维护。

8. **扩展性**: Nginx 支持各种第三方模块,以增加更多功能。

### 常见用途:

- **Web 服务器**: 托管网站和 web 应用。

- **API 网关**: 处理 API 请求并将其路由到适当的后端服务。

- **CDN 边缘节点**: 作为内容分发网络的一部分。

- **流媒体服务器**: 提供视频流和其他媒体内容。

本篇中,我们将完成Docker在华为云服务器上的部署,并完成nginx镜像的拉取。

当然,Docker 是一个非常强大的工具,它可以用于容器化应用和服务。以下是一些在 CentOS 上使用 Docker 的基础示例。

### 安装 Docker

1. **更新软件包索引**:

```bash

sudo yum update -y

```

2. **安装 Docker**:

```bash

sudo yum install docker -y

```

(在此前我已安装过,故没有显示安装过程)

3. **启动 Docker 服务**:

```bash

sudo systemctl start docker

```

4. **设置 Docker 开机自启**:

```bash

sudo systemctl enable docker

```

### 使用 Docker

1. **拉取一个镜像**(以 nginx 为例):

```bash

sudo docker pull nginx

```

2. **运行一个容器**:

```bash

sudo docker run -d -p 8080:80 nginx

```

这将运行一个 nginx 容器,并将其 80 端口映射到主机的 8080 端口。

出现以上提示时,表示已经成功地运行了一个 Nginx 容器,并将容器的 80 端口映射到了主机的 8080 端口。通过访问 http://[你的服务器IP地址]:8080 来看到 Nginx 的默认欢迎页面。

3. **查看运行中的容器**:

```bash

sudo docker ps

```

4.**查看本地镜像**:

```bash

sudo docker images

```

到此为止,我们已经成功完成了Docker容器在华为云耀云服务器L实例上的部署,并完成了nignx镜像的拉取。Docker 的这些特性和优点使其成为现代软件开发和运维的重要工具,而Nginx 在互联网公司、大型企业和个人开发者中都非常受欢迎,因为它既稳定又高效。它是许多高流量网站背后的关键组件,包括 Netflix、Hulu、GitHub、Dropbox 等。

使用华为云耀云服务器L实例部署docker,我们在强大而稳定的服务基础上,获得了一个支持更高效的现代软件开发运维的云环境,这为我们部署更多项目奠定了坚实的基础、提供了强大的支撑。


着我们网站用户的增多,我们会逐渐意识到HTTPS加密的重要性。在不修改现有代码的情况下,要从HTTP升级到HTTPS,让Nginx支持HTTPS是个很好的选择。今天我们来讲下如何从Nginx入手,从HTTP升级到HTTPS,同时支持静态网站和SpringBoot应用,希望对大家有所帮助!

生成SSL自签名证书

虽然自签名证书浏览器认为并不是安全的,但是学习下SSL证书的生成还是很有必要的!

  • 首先创建SSL证书私钥,期间需要输入两次用户名和密码,生成文件为blog.key
openssl genrsa -des3 -out blog.key 2048
  • 利用私钥生成一个不需要输入密码的密钥文件,生成文件为blog_nopass.key
openssl rsa -in blog.key -out blog_nopass.key
  • 创建SSL证书签名请求文件,生成SSL证书时需要使用到,生成文件为blog.csr
openssl req -new -key blog.key -out blog.csr
  • 在生成过程中,我们需要输入一些信息,需要注意的是Common Name需要和网站域名一致;
Enter pass phrase for blog.key:
-----
Country Name (2 letter code) [XX]:CN                                         # 国家代码
State or Province Name (full name) []:jiangsu                                # 省份
Locality Name (eg, city) [Default City]:jiangsu                              # 城市
Organization Name (eg, company) [Default Company Ltd]:macrozheng             # 机构名称
Organizational Unit Name (eg, section) []:dev                                # 单位名称
Common Name (eg, your name or your server's hostname) []:blog.macrozheng.com # 网站域名
Email Address []:macrozheng@qq.com                                           # 邮箱

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:                                                     # 私钥保护密码,可以不输入直接回车
An optional company name []:                                                 # 可选公司名称,可以不输入直接回车
  • 生成SSL证书,有效期为365天,生成文件为blog.crt
openssl x509 -req -days 365 -in blog.csr -signkey blog.key -out blog.crt
  • 其实最终有用的文件是两个,一个是证书文件blog.crt,另一个是不需要输入密码的证书私钥文件blog_nopass.key

Nginx支持HTTPS

SSL证书生成好了,接下来我们就可以配置Nginx来支持HTTPS了!

安装Nginx

  • 我们还是使用在Docker容器中安装Nginx的方式,先下载Nginx的Docker镜像;
docker pull nginx:1.10
  • 下载完成后先运行一次Nginx,由于之后我们要把宿主机的Nginx配置文件映射到Docker容器中去,运行一次方便我们拷贝默认配置;
docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx  \
-d nginx:1.10
  • 运行成功后将容器中的Nginx配置目录拷贝到宿主机上去;
docker container cp nginx:/etc/nginx /mydata/nginx/
  • 将宿主机上的nginx目录改名为conf,要不然/mydata/nginx/nginx这个配置文件目录看着有点别扭;
mv /mydata/nginx/nginx /mydata/nginx/conf
  • 创建的Nginx容器复制完配置后就没用了,停止并删除容器;
docker stop nginx
docker rm nginx
  • 使用Docker命令重新启动Nginx服务,需要映射好配置文件,由于我们要支持HTTPS,还需要开放443端口。
docker run -p 80:80 -p 443:443 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx  \
-v /mydata/nginx/conf:/etc/nginx \
-d nginx:1.10

配置支持HTTPS

  • 将我们生成好的SSL证书和私钥拷贝到Nginx的html/ssl目录下;
cp blog_nopass.key /mydata/nginx/html/ssl/
cp blog.crt /mydata/nginx/html/ssl/
  • 接下来我们需要给blog.macrozheng.com这个域名添加HTTPS支持,在/mydata/nginx/conf/conf.d/目录下添加Nginx配置文件blog.conf,配置文件内容如下;
server {
    listen       80; # 同时支持HTTP
    listen       443 ssl; # 添加HTTPS支持
    server_name  blog.macrozheng.com;
  
    #SSL配置
    ssl_certificate      /usr/share/nginx/html/ssl/blog/blog.crt; # 配置证书
    ssl_certificate_key  /usr/share/nginx/html/ssl/blog/blog_nopass.key; # 配置证书私钥
    ssl_protocols        TLSv1 TLSv1.1 TLSv1.2; # 配置SSL协议版本
    ssl_ciphers          ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; # 配置SSL加密算法
    ssl_prefer_server_ciphers  on; # 优先采取服务器算法
    ssl_session_cache    shared:SSL:10m; # 配置共享会话缓存大小
    ssl_session_timeout  10m; # 配置会话超时时间

    location / {
        root   /usr/share/nginx/html/www;
        index  index.html index.htm;
    }

    location /admin {
        alias   /usr/share/nginx/html/admin;
        index  index.html index.htm;
    }

    location /app {
        alias   /usr/share/nginx/html/app;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
  • 通过HTTPS访问blog.macrozheng.com这个域名,由于我们使用的是自己签名的SSL证书,浏览器会提示您的连接不是私密连接,点击继续前往可以通过HTTPS正常访问;


  • 我们可以查看下证书的颁发者信息,可以发现正好是之前我们创建SSL证书签名请求文件时录入的信息;


  • 接下来我们需要给api.macrozheng.com这个域名添加HTTPS支持,通过这个域名可以使用HTTPS访问我们的SpringBoot应用,api.crtapi_nopass.key文件需要自行生成,在/mydata/nginx/conf/conf.d/目录下添加Nginx配置文件api.conf,配置文件内容如下;
server {
    listen       80; # 同时支持HTTP
    listen       443 ssl; # 添加HTTPS支持
    server_name  api.macrozheng.com; #修改域名

    #ssl配置
    ssl_certificate      /usr/share/nginx/html/ssl/api/api.crt; # 配置证书
    ssl_certificate_key  /usr/share/nginx/html/ssl/api/api_nopass.key; # 配置证书私钥
    ssl_protocols        TLSv1 TLSv1.1 TLSv1.2; # 配置SSL协议版本 # 配置SSL加密算法
    ssl_ciphers          ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers  on; # 优先采取服务器算法
    ssl_session_cache    shared:SSL:10m; # 配置共享会话缓存大小
    ssl_session_timeout  10m; # 配置会话超时时间

    location / {
        proxy_pass   http://192.168.3.101:8080; # 设置代理服务访问地址
        proxy_set_header  Host $http_host; # 设置客户端真实的域名(包括端口号)
        proxy_set_header  X-Real-IP  $remote_addr; # 设置客户端真实IP
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for; # 设置在多层代理时会包含真实客户端及中间每个代理服务器的IP
        proxy_set_header X-Forwarded-Proto $scheme; # 设置客户端真实的协议(http还是https)
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
  • 通过HTTPS访问api.macrozheng.com这个域名,访问地址为:https://api.macrozheng.com/swagger-ui.html


  • 任意调用一个接口测试下,比如说登录接口,可以发现已经可以通过HTTPS正常访问SpringBoot应用提供的接口。


使用受信任的证书

之前我们使用的是自签名的SSL证书,对于浏览器来说是无效的。使用权威机构颁发的SSL证书浏览器才会认为是有效的,这里给大家推荐两种申请免费SSL证书的方法,一种是从阿里云申请,另一种是从FreeSSL申请。

阿里云证书

  • 阿里云上可以申请的免费证书目前只有支持单个域名的DV级SSL证书。比如说你有blog.macrozheng.comapi.macrozheng.com两个二级域名需要使用HTTPS,就需要申请两个SSL证书。


  • 申请成功后点击下载Nginx证书即可;


  • 下载完成后解压会有下面两个文件;
blog.macrozheng.com.key # 证书私钥文件
blog.macrozheng.com.pem # 证书文件
  • 拷贝证书文件到Nginx的指定目录下,然后修改配置文件blog.conf,只要修改证书配置路径即可,修改完成后重启Nginx;
#SSL配置
ssl_certificate      /usr/share/nginx/html/ssl/blog/blog.macrozheng.com.pem; # 配置证书
ssl_certificate_key  /usr/share/nginx/html/ssl/blog/blog.macrozheng.com.key; # 配置证书私钥
  • 再次通过HTTPS访问blog.macrozheng.com这个域名,发现证书已经有效了,连接也是安全的了。


FreeSSL证书

  • 如果你有使用通配符域名的需求,可以上FreeSSL申请SSL证书,不过免费的有效期只有3个月,这就意味着你过3个月就要重新申请一次了。


  • 附上官网地址:https://freessl.cn/

使用acme.sh自动申请证书

  • acme.sh脚本实现了acme协议, 可以从letsencrypt生成免费的证书。一般我们申请的证书有效期都是1年,过期就要重新申请了,使用acme.sh脚本可以实现到期自动申请,再也不用担心证书过期了!


  • 附上官网地址:https://github.com/acmesh-official/acme.sh