Nginx:Nginx配置域名( https+证书 )代理转发

前言

  做过域名申请的应该都知道,域名申请要各种材料备案、挑选域名等各类复杂的流程,重要的是公司业务多的话每个网站申请域名实在是不划算,所以我们可以通过Nginx做代理转发就可以省去很多没必要的麻烦和流程就能做到将多个服务挂到外网的能力。

安装Nginx服务

安装Nginx服务的过程可以查看这篇文章

安装完成后,我们重点配置的文件在 /usr/local/nginx/conf/nginx.conf

存储证书

我在 /usr/local/nginx/conf 下创建 ssl 目录用于存储证书,方便引用和查找

配置代理转发

编辑 /usr/local/nginx/conf/nginx.conf 配置文件,配置代理转发

user root;

worker_processes  2;
#worker_cpu_affinity 01 10;
#error_log  logs/error.log;
#pid        /app/nginx/conf/nginx.pid;
#worker_rlimit_nofile 65535;

events {
    use epoll;
    worker_connections  10240;
}

http {
    # --起始;这个是基础配置,可以直接复制不用修改
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens off;
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_comp_level 2;
    gzip_types  text/css text/xml application/javascript application/atom+xml application/rss+xml text/plain application/json application/x-javascript application/xml text/javascript;
    gzip_disable "MSIE [0-6]\.";
    gzip_vary on;

    server_names_hash_bucket_size 128;
    client_header_buffer_size 1k;
    large_client_header_buffers 4 8k;
    client_max_body_size 6G;
    client_body_timeout  5;
    client_header_timeout 20;

    open_file_cache max=65535 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;

    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;

    proxy_http_version 1.1;
    proxy_buffer_size 16k;
    proxy_buffers 8 1M;
    proxy_busy_buffers_size 2M;
    rewrite_log on;
    proxy_connect_timeout 600s;
    #proxy_connect_read_timeout 600s;
    #proxy_connect_send_timeout 600s;
    client_body_buffer_size  512k;
    proxy_max_temp_file_size 5120m;
    proxy_temp_file_write_size 1M;
    proxy_buffering    off;
    proxy_request_buffering off;

    #proxy_temp_path   /app/servers/nginx/proxy_temp;
    #proxy_cache_path  /app/servers/nginx/proxy_temp/cache levels=2:2:2   keys_zone=cache_go:200m inactive=5d max_size=7g;

    # 限流(防刷),平均速率1秒10条
    limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;

    #log_format  access  '$time_iso8601|$http_x_forwarded_for|$remote_addr|$http_host|$request_time|'
    #                '$upstream_response_time|"$request"|$status|$body_bytes_sent|$request_length|'
    #                '"$http_referer"|"$http_user_agent"|$upstream_addr|"$http_cookie"| $upstream_cache_status |';

    #access_log  logs/access_http.log  access;
    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;
    keepalive_timeout  65;
    send_timeout       600;
    # --结束;这个是基础配置,可以直接复制不用修改


    # 配置WSS使用
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }

    # 配置upstream模块,需要转发的内网IP和端口地址
    upstream a_server_web {
            server 198.16.0.100:9200  max_fails=3 fail_timeout=30s;
    }

    upstream b_server_web {
            server 198.16.0.128:9300  max_fails=3 fail_timeout=30s;
    }

    upstream c_server_web {
            server 198.16.0.99:9400  max_fails=3 fail_timeout=30s;
    }


    # 这个是默认的http配置,不用改动(具体看项目需求,这里只做https的教程)
    server {
        listen       80;
        server_name  localhost;

        rewrite ^(.*)$  https://$host$1 permanent;

        #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;
        }
    }
    server {
        listen      8002;
        server_name  localhost;
        # 隐藏 Nginx 版本号
        server_tokens off;
        # 安全头部设置
        # 禁止被 <iframe> 嵌入,仅同源允许
        add_header X-Frame-Options "SAMEORIGIN" always;
        # 旧浏览器 XSS 过滤器触发时直接阻断页面
        add_header X-XSS-Protection "1; mode=block" always;
        # 禁用 MIME 嗅探,减少“下载为脚本”类攻击
        add_header X-Content-Type-Options "nosniff" always;
        # 降级到 HTTP 时不发 Referer,平衡安全与统计
        add_header Referrer-Policy "no-referrer-when-downgrade" always;
        # 默认只允许同源资源,禁止内联 JS/事件('unsafe-inline' 已放开,需按业务收紧)
        add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;

        location / {
            # 需在 http 层事先声明,如 limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
            # 瞬间允许 20 个“欠账”请求,nodelay 表示这 20 个也立即处理(不延迟)
            limit_req zone=api_limit burst=20 nodelay;            
            # web地址
            proxy_pass http://172.17.3.93:4027/;
            # 基础请求头配置
            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_set_header X-Forwarded-Proto $scheme;
        }

    }

    # 配置a_server、b_server的https代理转发
    server {
        # 指定SSL访问端口,用于域名申请时映射的端口
        listen       8100 ssl;
        # 隐藏 Nginx 版本号
        server_tokens off;
        # 配置域名+端口地址
        server_name  ttcs.wser.com:12510;

        # 域名的SSL证书
        ssl_certificate /usr/local/nginx/conf/ssl/ttcs.wser.com.pem;
        # 域名的SSL私钥
        ssl_certificate_key /usr/local/nginx/conf/ssl/ttcs.wser.com.key;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;

        root html;
        index index.html index.htm;


        # a_server-小程序接口,小程序不能用路由分转接口,所以每个域名只能对应一个无路由的后端接口提供给单个小程序使用
        location / {
            # 这个转接的是内网服务a_server服务的后端统一网关端口
            proxy_pass http://198.16.0.100:9201/;
        }

        # a_server-前端
        location /a_web/ {
             proxy_http_version 1.1;
             proxy_set_header Upgrade $http_upgrade;
             proxy_set_header Connection "upgrade";
             proxy_set_header X-real-ip $remote_addr;
             proxy_set_header Host $host;
             proxy_buffering off;
             # 这里的路径就是上面配置的upstream模块
             proxy_pass  http://a_server_web/;
        }

        # a_server-静态资源,这个配置是前端的静态图片之类的文件
        # 这里需要前端配合将生成的静态资源文件夹(默认为assets)改为 a_static
        location ~* ^/a_static/.*\.(gif|jpg|jpeg|bmp|png|svg|ico|otf|ttf|txt|js|css)$ {
            proxy_pass http://a_server_web;
            expires      12h;
        }

        # a_server-后端,通过这个访问地址可以进行上传文件之类的操作
        # 这里需要前端配合将调用后端的路由api改成b_api
        # 同时,在内网使用Nginx部署前端服务时,调用后端的路由解析也应该是 b_api
        location ^~ /a_api/ {
            # 这里是后端的统一网关端口
            proxy_pass http://198.16.0.100:9201/;
        }


        # b_server-前端
        location /b_web/ {
             proxy_http_version 1.1;
             proxy_set_header Upgrade $http_upgrade;
             proxy_set_header Connection "upgrade";
             proxy_set_header X-real-ip $remote_addr;
             proxy_set_header Host $host;
             proxy_buffering off;
             # 这里的路径就是上面配置的upstream模块
             proxy_pass  http://b_server_web/;
        }

        # b_server-静态资源,这个配置是前端的静态图片之类的文件
        # 这里需要前端配合将生成的静态资源文件夹(默认为assets)改为 b_static
        location ~* ^/b_static/.*\.(gif|jpg|jpeg|bmp|png|svg|ico|otf|ttf|txt|js|css)$ {
            proxy_pass http://b_server_web;
            expires      12h;
        }

        # b_server-后端,通过这个访问地址可以进行上传文件之类的操作
        # 这里需要前端配合将调用后端的路由api改成b_api
        # 同时,在内网使用Nginx部署前端服务时,调用后端的路由解析也应该是 b_api
        location ^~ /b_api/ {
            # 这里是后端的统一网关端口
            proxy_pass http://198.16.0.128:9301/;
        }
    }

    # 配置c_server的https代理转发
    server {
        # 指定SSL访问端口,用于域名申请时映射的端口
        listen       8200 ssl;
        # 配置域名+端口地址
        server_name  lttc.wser.com:11880;

        # 域名的SSL证书
        ssl_certificate /usr/local/nginx/conf/ssl/lttc.wser.com.pem;
        # 域名的SSL私钥
        ssl_certificate_key /usr/local/nginx/conf/ssl/lttc.wser.com.key;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;

        root html;
        index index.html index.htm;


        # c_server-前端
        location /c_web/ {
             proxy_http_version 1.1;
             proxy_set_header Upgrade $http_upgrade;
             proxy_set_header Connection "upgrade";
             proxy_set_header X-real-ip $remote_addr;
             proxy_set_header Host $host;
             proxy_buffering off;
             # 这里的路径就是上面配置的upstream模块
             proxy_pass  http://c_server_web/;
        }

        # c_server-静态资源,这个配置是前端的静态图片之类的文件
        # 这里需要前端配合将生成的静态资源文件夹(默认为assets)改为 c_static
        location ~* ^/c_static/.*\.(gif|jpg|jpeg|bmp|png|svg|ico|otf|ttf|txt|js|css)$ {
            proxy_pass http://c_server_web;
            expires      12h;
        }

        # c_server-后端,通过这个访问地址可以进行上传文件之类的操作
        # 这里需要前端配合将调用后端的路由api改成c_api
        # 同时,在内网使用Nginx部署前端服务时,调用后端的路由解析也应该是 c_api
        location ^~ /c_api/ {
            # 这里是后端的统一网关端口
            proxy_pass http://198.16.0.99:9401/;
        }

        # c_server-后端WebSocket,因为是https所有要使用wss做链接
        location ^~ /c_wss/ {
            proxy_http_version 1.1;
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_read_timeout 36000s;
            proxy_send_timeout 36000s;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Host $server_name;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            # 这里是具体后端模块的端口+路由进行访问
            proxy_pass http://198.16.0.99:9304/c_wss/;
        }
    }

}

使用命令 " systemctl reload nginx " 重新加载Nginx配置。

访问域名测试

image

posted @ 2025-02-08 15:43  怒吼的萝卜  阅读(927)  评论(0)    收藏  举报