ngix安装与使用(代理内网访问高德)

主要是nginx的安装使用
1. 安装nginx(以及两个tomcat)
2. 使用nginx(测试负载均衡)
想要搭建的测试环境,
1.两个tomcat, 端口分别是80和8090(因为之前安装过一次端口为80的tomcat)
2.nginx端口为8088

image

1. nginx安装(linux为例)

安装目录都在/usr/local下.

  • 安装之前可以先装一下需要用到的指令yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel

  • 安装包获取, 选取Stable version下载

    • 直接下载, (传入虚拟机或服务器) nginx: download

    • 参考上面地址中的版本通过指令 wget http://nginx.org/download/nginx-1.22.1.tar.gz下载

  • 解压安装

    • 解压: tar zxvf nginx-1.22.1.tar.gz

    • 重命名: mv nginx-1.22.1 nginx

    • 进入目录: cd ./ngingx

    • 设置: ./configure

    • 设置(选, 如果需要配置https的话): ./configure --with-http_ssl_module

    • 编译: make

    • 安装: make install

    • 修改配置文件: vim ./conf/nginx.conf

      #user nobody;
      worker_processes 1;
      #error_log logs/error.log;
      #error_log logs/error.log notice;
      #error_log logs/error.log info;
      #pid logs/nginx.pid;
      events {
      worker_connections 1024;
      }
      http {
      include mime.types;
      default_type application/octet-stream;
      #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
      # '$status $body_bytes_sent "$http_referer" '
      # '"$http_user_agent" "$http_x_forwarded_for"';
      #access_log logs/access.log main;
      sendfile on;
      #tcp_nopush on;
      #keepalive_timeout 0;
      keepalive_timeout 65;
      #gzip on;
      # 改动1
      # 新增一个指令块(请求转发都会转发到这里面), 指向两个tomcat的端口
      # weight是权重
      upstream myservers {
      server 127.0.0.1:80 weight=1;
      server 127.0.0.1:8090 weight=1;
      }
      server {
      # 改动2
      # 端口修改为nginx的端口
      # server_name修改为当前机器的ip或域名
      listen 8088;
      server_name 127.0.0.1;
      #charset koi8-r;
      #access_log logs/host.access.log main;
      # 改动3 将指令块添加到转发规则中
      location / {
      proxy_pass http://myservers;
      proxy_redirect default;
      # root html;
      # index index.html index.htm;
      }
      #error_page 404 /404.html;
      # redirect server error pages to the static page /50x.html
      #
      error_page 500 502 503 504 /50x.html;
      location = /50x.html {
      root html;
      }
      # proxy the PHP scripts to Apache listening on 127.0.0.1:80
      #
      #location ~ \.php$ {
      # proxy_pass http://127.0.0.1;
      #}
      # ... 省略

      改动1: 添加指令块(名字和改动3中的一致即可)
      改动2: 修改间挺端口, 默认80
      改动3: 添加请求转发规则(http://后面的名字和改动1中一致)

  • 启动等相关指令
    copy from 参考5

    1、cd /usr/local/nginx/sbin/ //进入目录
    2、./nginx //启动
    3、./nginx -s stop //停止
    4、./nginx -s quit //安全退出
    5、./nginx -s reload //重载配置文件(修改了配置文件需要执行此命令 比较常用)
    6、ps aux|grep nginx //查看ngnix进程

2. tomcat安装

  • 下载tomcat安装包, 建议安装8版本的 Apache Tomcat 8 Software Downloads

  • 解压重命名指令同nginx

  • 第一个端口为80的tomcat目录为tomcat

  • 修改端口: vim ./tomcat/conf/server.conf

    <!-- 将8080改成80 -->
    <Connector port="80" protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" />
  • 启动80的tomcat, ./tomcat/bin/start.sh

  • 第二个端口为8090的tomcat目录为tomcat8090(再次解压一个新的)

  • 修改端口: vim ./tomcat8090/conf/server.xml

    主要修改 Server中的port 和 Connector中的port (如果启动失败可百度启动两个不同端口tomcat自行查找问题或者更改更多参数令其完全不同)

    <!-- 指定关机时候的端口 8005改成8006 -->
    <Server port="8005" shutdown="SHUTDOWN">
    <!-- AJP协议端口: 将8080改成8089 -->
    <Connector port="8089" protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" />
  • 启动8090的tomcat: ./tomcat8090/bin/start.sh

3. 创建一个测试项目

创建一个只有一个接口的demo项目(maven构件为例)
  • pom: 因为使用tomcat运行, 我们打包方式改成war, 添加上打包插件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.example</groupId>
    <artifactId>demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>
    <properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
    <!-- web必要依赖 -->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.7.5</version>
    </dependency>
    <!-- hutool工具类库 -->
    <dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.9</version>
    </dependency>
    </dependencies>
    <build>
    <!-- 指定打包出来的文件名 -->
    <finalName>test-api</finalName>
    <plugins>
    <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>2.5.0</version>
    </plugin>
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>3.3.1</version>
    <configuration>
    <!--如果想在没有web.xml文件的情况下构建WAR,请设置为false。-->
    <failOnMissingWebXml>false</failOnMissingWebXml>
    </configuration>
    </plugin>
    </plugins>
    </build>
    </project>
  • yml: 建两个配置文件testprod, 配置不同的参数, 测试负载均衡

    # 其实一个配置文件打包时候改参数内容就行, 意思都一样,
    # 只是模仿, 分文件还可以通过日志查看哪个配置文件生效了
    # application.yml
    spring:
    profiles:
    active: test
    # application-test.yml
    name: test
    # application-prod.yml
    name: prod
  • Application: 启动类, 配置自动启动

    package org.example;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
    /**
    * @author codor
    * @date 2023/03/13 14:22
    */
    @SpringBootApplication
    public class TestApplication extends SpringBootServletInitializer {
    public static void main(String[] args) {
    SpringApplication.run(TestApplication.class, args);
    }
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
    return builder.sources(TestApplication.class);
    }
    }
  • controller: 写一个接口读配置文件信息

    package org.example.controller;
    import cn.hutool.core.date.DatePattern;
    import cn.hutool.core.date.DateUtil;
    import cn.hutool.extra.spring.SpringUtil;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import java.util.Date;
    /**
    * @author codor
    * @date 2023/03/13 14:24
    */
    @RestController
    @RequestMapping("/test")
    public class TestController {
    @RequestMapping("/time")
    public String time() {
    return SpringUtil.getProperty("name") +
    ": " +
    DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MS_PATTERN);
    }
    }
  • 修改application.yml中激活文件打testprod的两个包修改两个tomcat中的webapps下, 会自动解压部署.

  • 访问各自端口下返回的内容中分别对应着testprod即为正常

4. 测试nginx

  • 访问http://127.0.0.1:8088/test-api/test/time

  • 反复刷新得到结果中有testprod即为正常, 默认的负载均衡机制应该是轮播.

  • 关闭8090的tomcat: ./tomcat8090/bin/shutdown.sh

  • 再次刷新, 结果只有test的结果为正常.

  • 再次启动8090的tomcat

  • 刷新结果中则恢复之前的情况

    如果tomcat8090中的包关闭后, 刷新会导致一次test一次404

5. 另外一种配置[补充]

上面的配置方法是将当前的转发到不同机器上, 需要在不同机器上都可以处理相同的请求, 如果只需要配置转发

worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8080;
server_name localhost;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# 指定前端根目录资源位置
location / {
root /home/project-name/admin-web/;
index index.html index.htm;
fastcgi_buffers 256 128k;
chunked_transfer_encoding off;
try_files $uri $uri/ /index.html;
}
## 将以/api/开头接口的转发到8088接口
location /api/ {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8088/;
}
# 开头匹配, 如果与上面/api冲突, 比如/pc/user/api/page, 会生效这个, 因为是开头精确匹配
location ^~ /pc/ {
proxy_pass http://127.0.0.1:8080/admin-pc/;
}
}
}

6. location规则

image

7. https配置

记得配置时候需要带上ssl模块./configure --with-http_ssl_module, 如果安装过程中忘记了, 可以重新配置,编译安装.
nginx.conf配置文件最后有https的样例(如下), 将其中的ssl_certificatessl_certificate_key改成自己的SSL证书路径私钥路径即可.

# HTTPS server
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /usr/local/nginx/ssl/codor.xyz.pem;
ssl_certificate_key /usr/local/nginx/ssl/codor.xyz.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}

此次记录只是nginx入门简单使用, 作为笔记记录.

原理, 安装, 整合

8. 内网代理高德

内网代理高德的逻辑:
整体逻辑: 访问in-ip/gaode-map -> 跳转到out-ip -> 高德服务器
地址方面: 拦截/maps, 对结果js中所有高德的host都改成in-ip/gaode-map/

  • 前端引入<script src="http://in-ip:port/gaode-map/maps?v=2.0&key=your-key></script>
  • 配置需要: 如果安装过程中忘记了, 可以重新配置,编译安装, 只需要在可以访问外网的服务器引入模块.
    • ssl模块: ./configure --with-http_ssl_module(https配置, 代理的https也算)
    • subs_filter: --with-http_sub_module(过滤结果内容 / 结果内容替换 / cdn优化等等)
    • ./configure --with-http_ssl_module --with-http_sub_module
  • 需要在内网部署一台可以访问外网的服务器out-ip:port, 只需要内网可以访问到这个服务器即可, 这个服务器不需要可以访问到内网
  • 内网的应用服务器in-ip:in-port上部署一个nginx可以使用特定接口(如果之前用到了nginx, 可以添加固定的前缀, 比如gaode-map)跳转到out-ip:port
    location /gaode-map/ {
    proxy_pass http://out-ip:port/;
    }
  • 然后在可以访问外网的服务器的nginx中配置
    配置文件: nginx.conf
    #user nobody;
    worker_processes 1;
    #error_log logs/error.log;
    #error_log logs/error.log notice;
    #error_log logs/error.log info;
    #pid logs/nginx.pid;
    events {
    worker_connections 1024;
    }
    http {
    include mime.types;
    default_type application/octet-stream;
    #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    # '$status $body_bytes_sent "$http_referer" '
    # '"$http_user_agent" "$http_x_forwarded_for"';
    #access_log logs/access.log main;
    sendfile on;
    #tcp_nopush on;
    #keepalive_timeout 0;
    keepalive_timeout 65;
    #gzip on;
    server {
    listen 8080;
    server_name localhost;
    #add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Headers X-Requested-With;
    add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
    location / {
    proxy_pass http://webapi.amap.com/;
    #proxy_pass http://59.82.39.57/;
    }
    location /restapi/ {
    proxy_pass https://restapi.amap.com/;
    }
    location /webapi/ {
    proxy_pass https://webapi.amap.com/;
    }
    location /lbs/ {
    proxy_pass http://lbs.amap.com/;
    }
    location /vector/ {
    proxy_pass http://vector.amap.com/;
    }
    location /vdata/ {
    proxy_pass https://vdata.amap.com/;
    }
    location /vdata01/ {
    proxy_pass https://vdata01.amap.com/;
    }
    location /vdata02/ {
    proxy_pass https://vdata02.amap.com/;
    }
    location /vdata03/ {
    proxy_pass https://vdata03.amap.com/;
    }
    location /vdata04/ {
    proxy_pass https://vdata04.amap.com/;
    }
    location /wprd01/ {
    proxy_pass https://wprd01.is.autonavi.com/;
    }
    location /wprd02/ {
    proxy_pass https://wprd02.is.autonavi.com/;
    }
    location /wprd03/ {
    proxy_pass https://wprd03.is.autonavi.com/;
    }
    location /wprd04/ {
    proxy_pass https://wprd04.is.autonavi.com/;
    }
    location /webst01/ {
    proxy_pass https://webst01.is.autonavi.com/;
    }
    location /webst02/ {
    proxy_pass https://webst02.is.autonavi.com/;
    }
    location /webst03/ {
    proxy_pass https://webst03.is.autonavi.com/;
    }
    location /webst04/ {
    proxy_pass https://webst04.is.autonavi.com/;
    }
    location /webrd01/ {
    proxy_pass https://webrd01.is.autonavi.com/;
    }
    location /webrd02/ {
    proxy_pass https://webrd02.is.autonavi.com/;
    }
    location /webrd03/ {
    proxy_pass https://webrd03.is.autonavi.com/;
    }
    location /webrd04/ {
    proxy_pass https://webrd04.is.autonavi.com/;
    }
    #代理获取js api文件并修改文件内容
    location /maps/ {
    proxy_set_header Accept-Encoding "";
    proxy_pass http://webapi.amap.com/maps;
    sub_filter_types '*';
    sub_filter_once off;
    sub_filter 'webapi.amap.com' 'in-ip:port/gaode-map/webapi';
    sub_filter 'restapi.amap.com' 'in-ip:port/gaode-map/restapi';
    sub_filter 'vdata.amap.com' 'in-ip:port/gaode-map/vdata';
    sub_filter '{vdata,vdata01,vdata02,vdata03,vdata04}.amap.com' 'in-ip:port/gaode-map/{vdata,vdata01,vdata02,vdata03,vdata04}';
    sub_filter 'vdata0{1,2,3,4}.is.autonavi.com' 'in-ip:port/gaode-map/vdata0{1,2,3,4}';
    sub_filter 'wprd0{1,2,3,4}.is.autonavi.com' 'in-ip:port/gaode-map/wprd0{1,2,3,4}';
    sub_filter 'webst0{1,2,3,4}.is.autonavi.com' 'in-ip:port/gaode-map/webst0{1,2,3,4}';
    sub_filter 'webrd0{1,2,3,4}.is.autonavi.com' 'in-ip:port/gaode-map/webrd0{1,2,3,4}';
    }
    }
    }
  • 参考

9. 访问速度优化

在使用过程中遇到访问比较慢的情况, 可以着手从以下几中情况进行优化

  • worker_processes: 定义 Nginx 启动的 worker 进程数, 默认1, 一般配置和CPU 核心数一样, 通过lscpu查看CPU(s)
  • worker_connections: 定义了每个 worker 进程能够同时处理的最大连接数, 默认1024, 根据自己服务器性能, 不易过大.
  • 全局缓存
    • 定义, http节点内, 与sever同级: proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;`
      • /path/to/cache, 需要缓存的到的路径, 如: /var/nginx/cache
      • levels=1:2: 这是用于组织缓存文件的目录结构的配置。在这个例子中,缓存文件将被组织在两个层次的子目录中,每个子目录有一个字符。这有助于防止在一个目录中拥有太多文件。
      • keys_zone=my_cache:10m: 这定义了缓存区域的名称和大小。my_cache 是缓存区域的名称,而 10m 指定了用于存储缓存键和元数据的内存大小。
      • max_size=10g: 这定义了缓存区域的最大磁盘存储大小。
      • inactive=60m: 缓存文件将在 60 分钟内没有被访问时被认为是不活跃并可能会被删除。
      • use_temp_path=off: 这将临时路径选项设置为关闭。
    • 使用, server内, 与listen同级, 所有location都会共享
      http {
      # 全局缓存设置
      proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
      server {
      listen 8080;
      server_name localhost;
      # 添加 CORS 头
      add_header Access-Control-Allow-Origin *;
      add_header Access-Control-Allow-Headers X-Requested-With;
      add_header Access-Control-Allow-Methods GET, POST, OPTIONS;
      # 全局缓存配置
      proxy_cache my_cache;
      proxy_cache_valid 200 302 10m;
      proxy_cache_valid 404 1m;
      proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
      location / {
      # 代理请求到后端服务器
      proxy_pass http://webapi.amap.com/;
      }
      # 其他 location 配置(共享全局缓存设置)
      location /restapi/ {
      proxy_pass https://restapi.amap.com/;
      }
      # ... 其他 location 配置
      }
      # 其他 server 配置
      }
  • SSL Session Resumption
    使用 SSL Session Resumption 可以显著减少 SSL 握手的时间开销,因为它允许客户端和服务器在之前的会话上复用密钥材料,避免了重新执行完整的握手过程。
    • Session Cache , 在http块中添加以下配置,用于启用会话缓存和设置会话缓存的参数。
    http {
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    # 其他 http 配置
    }
  • Session Tickets, 启用 Session Tickets 可以进一步提高 SSL 握手的性能。在 server 块中添加: ssl_session_tickets on;
  • 转发请求的大小限制, 可配置在http下(全局), 也可以配置server内(局部, 大于全局, 会覆盖全局)
    • client_max_body_size: 请求体大小限制, 默认0(无限制)
    • client_body_buffer_size: 默认8k, 用于保存客户端请求体的临时缓冲区的大小.

10. 绿盟扫描安全

11. 502(缓存问题)

12. 转发字节流(导出)失败问题

  • http下添加:
    client_max_body_size 1024m; # 最大请求体
    proxy_send_timeout 300s; # 发送超时
    proxy_read_timeout 300s; # 读取超时
  • server内添加:
    proxy_buffering off; # 禁用代理缓冲
    proxy_buffer_size 128k; # 全局缓冲区大小
    proxy_buffers 4 256k;
    proxy_busy_buffers_size 256k;
    proxy_set_header Connection ""; # 移除连接头
    proxy_http_version 1.1; # 指定http版本
posted @   Codorld  阅读(356)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示
目录导航
ngix安装与使用(代理内网访问高德)
1. nginx安装(linux为例)
2. tomcat安装
3. 创建一个测试项目
4. 测试nginx
5. 另外一种配置[补充]
6. location规则
7. https配置
8. 内网代理高德
9. 访问速度优化
10. 绿盟扫描安全
11. 502(缓存问题)
12. 转发字节流(导出)失败问题