GCP + Nginx实战部署与配置 + HTTPS

张开发
2026/4/21 1:23:36 15 分钟阅读

分享文章

GCP + Nginx实战部署与配置 + HTTPS
一、什么是NginxNginx是一款开源的高性能Web 服务器软件同时兼具反向代理、负载均衡、HTTP 缓存和邮件代理等多种核心功能。Nginx 采用了异步非阻塞的事件驱动模型epoll使其能够以极低的系统资源消耗处理海量并发连接。作为 Web 服务器快速将 HTML、图片、CSS 等静态资源交付给用户浏览器保障页面高速加载作为反向代理隐藏后端服务器集群结构接收客户端请求后智能转发至后端应用服务器如 Java、Python 应用再将处理结果返回客户端提升系统安全性与响应速度作为负载均衡器将高并发请求均匀分发至多台后端服务器避免单点过载保障服务高可用与扩展性作为 HTTP 缓存缓存后端高频访问响应直接返回缓存结果减少后端服务器压力。二、Nginx核心特性深度解析2.1 高性能极速响应的技术内核核心含义以极低延迟处理客户端请求并返回响应尤其擅长静态资源分发。技术原理事件驱动架构采用 “主进程 多工作进程” 模式主进程负责管理配置与工作进程工作进程处理实际请求避免多进程上下文切换开销异步非阻塞 I/O工作进程处理请求时若需等待如磁盘读写、后端响应不会阻塞等待而是立即处理其他就绪请求待数据准备完成后再回溯处理类似高效服务员同时服务多桌客人高效系统调用处理静态文件时使用sendfile系统调用直接在内核缓冲区传输数据避免用户态与内核态的冗余拷贝大幅提升传输效率。实际效果静态资源响应速度毫秒级支撑高并发场景下的快速访问体验。2.2 高并发万级连接的处理能力核心含义单机可稳定支撑数万甚至数十万并发网络连接轻松应对高流量场景。技术原理“单进程多连接” 模型每个工作进程通过事件循环机制在单个线程内管理成千上万个连接突破传统 “一连接一进程” 的资源限制极低连接内存占用每个连接仅占用数百字节内存远低于线程模型的栈内存分配可在有限内存下支撑海量连接。实际效果完美解决 C10K 乃至 C100K 问题成为电商秒杀、直播带货等超高并发场景的首选服务器。2.3 低内存占用轻量稳定的资源控制核心含义相同负载下内存占用远低于传统 Web 服务器保障系统长期稳定运行。技术原理精简进程模型固定数量的工作进程内存占用稳定不会随连接数增加线性增长高效内存管理内置内存池与优化数据结构减少频繁内存分配 / 释放避免内存碎片产生。实际效果降低服务器硬件配置要求减少内存耗尽导致的崩溃风险提升服务稳定性。2.4 反向代理后端服务的“安全网关”核心含义作为客户端与后端服务器的中间层代理转发请求与响应隔离客户端与后端架构。核心价值安全防护隐藏后端服务器 IP 与结构避免直接暴露在公网降低攻击风险SSL 终结集中处理 HTTPS 加密 / 解密工作减轻后端服务器 CPU 负载动静分离静态请求图片、CSS由 Nginx 直接处理动态请求PHP、Java转发至应用服务器优化资源分配缓存加速缓存后端响应结果重复请求直接返回缓存提升访问速度。2.5 负载均衡集群调度的 “智能中枢”核心含义将客户端请求按策略分发至多台后端服务器实现负载分担保障服务高可用。核心价值高可用自动检测后端服务器状态故障节点自动剔除流量转发至健康节点扩展性通过增加后端服务器实现水平扩展无需修改前端配置性能优化分散单节点负载避免单点瓶颈提升整体处理能力。常用调度算法轮询按顺序依次分发请求适用于后端服务器性能一致场景加权轮询按服务器性能分配权重高性能节点接收更多请求最少连接将请求转发至当前连接数最少的节点动态适应负载差异IP 哈希基于客户端 IP 计算哈希值固定分发至同一节点保障会话持久性。2.6 nginx模块核心模块是 Nginx 服务器正常运行必不可少的模块提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能标准HTTP模块提供 HTTP 协议解析相关的功能比如 端口配置 、 网页编码设置 、 HTTP响应头设置 等等可选HTTP模块主要用于扩展标准的 HTTP 功能让 Nginx 能处理一些特殊的服务比如Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等邮件服务模块主要用于支持 Nginx 的 邮件服务 包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持Stream服务模块: 实现反向代理功能,包括TCP协议代理 反向第三方模块是为了扩展 Nginx 服务器应用完成开发者自定义功能比如 Json 支持、 Lua 支持等三、Nginx实战部署与配置3.1 环境部署CentOS Stream 10第一步环境准备。关闭安全组件避免干扰Nginx安装与运行# 临时关闭SELinux sudo setenforce 0 # 永久禁用selinux需重启生效 sed -i s/SELINUXenforcing/SELINUXdisabled/ /etc/selinux/config # 禁用防火墙并设置开机不自启 sudo systemctl disable --now firewalld # 注意: 如果用的是云服务器如 GCP, 阿里云, 腾讯云云平台控制台还有一个 “安全组Network SG”。如果安全组没开 80 端口即便你关了系统的 firewalld外面还是连不上。第二步更换国内镜像源# 备份现有源 sudo mkdir /etc/yum.repos.d/bak sudo mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/ # 下载新的源配置文件使用的系统版本较新阿里云还没给centos 10准备好特定的.repo下载链接现在我手动配置阿里云镜像源 # sudo curl -o /etc/yum.repos.d/CentOS-Stream.repo https://mirrors.aliyun.com/repo/Centos-stream-10.repo # 创建文件 sudo vim /etc/yum.repos.d/aliyun.repo [baseos] nameCentOS Stream 10 - BaseOS - aliyun baseurlhttps://mirrors.aliyun.com/centos-stream/10-stream/BaseOS/x86_64/os/ gpgcheck1 enabled1 gpgkeyhttps://mirrors.aliyun.com/centos-stream/RPM-GPG-KEY-CentOS-Official [appstream] nameCentOS Stream 10 - AppStream - aliyun baseurlhttps://mirrors.aliyun.com/centos-stream/10-stream/AppStream/x86_64/os/ gpgcheck1 enabled1 gpgkeyhttps://mirrors.aliyun.com/centos-stream/RPM-GPG-KEY-CentOS-Official # 禁用官方源避免冲突。给他改个名字 sudo mv /etc/yum.repos.d/centos.repo /etc/yum.repos.d/centos.repo.bak # 刷新缓存 sudo dnf clean all sudo dnf makecache # 安装扩展源 sudo dnf install -y epel-release sudo dnf makecache第三步安装Nginxsudo dnf install nginx -y # 确认安装结果 nginx -v第四步管理Nginx服务# 启动服务 sudo systemctl start nginx # 设置开机自启 sudo systemctl enable nginx # 查看服务运行状态 sudo systemctl status nginx第五步配置防火墙即使nginx运行正常如果防火墙没打开80端口外部浏览器也访问不了。# 允许HTTP流量80端口 sudo firewall-cmd --permanent --add-servicehttp # 允许HTTPS流量443端口 sudo firewall-cmd --permanent --add-servicehttps # 重新加载防火墙配置使其生效 sudo firewall-cmd --reload3.2Nginx核心文件位置主配置文件/etc/nginx/nginx.conf自定义配置文件存放地/etc/nginx/conf.d/默认网页存放目录/usr/share/nginx/html/访问日志/var/log/nginx/access.log错误日志/var/log/nginx/error.log3.3主配置文件解析请求生命周期请求进来 - 匹配Server - 匹配Location - 转发/处理 - 返回# 1. 全局配置段影响整个Nginx服务 user nginx; # 运行Nginx的用户 worker_processes auto; # 工作进程数自动适配CPU核心数 error_log /var/log/nginx/error.log warn; # 错误日志路径与级别 # 2. 事件模块配置网络连接相关主要影响nginx服务器与用户的网络连接 events { worker_connections 1024; # 每个工作进程最大连接数 use epoll; # 使用epoll事件驱动模型Linux最优选择 } # 3. HTTP模块配置HTTP协议相关 http { # 定义访问日志的打印格式access_log使用 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 /var/log/nginx/access.log main; # 访问日志启用 include /etc/nginx/conf.d/*.conf; # 引入子配置文件 # default_type默认传输的文件类型如application/octet-stream # sendfile on开启高效文件传输模式 # 4. 虚拟主机配置单个服务实例 server { listen 80; # 监听端口HTTP默认80 server_name localhost; # 绑定域名/IP root /usr/share/nginx/html; # 网页根目录 index index.html index.htm; # 默认首页文件 # 5. 路径匹配配置URI请求处理 location / { allow all; # 允许所有IP访问 try_files $uri $uri/ /index.html; # 尝试匹配静态文件不存在则返回首页 } # 错误页面配置 error_page 404 /404.html; # 404错误返回页面 error_page 500 502 503 504 /50x.html; # 服务器错误返回页面 } } ----------------------------------------------------------分割线以下内容为http块补充内容 # Upstream块负载均衡 # 用于定义一组后端服务器实现负载均衡 upstream my_backend { server 192.168.1.10:8080 weight2; # 权重 server 192.168.1.11:8080; ip_hash; # 同一IP转发到固定服务器解决Session问题 } # Server块虚拟主机 # 一个http块可以包含多个server块。每个server块代表一个独立的网站或服务。 listen监听的端口 server_name域名 # Location块路由匹配 # 这是server块内部最核心的部分决定了nginx如何根据请求的URI路径来处理请求。 处理逻辑 静态处理通过root或alias指定本地磁盘路径直接返回文件 动态转发通过proxy_pass将请求转发给后端的Tomcat/PHP/Python。 # root会把location的路径拼接到后面而alias则是直接替换。 server { listen 80; server_name www.kgc.com; location /nwes { root /data/nginx/html/pc/; #相当于追加将文件夹news追加到/data/nginx/html/pc/news } location /study{ alias /mnt/nginx/sports/; #相当于替换你访问study就是访问/mnt/nginx/sports } }3.4 location匹配在一个server中location配置段可存在多个用于实现从url到文件系统的路径映射ngnix会根据用户请求的url来检查定义的所有location按一定的优化级找出一个最佳匹配而后应用其配置在没有使用正则表达式的时候nginx会先在server中的多个location选取匹配度最高的一个urlurl是用户请求的字符串即域名后面的web文件路径然后使用该location模块中的正则url和字符串如果匹配成功就结束搜索并使用此location处理此请求。语法规则##语法规则 location [ | ~ | ~* | ^~ ] uri { ... } #用于标准url前需要请求字串与url精确匹配大小敏感,如果匹配成功就停止向下匹配并立即处理请求 ^~ #用于标准url前表示包含正则表达式,并且匹配以指定的正则表达式开头,对url的最左边部分做匹配检查不区分字符大小写 ~ #用于标准url前表示包含正则表达式,并且区分大小写 ~* #用于标准url前表示包含正则表达式,并且不区分大写 不带符号 #匹配起始于此url的所有的url #\ #用于标准url前表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号 #匹配优先级从高到低 , ^~, ~/~*, 不带符号四、虚拟主机配置实战虚拟主机允许单台Nginx服务器托管多个网站按配置维度分为三类4.1 基于域名的虚拟主机最常用通过不同域名区分网站需配置 DNS 解析或本地 hosts 映射配置文件/etc/nginx/conf.d/domain-host.conf# 域名www.abc.com对应的网站 server { listen 80; server_name www.abc.com; root /www/abc; index index.html; } # 域名www.def.com对应的网站 server { listen 80; server_name www.def.com; root /www/def; index index.html; }配置本地 hosts 映射Linux/etc/hostsWindowsC:\Windows\System32\drivers\etc\hosts34.92.187.50 www.abc.com www.def.com创建测试文件并生效sudo mkdir -p /www/{abc,def} sudo echo Domain: www.abc.com /www/abc/index.html sudo echo Domain: www.def.com /www/def/index.html sudo nginx -t sudo systemctl restart nginx4.2 基于端口的虚拟主机通过不同端口区分网站无需额外 IP配置文件/etc/nginx/conf.d/port-host.conf# 端口10001对应的网站 server { listen 10001; server_name 34.92.187.50; root /www/port10001; index index.html; } # 端口10002对应的网站 server { listen 10002; server_name 34.92.187.50; root /www/port10002; index index.html; }创建测试文件并生效sudo mkdir -p /www/port{10001,10002} sudo echo Port: 10001 | sudo tee /www/port10001/index.html sudo echo Port: 10002 | sudo tee /www/port10002/index.html sudo nginx -t sudo systemctl restart nginx访问验证http://34.92.187.50:10001、http://34.92.187.50:10002#注意 关系到端口问题需要考虑到防火墙规则由于使用的是云平台GCP所以防火墙规则上需要允许10001、10002端口。经过测试GCP上的防火墙规则起主导作用服务器的防火墙的开关不影响端口的访问。4.3 基于IP的虚拟主机通过不同 IP 地址区分网站需先为服务器配置多 IP# 为网卡添加额外IP以ens160为例 nmcli c modify ens160 ipv4.addresses 192.168.58.101/24 nmcli c modify ens160 ipv4.addresses 192.168.58.102/24 nmcli c up ens160 # 应用配置创建虚拟主机配置文件/etc/nginx/conf.d/ip-host.conf# 第一个虚拟主机IP192.168.58.101 server { listen 80; server_name 192.168.58.101; root /www/ip101; # 网站根目录 index index.html; } # 第二个虚拟主机IP192.168.58.102 server { listen 80; server_name 192.168.58.102; root /www/ip102; index index.html; }创建网站目录与测试文件mkdir -p /www/ip{101,102} echo This is 192.168.58.101 /www/ip101/index.html echo This is 192.168.58.102 /www/ip102/index.html nginx -t # 验证配置 systemctl restart nginx # 重启生效五、HTTPS配置加密通信5.1 HTTPS 工作流程HTTPS 通过 SSL/TLS 协议实现加密通信核心流程1.客户端发送ClientHello携带支持的协议版本、加密算法列表 2.服务器返回ServerHello确认协议版本、选择加密算法并发送 SSL 证书 3.密钥交换客户端验证证书合法性生成会话密钥并通过证书公钥加密发送给服务器 4.加密通信双方使用会话密钥对称加密传输数据保障安全性。5.2 生成SSL证书自签名测试用# 创建证书存放目录 mkdir -p /etc/nginx/certs cd /etc/nginx/certs # 生成私钥无密码 openssl genrsa -nodes 2048 server.key # 生成自签名证书有效期365天 openssl req -new -x509 -days 365 -key server.key -out server.crt \ -subj /CCN/STBeijing/LBeijing/OTest/OUIT/CNwww.test.com/emailAddresstesttest.com5.3 HTTPS服务器配置创建配置文件/etc/nginx/conf.d/https.conf# HTTPS服务配置 server { listen 443 ssl; # 监听443端口HTTPS默认端口 server_name www.test.com; root /www/https; index index.html; # SSL证书配置 ssl_certificate /etc/nginx/certs/server.crt; # 证书路径 ssl_certificate_key /etc/nginx/certs/server.key; # 私钥路径 # SSL优化配置 ssl_protocols TLSv1.2 TLSv1.3; # 支持的TLS版本 ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512; # 加密套件 } # HTTP重定向HTTPS强制加密访问 server { listen 80; server_name www.test.com; return 301 https://$host$request_uri; # 永久重定向 }配置 hosts 映射并生效echo 192.168.58.100 www.test.com /etc/hosts mkdir -p /www/https echo HTTPS Test Page /www/https/index.html nginx -t systemctl restart nginx访问验证https://www.test.com自签名证书需手动信任六、故障排查与监控6.1 日志分析Nginx 日志是故障排查的核心依据关键日志解析访问日志/var/log/nginx/access.log记录每个请求的来源 IP、时间、请求方法、状态码等示例192.168.58.1 - - [10/Oct/2024:14:30:00 0800] GET /index.html HTTP/1.1 200 123 https://www.test.com Mozilla/5.0... # 字段含义来源 IP - 用户名 [访问时间] 请求行 状态码 响应大小 referer 用户代理错误日志/var/log/nginx/error.log记录服务错误信息如配置错误、后端连接失败示例2024/10/10 14:35:00 [error] 1234#0: *5 connect() failed (111: Connection refused) while connecting to upstream # 含义连接后端服务器失败拒绝连接6.2 状态监控配置启用 Nginx 内置状态模块实时查看服务状态# 在http模块或server模块中添加 server { listen 8080; server_name localhost; location /nginx_status { stub_status on; # 启用状态监控 access_log off; # 关闭访问日志 allow 127.0.0.1; # 仅允许本地访问 deny all; # 拒绝其他IP } }重启 Nginx 后访问监控页面curl http://127.0.0.1:8080/nginx_status返回结果解析Active connections: 2 # 当前活跃连接数 server accepts handled requests 100 100 200 # 总接受连接数、处理连接数、总请求数 Reading: 0 Writing: 1 Waiting: 1 # 读取请求数、写入响应数、等待连接数6.3 常用排查命令# 验证配置文件语法 nginx -t # 查看Nginx进程 ps aux | grep nginx # 查看监听端口 netstat -lntup | grep nginx ss -lntup | grep nginx # 实时查看访问日志 tail -f /var/log/nginx/access.log # 实时查看错误日志 tail -f /var/log/nginx/error.log # 压力测试需安装httpd-tools ab -n 1000 -c 100 http://192.168.58.100/ # 1000个请求并发1006.4常用状态码403权限/索引文件缺失 404路径写错 502后端服务挂了 504后端响应超时

更多文章