• 微信小程序-request fail


    一、引言

            接上篇云服务器-Docker容器-系统搭建部署-CSDN博客,一方面是提高实践架构技术,一方面给家里人做点生活小工具。

            在搭建好服务器和前后端程序之后,经过测试,作者给家里人做的生活系微信小程序就差不多可以用了。

            先搞了一个体验版本试用。然后就崩了,接口不通,打开调试器再使用又可以了。

    62bcfd010d97465baa2c07f93f749f05.png

    二、分析

            这种调试情况可用,线上版本(不管是体验版还是发布版)不通的情况,肯定是微信做了什么拦截,在社区问了一下,其他博主说是微信必须使用域名访问,网络请求必须使用Https,域名还要在页面配一下合法。

            那么这就引出来很多其他工作了,大的方向可用分为域名、Https部署、ssl证书、小程序页面配置。还有很多备案之类的细节工作。

            技术上还需要考虑的是解析转发问题,请求通过域名dns解析到服务器之后,https 的解析无非两种做法:springboot部署或者nginx解析转发,

    1、springboot与Nginx解析https选型

            先看看springboot部署大致需要做什么:

    1. 1、证书文件放置在应用程序的classpath下,配置SSL证书:
    2. server.ssl.key-store=classpath:**
    3. server.ssl.key-store-password=**
    4. server.ssl.key-store-type=**
    5. server.ssl.key-alias=**
    6. 2. 配置HTTPS连接:
    7. server.port=443
    8. server.ssl.enabled=true
    9. 这里的`443`是HTTPS连接的端口号,`true`表示启用HTTPS连接。
    10. 3. 配置HTTP重定向:
    11. @Configuration
    12. public class WebConfig implements WebMvcConfigurer {
    13. @Override
    14. public void addViewControllers(ViewControllerRegistry registry) {
    15. registry.addRedirectViewController("/", "/index.html");
    16. }
    17. @Bean
    18. public TomcatServletWebServerFactory servletContainer() {
    19. TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
    20. @Override
    21. protected void postProcessContext(Context context) {
    22. SecurityConstraint securityConstraint = new SecurityConstraint();
    23. securityConstraint.setUserConstraint("CONFIDENTIAL");
    24. SecurityCollection collection = new SecurityCollection();
    25. collection.addPattern("/*");
    26. securityConstraint.addCollection(collection);
    27. context.addConstraint(securityConstraint);
    28. }
    29. };
    30. tomcat.addAdditionalTomcatConnectors(httpConnector());
    31. return tomcat;
    32. }
    33. @Bean
    34. public Connector httpConnector() {
    35. Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
    36. connector.setScheme("http");
    37. connector.setPort(80);
    38. connector.setSecure(false);
    39. connector.setRedirectPort(443);
    40. return connector;
    41. }
    42. }

            nginx需要做什么呢

    1. 1、配置SSL证书:将SSL证书配置到Nginx服务器上。将证书文件(包括公钥和私钥)上传到服务器上的指定目录,例如`/etc/nginx/ssl`。
    2. 2. 配置Nginx虚拟主机:打开Nginx配置文件(通常是`nginx.conf`或`/etc/nginx/nginx.conf`),找到您要配置SSL的虚拟主机部分。在该部分中,添加以下配置:
    3. server {
    4. listen 443 ssl;
    5. server_name **;
    6. ssl_certificate /etc/nginx/ssl/**.crt;
    7. ssl_certificate_key /etc/nginx/ssl/**.key;
    8. location / {
    9. # 配置您的应用程序代理
    10. proxy_pass http://**;
    11. proxy_set_header Host $host;
    12. proxy_set_header X-Real-IP $remote_addr;
    13. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    14. proxy_set_header X-Forwarded-Proto $scheme;
    15. }
    16. }
    17. 3. 配置HTTP重定向:为了将HTTP请求重定向到HTTPS,您可以在Nginx配置文件中添加以下配置:
    18. server {
    19. listen 80;
    20. server_name your_domain.com;
    21. location / {
    22. return 301 https://$host$request_uri;
    23. }
    24. }

            看起来都有一些工作量,不过Nginx是现在做代理和负载均衡的主流方式,扩展性也高,所以作者还是选择nginx进行解析,后续可以进行各种技术方案的实践。

    2、Nginx部署方案

            既然选定了Nginx,那还要考虑一下部署方案,正常是单独一个服务器部署网关,然后解析转发到其他服务器,很明显,作者没钱。那就只能在同一个服务器上部署了。

            在同一个腾讯云服务器上部署又要考虑一下了,到底是直接部署服务器,还是建一个docker容器再把nginx部署进去。

            linux做起来挺简单的,大致这么搞一下

    1. 1. 安装Nginx:
    2. sudo yum install nginx
    3. 2. 启动Nginx:
    4. sudo systemctl start nginx
    5. 3. 配置Nginx:默认情况下,Nginx的配置文件位于`/etc/nginx/nginx.conf`。按照之前的说法再改改配置。

            docker还要考虑文件在服务器和容器里面的映射关系,毕竟容器里面的文件会随着容器的停止而销毁。不考虑的话也很简单。

    1. 1. 获取Nginx镜像:
    2. docker pull nginx
    3. 2. 创建并运行Nginx容器:
    4. docker run -d -p 80:80 --name my-nginx nginx

            考虑到隔离性和扩展性,不影响其他容器的内存使用,作者选择在容器里面部署。

    三、域名

            域名申请哪家的都可以,但是作者之前都用的腾讯云,同一家肯定提供很多便利,很多调试兼容可以省掉。所以作者还是选择腾讯云。

    1、注册

            在域名注册购买_域名注册选购 - 腾讯云 ,搜索自己想要的域名就可以下单购买了,很多10块一年的买了玩也无所谓。什么都能搜,有的可能被别人占了。

    e8b04df3bd6447b89a16710bf43cb31d.png

    2、ssl证书

            这个是当时有点疑惑的,作者习惯先调查搜集信息再实地察看,最后动手实践。但是网上搜集到的信息一般是说ssl有免费的也有收费的,dns解析也是,让人有点摸不着头脑。

            直接搜一下,其实是有收费也有免费的。

    b68c93b29af44799a60bf92e1da59040.png

    1bac72e97f7744e483ed9dc5b31636ca.png

            对于SSL证书,有些提供商提供免费的SSL证书,例如Let's Encrypt,这些证书可以用于在网站上启用HTTPS协议,从而提供更安全的通信。但是,这些免费证书可能存在一些限制,例如有效期较短、不支持所有浏览器等。收费的SSL证书通常由专业的CA(证书颁发机构)提供,它们提供更广泛的浏览器兼容性、更长的有效期和更高的安全性等特性。

            而对于DNS服务,也有一些提供商提供免费的DNS服务,例如Cloudflare、Google等,有基本的DNS解析功能。但是,这些免费服务可能存在一些限制,例如不支持高级功能、不提供人工支持等。收费的DNS服务通常由专业的DNS提供商提供,提供更广泛的功能、更高的性能和更好的支持等特性。

            腾讯云申请域名之后自带dns解析,这个不用管。

            但是ssl证书还是要申请的。登录 - 腾讯云,ECC性能好、资源消耗少,但是很多老环境不支持,RSA有广泛的兼容性和经过验证的安全性,所以作者选择ECC,会单独在云环境搞这些的基本上没什么体量,安全相关不是最主要的,毕竟不是百万流量黑客都懒得逆向解析你的网站。反而消耗资源是小户比较关注的。

    e3cd70b63a284eaeb856c1f22fbab55e.png

            申请完成之后要下载,选择格式,适配各种部署方式

    a0d9b2ac1a814b2c9d825ce37914758d.png

             nginx下载之后有四个文件:

    1. 证书文件(Certificate File):通常以 `.crt` 或 `.pem` 扩展名结尾。这个文件包含了公钥证书,用于验证服务器的身份。证书文件是由证书颁发机构(CA)签发的,其中包含了服务器的公钥、域名信息以及CA的数字签名。

    2. 私钥文件(Private Key File):通常以 `.key` 或 `.pem` 扩展名结尾。这个文件包含了服务器的私钥,用于对传输的数据进行加密和解密。私钥文件必须保密,不应该被泄露给其他人。

    3. 中间证书文件(Intermediate Certificate File):通常以 `.crt` 或 `.pem` 扩展名结尾。这个文件包含了证书链中的中间证书,用于构建完整的证书链。证书链是由根证书颁发机构(Root CA)签发的中间证书和服务器证书的序列。

    4. 根证书文件(Root Certificate File):通常以 `.crt` 或 `.pem` 扩展名结尾。这个文件包含了根证书颁发机构的根证书。根证书用于验证中间证书的可信性,构成了证书链的最顶层。

    28b2b16b7f7b4c8eb4ff842019716934.png

    四、Nginx部署

    1、创建nginx容器

    创建个镜像,只是用于生成环境需要的文件

    docker run --name nginx -p 80:80 -d nginx


    2、docker cp把容器的文件拉到服务器本地目录下面

            **是指服务器的文件目录,比如创建文件夹 /etc/nginx/ssl之后就可以cp到这里

    1. docker cp nginx:/etc/nginx/nginx.conf **
    2. docker cp nginx:/etc/nginx/conf.d **
    3. docker cp nginx:/usr/share/nginx/html **

    3、用完就删

    docker rm -f nginx

    4、证书上传nginx目录

            这个没什么好说的,传到/etc/nginx/ssl下面去

    5、改nginx配置

            这里是重点,端口映射、ssl证书位置、域名转向的目标位置,都是在这里配置     

    1. user nginx;
    2. worker_processes auto;
    3. error_log /var/log/nginx/error.log notice;
    4. pid /var/run/nginx.pid;
    5. events {
    6. worker_connections 1024;
    7. }
    8. http {
    9. include /etc/nginx/mime.types;
    10. default_type application/octet-stream;
    11. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    12. '$status $body_bytes_sent "$http_referer" '
    13. '"$http_user_agent" "$http_x_forwarded_for"';
    14. access_log /var/log/nginx/access.log main;
    15. sendfile on;
    16. #tcp_nopush on;
    17. keepalive_timeout 65;
    18. #gzip on;
    19. include /etc/nginx/conf.d/*.conf;
    20. server {
    21. listen 80;
    22. #填写绑定证书的域名
    23. server_name www.**.cloud;
    24. #把http的域名请求转成https,相当于用户访问http也可以自动跳转到https,避免出现网页提示不安全
    25. return 301 https://$host$request_uri;
    26. }
    27. server {
    28. listen 443 ssl;
    29. server_name www.**.cloud;
    30. #证书文件名称
    31. ssl_certificate_key /etc/nginx/ssl/**.cloud.key;
    32. #私钥文件名称 .crt和.pem都可以用
    33. ssl_certificate /etc/nginx/ssl/**.cloud_bundle.pem;
    34. ssl_session_timeout 5m;
    35. ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    36. ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    37. ssl_prefer_server_ciphers on;
    38. root /usr/local/nginx/html;
    39. # Load configuration files for the default server block.
    40. include /etc/nginx/default.d/*.conf;
    41. #首页
    42. location / {
    43. proxy_pass http://**;
    44. proxy_set_header Host $host;
    45. proxy_set_header X-Real-IP $remote_addr;
    46. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    47. }
    48. }
    49. }

    6、启动

    1. docker run -d \
    2. -p 80:80 \
    3. -p 443:443 \
    4. --name nginx \
    5. --restart=always \
    6. --network-alias nginx \
    7. -v **:/etc/nginx/nginx.conf \
    8. -v **:/etc/nginx/conf.d \
    9. -v **:/var/log/nginx \
    10. -v **:/usr/share/nginx/html \
    11. -v **:/etc/nginx/cert \
    12. nginx

    五、域名备案

            部署完了作者还想直接跑起来的,于是在测试环境调试了一下,通的,但是一到体验版就不行了。必须在小程序页面配置合法域名,但是配置又会提醒备案。

            这里还有个注意点,如果使用了一些第三方或者腾讯自身的组件api,也要把域名配进去,比如作者使用了腾讯地图的api,需要配置https://apis.map.qq.com

    62ab63d0eafb407d994c04cf3c4cfa8e.png

            备案有几个点比较麻烦:

            1、视频验身,有两个,一个要拿着承诺书拍,一个要在注册地拍,注册地我选的是户口所在地,选工作地方应该也没关系

            2、 要把解析暂时停掉云解析 DNS 暂停或启用解析记录-操作指南-文档中心-腾讯云

             等到备案结束就可以开始使用了吗?天真

            还要进行公安备案ICP 备案 公安备案流程-备案后续流程-文档中心-腾讯云,不过30天之内就可以。

            然后在自己的微信小程序设置合法域名

    1c825547a3ca4c5398242b1deed0e324.png

    0ee169cacb204f0eafba39c079fe1e21.png

    六、总结

            现在各种复杂的环境、工具,但是原理都是相同的,看起来简单的域名、备案、解析转发涉及到的经验和技术问题也不少。最重要的就是思考分析,不然很多同学遇到问题就会头疼不知道下面该做什么该看什么。

            云技术、前后端、微信小程序有兴趣都可以交流。

  • 相关阅读:
    数据交换格式
    2023年中国叉车租赁行业现状分析:设备价格昂贵,租赁市场需求增长[图]
    2023开学礼山东财经大学《乡村振兴战略下传统村落文化旅游设计》许少辉新财经图书馆
    【一起进大厂】最新Java并发面试题整理
    Mysql之innodb
    【JAVA基础】【查漏补缺】09 - 面向对象进阶(static、继承、多态)
    linux 安装R 环境(最新)
    如何申请外贸公司的邮箱
    数据库(mysql)之事务和存储引擎
    【C语言】算法:二分查找
  • 原文地址:https://blog.csdn.net/m0_69270256/article/details/133866529