Nginx服务器部署(Linux)

Nginx(发音为"engine x")是一款高性能的HTTP和反向代理服务器,同时也提供IMAP/POP3代理服务。它由俄罗斯程序员Igor Sysoev开发,以其高稳定性、丰富的模块化功能、低内存消耗和高并发处理能力而闻名。

Nginx概念

核心特点

Nginx的强大性能源于其精巧的设计:

  • 事件驱动与非阻塞架构:Nginx采用事件驱动(event-driven)和异步非阻塞I/O模型。这意味着它使用一个或少量工作进程(worker processes)就能同时处理成千上万的网络连接,而不会因为等待某个请求的I/O操作(如读取文件、与后端服务器通信)而阻塞,从而极大地提高了CPU利用率和并发处理能力。
  • 主从进程模型:Nginx运行时有一个主进程(Master Process) 和一个或多个工作进程(Worker Processes)。主进程负责加载配置、绑定端口和管理工作进程;工作进程则实际处理客户端的连接和请求。这种设计增强了稳定性和可扩展性——如果某个工作进程异常终止,主进程可以立即重启一个新的,保证服务不中断。
  • 低资源消耗:Nginx在设计和实现上非常注重效率,在空闲和高并发场景下都能保持较低的内存和CPU占用率。官方数据显示,保持一万个非活跃连接仅需约2.5MB内存。
  • 模块化设计:Nginx具有高度模块化的架构。其核心功能由各种模块实现,用户可以根据需要灵活选择和扩展功能,例如通过添加第三方模块来支持Lua脚本等。

应用场景

凭借其高性能和灵活性,Nginx在多种场景下发挥着关键作用:

  • 静态内容服务:Nginx极其擅长快速处理HTML、CSS、JavaScript、图片和视频等静态文件的请求,响应速度非常快。
  • 反向代理与负载均衡:这是Nginx最核心和广泛的应用之一。作为反向代理,它接收客户端的请求,然后根据配置的规则(如轮询、权重、IP哈希等算法)将请求分发到后端的多台应用服务器(这被称为负载均衡)。这样做可以隐藏真实服务器地址,提升系统的扩展性和可用性。
  • 动静分离:为了提升整体性能,通常将动态请求(需要程序处理的)和静态资源的请求分开。Nginx可以直接高效地处理静态请求,而将动态请求转发给后端的PHP、Python、Java等应用服务器处理,从而减轻后端服务器的压力。
  • API网关:在现代应用架构中,Nginx常被用作API网关,统一管理入口流量,实现API路由、认证、限流、日志记录等功能。
  • SSL/TLS终端:Nginx可以负责处理耗资源的HTTPS加密解密工作,为后端服务器提供一个明文的通信环境,简化后端配置。

Nginx服务器的部署

一个典型的Nginx服务器应用场景是用户终端的应用(Web或者手机App)需要获取图片资源而不部署在本地,那么Nginx就是一个很好的解决方案。下面介绍如何利用Nginx将图片部署在服务器(云)上

下面是在 Ubuntu 系统上部署 Nginx 作为图片服务器,使 /home/root/images 目录下的图片可以通过 URL 访问的详细步骤。这个过程主要分为安装 Nginx、配置 Nginx 以服务指定目录的图片,以及调整系统设置以确保外部可访问。

安装 Nginx

首先,你需要在 Ubuntu 系统上安装 Nginx。

  1. 更新软件包列表:打开终端,执行以下命令以确保软件包列表是最新的。

    sudo apt update
    
  2. 安装 Nginx:使用 apt 命令安装 Nginx 软件包。

    sudo apt install nginx
    

    系统可能会提示你确认安装,输入 y 并按回车继续 。

  3. 启动并启用 Nginx:安装完成后,Nginx 服务通常会自动启动。你可以通过以下命令检查其状态、设置它开机自动启动,并进行验证。

    sudo systemctl status nginx  # 检查运行状态,确认是否为active (running)
    sudo systemctl enable nginx  # 设置为开机自动启动
    

配置 Nginx 作为图片服务器

接下来,你需要修改 Nginx 的配置文件,告诉它如何提供 /home/root/images 目录下的图片文件。

  1. 创建网站根目录(如果必要):确保 /home/root/images 目录存在,并且其中有你要分享的图片文件。你可以使用以下命令创建该目录(如果不存在的话):

    sudo mkdir -p /home/root/images
    
  2. 设置目录权限:确保 Nginx 进程(通常以 www-data 用户身份运行)有权读取该目录。可以将目录的所有权更改给 www-data 用户,或者至少调整目录权限使其可被其他用户读取。一种相对安全的方法是将其所有者设为 www-data

    sudo chown -R www-data:www-data /home/root/images
    

    或者,确保目录至少有读和执行权限(例如 755),文件有读权限(例如 644)。

  3. 编辑 Nginx 配置文件

    • Nginx 的主要配置文件通常位于 /etc/nginx/nginx.conf,但站点特定的配置通常在 /etc/nginx/sites-available/ 目录下。默认的配置文件可能是 /etc/nginx/sites-available/default
    • 在编辑之前,建议备份原始文件。
    • 使用文本编辑器(如 vim)打开配置文件:
      sudo vim /etc/nginx/sites-available/default
      
  4. 修改服务器块(Server Block)配置:在配置文件中,找到 server 块,并对其进行修改或添加一个 location 块来处理图片路径。以下是一个基本的配置示例,假设你的服务器域名是 your-server-ip(请替换为你的服务器实际IP或域名),你希望通过 http://your-server-ip/images/ 来访问图片:

    server {
        listen 80;
        server_name your-server-ip; # 将 your-server-ip 替换为你服务器的实际IP或域名,如果通过IP访问,也可先设置为 _ 或省略
    
        # 设置图片文件的访问位置
        location / {
            # 指定图片文件在服务器上的实际根目录路径
            root /home/root/images/;
            
            # 开启自动索引功能,当目录中没有index.html时,显示文件列表(可选,根据需求)
            autoindex on;
            
            # 设置静态文件的缓存时间、禁用日志等(可选,用于优化)
            # 匹配常见的图片文件扩展名
            location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
                expires 30d; # 缓存30天
                add_header Cache-Control "public, immutable";
                access_log off; # 可选:关闭访问日志以减少磁盘写入
            }
        }
    }
    
    • 关键点:
      • listen 80; 表示服务器监听 HTTP 的 80 端口。
      • server_name 应设置为你的服务器IP或域名。如果暂时通过IP访问,可以设置为 _(通配符)或保持默认。
      • location / 块定义了当URL路径以 / 开头时的处理方式。
      • root /home/root/images/; 是最重要的指令,它将URL中的根目录映射到服务器文件系统的 /home/root/images/ 目录。确保路径以斜杠结尾。
      • autoindex on; 会在用户访问 / 时列出目录下的文件列表,方便浏览。如果不需要此功能,可以移除。
      • 针对图片文件的缓存和日志设置是可选的优化项,有助于提高性能 。
  5. 测试配置并重新加载 Nginx

    • 修改配置后,务必检查配置文件语法是否正确,这是非常重要的一步,可以避免因配置错误导致服务无法启动 。
      sudo nginx -t
      
      如果输出 syntax is oktest is successful,说明配置语法正确。
    • 如果测试成功,重新加载 Nginx 配置使其生效,无需重启整个服务:
      sudo systemctl reload nginx
      

配置防火墙和网络

为了让其他电脑能够访问,你需要确保服务器的防火墙允许 HTTP 流量(端口 80),并且网络设置正确。

  1. 配置防火墙(如果 UFW 已启用):Ubuntu 常用 UFW 防火墙。确保允许 Nginx HTTP 流量 。

    sudo ufw allow 'Nginx HTTP' # 或者明确允许端口80: sudo ufw allow 80
    

    可以使用 sudo ufw status 查看规则是否已添加。

  2. 检查云服务器安全组(如果在云平台如阿里云、腾讯云等):如果你使用的是云服务器(如阿里云、腾讯云等),除了系统防火墙,还需要在云服务商的控制台检查其安全组规则,确保入方向允许 TCP 80 端口的访问(通常源IP设置为 0.0.0.0/0 表示对所有IP开放)。

  3. 获取服务器IP地址:在服务器上使用 ip addr showhostname -I 命令查看服务器的IP地址。确保你的客户端电脑可以网络连通到此服务器(例如,在同一个局域网内,或者服务器有公网IP)。

测试访问

现在,你可以从同一网络下的其他电脑上进行测试了。

  1. 在客户机的浏览器地址栏中,输入以下格式的URL(将 your-server-ip 替换为你服务器的实际IP地址):

    • 访问特定图片:如果你知道图片文件名,例如 photo1.jpg,URL 为 http://your-server-ip/images/photo1.jpg
    • 浏览图片目录列表(如果配置了 autoindex on:URL 为 http://your-server-ip/images/
  2. 如果一切配置正确,浏览器应该能显示图片或列出 /home/root/images 目录下的文件列表。

故障排除

如果无法访问,请按以下步骤排查:

  • 检查 Nginx 状态sudo systemctl status nginx,确保其处于 active (running)
  • 检查配置文件语法:再次运行 sudo nginx -t
  • 检查端口监听:在服务器上运行 sudo ss -tulpn | grep 80,看 Nginx 是否在监听 80 端口。
  • 检查文件权限:确保 /home/root/images 目录及其下的图片文件可被 www-data 用户或其他人读取。
  • 查看 Nginx 错误日志:日志通常在 /var/log/nginx/error.log,使用 sudo tail -f /var/log/nginx/error.log 查看实时错误信息 。
  • 检查防火墙和安全组设置:确认服务器防火墙和云平台安全组规则均已放行 80 端口。

Nginx部署https

http请求由于不满足安全性要求逐渐被https取代,下面介绍如何在服务器上部署含SSL认证的https服务器

方案类型 证书来源 浏览器信任度 主要优点 主要缺点 适用场景
受信任的CA签发 JoySSL, Symantec等商业机构 受广泛信任 专业可靠,无安全警告 通常需要付费,申请流程可能稍复杂 生产环境、对外服务
免费CA (Let‘s Encrypt) Let’s Encrypt 受广泛信任 免费,可自动化 有效期极短(仅6天),需频繁续签 测试、短期项目或可自动化管理的环境
自签名证书 使用OpenSSL自行生成 默认不信任 完全免费,即时生成,可控性强 浏览器会显示安全警告,需手动信任 开发测试、内网环境、学习用途

生成自签名IP证书(使用OpenSSL)

这是最快捷的方式,非常适合测试和内部使用。核心步骤是为IP地址生成一个包含 subjectAltName 扩展字段的证书,这是现代浏览器识别证书所必须的。

  1. 创建OpenSSL配置文件
    由于默认生成命令不支持直接指定IP的subjectAltName,建议创建一个配置文件(如 openssl.cnf),将以下内容中的 IP.1 替换为你的阿里云服务器公网IP。

    [ req ]
    default_bits        = 2048
    prompt              = no
    default_md          = sha256
    req_extensions      = req_ext
    distinguished_name  = dn
    
    [ dn ]
    C   = CN
    ST  = State
    L   = City
    O   = Your Organization
    OU  = Your Unit
    CN  = 你的服务器IP地址  # 例如 123.123.123.123
    
    [ req_ext ]
    subjectAltName = @alt_names
    
    [ alt_names ]
    IP.1 = 你的服务器IP地址  # 必须与上面CN的值一致,例如 123.123.123.123
    
  2. 生成证书和私钥
    执行以下命令,它将使用上面的配置文件生成一个有效期为1年的证书。

    openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
      -keyout /etc/ssl/private/ip.key \
      -out /etc/ssl/certs/ip.crt \
      -config openssl.cnf
    
  3. 验证证书信息
    生成后,可以查看证书详情,确认IP地址已正确包含在主题备用名称(Subject Alternative Name)字段中。

    openssl x509 -in /etc/ssl/certs/ip.crt -text -noout | grep -A1 "Subject Alternative Name"
    

获取阿里云的SSL证书

在阿里云上获取SSL证书并部署到服务器,让Nginx和您的后端程序共用同一个证书是完全可行的。这是一种常见且高效的实践。下面我将为您梳理清晰的步骤和关键要点。
下图概括了从申请证书到部署使用的核心流程。

flowchart TD A[登录阿里云SSL证书控制台] --> B[选择并购买证书<br>(个人测试/正式)] B --> C[提交申请并填写域名信息] C --> D{选择域名验证方式} D -- 推荐 --> E[自动DNS验证] D -- 备选 --> F[手动DNS/文件验证] E --> G[CA审核并签发证书] F --> G G --> H[下载Nginx格式证书] H --> I[部署至服务器指定目录] I --> J[Nginx配置443端口<br>并设置反向代理] J --> K[后端程序直接使用<br>证书文件或通过代理]

下面,我们来详细了解每个阶段的具体操作和选项。

获取阿里云SSL证书

阿里云提供了两种主要的证书类型供您选择,下表对比了它们的核心差异,方便您决策。

特性 个人测试证书(免费版) 正式证书(付费)
适用场景 个人学习、测试、临时项目 企业官网、电商平台、对安全和信任度有要求的正式业务
签发数量 每个阿里云实名认证主体(个人/企业)每个自然年可一次性申请20张 根据购买数量决定,无此限制
支持域名 单域名(如 example.comwww.example.com 算一个) 支持单域名、多域名、通配符域名
有效期 3个月 1年(付费证书有效期通常为1年,可续费)
特殊域名 不支持 .edu, .gov, .org, .jp 无限制

申请流程概要

  1. 入口:登录阿里云控制台,进入 SSL证书(应用安全) 管理界面。
  2. 购买/创建
    • 若选择免费证书,请在“SSL证书管理”页面,点击 个人测试证书(原免费证书) 页签下的“立即购买”或“创建证书”。
    • 若选择付费证书,请在“正式证书”页签下点击“购买证书”,并选择需要的品牌(如DigiCert、Globalsign)和类型(DV/OV/EV)。
  3. 填写信息:在申请页面,准确填写需要绑定的域名,并选择域名验证方式
  4. 域名验证:这是证明您拥有该域名的关键一步。
    • 自动DNS验证(最便捷):如果域名解析服务就在当前阿里云账号下,系统可自动完成验证,强烈推荐此方式。
    • 手动DNS验证:如果域名不在阿里云或不在当前账号下,需登录您的域名解析商后台,按提示添加一条CNAME或TXT记录。
    • 文件验证:需按提示下载验证文件,并上传到您网站服务器的指定目录下,确保能通过HTTP访问。
  5. 审核与签发:提交后,CA机构(证书颁发机构)会进行审核。免费DV证书通常会在几分钟内签发;付费的OV/EV证书则需要更严格的审核,可能需数个工作日。

证书签发后,状态会变为“已签发”,接下来就是部署到您的Ubuntu Nginx服务器上。

  1. 下载证书:在SSL证书管理页面,找到对应证书,点击“下载”。在弹出窗口中,服务器类型请选择 Nginx。下载后将得到一个.zip压缩包。
  2. 上传证书:解压下载的包,您会得到两个文件:一个 .pem 文件(证书)和一个 .key 文件(私钥)。请妥善保管私钥,切勿泄露。将这两个文件上传到您的服务器,建议放在一个专门的目录下,例如 /etc/ssl/

注意:确保你的阿里云ECS安全组规则已经放行了443端口(HTTPS)的入站流量。

在Nginx中配置证书

生成证书后,需要将其配置到Nginx中。

  1. 修改Nginx配置文件
    在你的Nginx服务器块(通常在 /etc/nginx/sites-available/default)中启用HTTPS。

    server {
    	listen 443 ssl;
    	server_name your-domain.com;  # 请替换为您的域名或IP(若证书支持IP)
    
    	ssl_certificate /etc/nginx/ssl/your-domain.pem;    # 替换为您的.pem文件路径
    	ssl_certificate_key /etc/nginx/ssl/your-domain.key; # 替换为您的.key文件路径
    
    	# 安全增强配置(可选但推荐)
    	ssl_protocols TLSv1.2 TLSv1.3;  # 使用安全的TLS协议版本
    	ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    	ssl_prefer_server_ciphers on;
    	ssl_session_timeout 5m;
    
    	# 您的其他配置,例如静态资源位置或反向代理设置
    	location / {
    		root /var/www/html;
    		index index.html index.htm;
    	}
    
    	# 如果您的后端程序在同一台服务器上,可以配置反向代理
    	location /api/ {  # 假设API接口以/api/开头
    		proxy_pass http://127.0.0.1:8080;  # 转发到后端服务地址
    		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;
    	}
    }
    
    # 可选:将HTTP请求重定向到HTTPS,实现全站加密
    server {
    	listen 80;
    	server_name your-domain.com;
    	return 301 https://$server_name$request_uri;
    }
    
  2. 重启Nginx并测试
    配置完成后,重启Nginx使配置生效。

    sudo nginx -t  # 测试配置文件语法
    sudo systemctl restart nginx  # 重启Nginx服务
    

    完成后,在浏览器中访问 https://你的服务器IP。由于是自签名证书,浏览器会显示“不安全”警告,这是正常现象。在高级选项中选择“继续前往”即可。

posted @ 2025-11-04 17:59  Asp1rant  阅读(93)  评论(0)    收藏  举报