Nginx入门与安装详解:从零开始搭建高性能Web服务器

系列文章索引:

前言

Nginx(发音为"engine-x")是一款轻量级、高性能的Web服务器和反向代理服务器,由俄罗斯程序员Igor Sysoev于2004年开发。凭借其卓越的并发处理能力、低内存消耗和丰富的功能特性,Nginx已成为全球最受欢迎的Web服务器之一,被广泛应用于大型网站如Netflix、GitHub、淘宝等。

本文将详细介绍Nginx的入门知识和安装过程,帮助你从零开始搭建属于自己的高性能Web服务器。

一、Nginx核心特性与优势

1.1 核心特性

高性能架构

  • 采用事件驱动、异步非阻塞处理模型
  • 单进程可处理数万并发连接
  • 内存占用极小,约2.5MB-10MB

丰富功能模块

  • HTTP服务器、反向代理、负载均衡
  • 邮件代理服务器(IMAP/POP3/SMTP)
  • TCP/UDP代理(Stream模块)
  • 动态模块加载机制

扩展性强

  • 支持第三方模块开发
  • 支持Lua脚本扩展(OpenResty)
  • 支持自定义过滤器

1.2 与Apache对比

特性 Nginx Apache
架构模型 事件驱动 进程/线程驱动
并发性能 极高(10万+) 一般(几千)
内存占用 极小 较大
配置复杂度 简单 复杂
动态内容 通过FastCGI 原生支持
模块系统 静态模块为主 动态模块丰富

1.3 适用场景

Web服务器

  • 静态文件服务
  • 动态内容代理(PHP、Python等)
  • 前端资源服务器

反向代理

  • 应用服务器负载均衡
  • API网关
  • 微服务统一入口

负载均衡

  • 四层负载均衡(TCP/UDP)
  • 七层负载均衡(HTTP)
  • 会话保持

二、Nginx安装前准备

2.1 系统要求

硬件要求

  • CPU:建议2核以上
  • 内存:建议4GB以上
  • 硬盘:建议20GB以上可用空间

系统支持

  • CentOS 7/8/9
  • Ubuntu 18.04/20.04/22.04
  • Debian 9/10/11
  • RHEL 7/8/9

2.2 依赖包安装

CentOS/RHEL系统

bash 复制代码
# 安装基础开发工具
yum groupinstall "Development Tools" -y

# 安装Nginx依赖包
yum install -y \
    gcc \
    gcc-c++ \
    make \
    cmake \
    autoconf \
    automake \
    pcre \
    pcre-devel \
    zlib \
    zlib-devel \
    openssl \
    openssl-devel \
    libxml2 \
    libxml2-devel \
    libxslt \
    libxslt-devel \
    gd \
    gd-devel \
    perl-ExtUtils-Embed \
    GeoIP \
    GeoIP-devel \
    gperftools \
    gperftools-devel

Ubuntu/Debian系统

bash 复制代码
# 更新软件包列表
apt update

# 安装基础开发工具
apt install -y build-essential

# 安装Nginx依赖包
apt install -y \
    gcc \
    g++ \
    make \
    cmake \
    autoconf \
    automake \
    libpcre3 \
    libpcre3-dev \
    zlib1g \
    zlib1g-dev \
    libssl-dev \
    libxml2-dev \
    libxslt1-dev \
    libgd-dev \
    libgeoip-dev \
    google-perftools \
    libgoogle-perftools-dev \
    libperl-dev

2.3 创建运行用户

bash 复制代码
# 创建nginx运行用户组
groupadd nginx

# 创建nginx运行用户
useradd -r -g nginx -s /sbin/nologin nginx

# 查看用户信息
id nginx

安全建议:

  • 使用nologin shell禁止登录
  • 使用-r选项创建系统用户
  • 不创建home目录

三、Nginx安装方式详解

3.1 包管理器安装(快速入门)

CentOS/RHEL系统

bash 复制代码
# 安装EPEL仓库
yum install epel-release -y

# 安装Nginx
yum install nginx -y

# 启动Nginx服务
systemctl start nginx

# 设置开机自启
systemctl enable nginx

# 查看Nginx状态
systemctl status nginx

# 查看Nginx版本
nginx -v

Ubuntu/Debian系统

bash 复制代码
# 更新软件包列表
apt update

# 安装Nginx
apt install nginx -y

# 启动Nginx服务
systemctl start nginx

# 设置开机自启
systemctl enable nginx

# 查看Nginx状态
systemctl status nginx

# 查看Nginx版本
nginx -v

包管理器安装优缺点:

  • ✅ 安装简单,一键完成
  • ✅ 自动处理依赖关系
  • ✅ 系统服务自动配置
  • ❌ 版本较旧,功能受限
  • ❌ 模块选择不灵活
  • ❌ 性能优化空间有限

3.2 源码编译安装(推荐生产环境)

3.2.1 下载Nginx源码
bash 复制代码
# 创建工作目录
mkdir -p /usr/local/src/nginx
cd /usr/local/src/nginx

# 下载Nginx稳定版源码
wget http://nginx.org/download/nginx-1.24.0.tar.gz

# 下载PCRE源码(正则表达式支持)
wget https://ftp.pcre.org/pub/pcre/pcre-8.45.tar.gz

# 下载OpenSSL源码(SSL支持)
wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz

# 下载zlib源码(压缩支持)
wget http://zlib.net/zlib-1.2.13.tar.gz

# 解压所有源码
tar -zxvf nginx-1.24.0.tar.gz
tar -zxvf pcre-8.45.tar.gz
tar -zxvf openssl-1.1.1w.tar.gz
tar -zxvf zlib-1.2.13.tar.gz
3.2.2 生产环境编译配置
bash 复制代码
# 进入Nginx源码目录
cd nginx-1.24.0

# 生产环境编译配置
./configure \
--prefix=/usr/local/nginx \
--sbin-path=/usr/local/nginx/sbin/nginx \
--conf-path=/usr/local/nginx/conf/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_realip_module \
--with-http_gzip_static_module \
--with-http_v2_module \
--with-http_auth_request_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_degradation_module \
--with-http_slice_module \
--with-http_stub_status_module \
--with-mail \
--with-mail_ssl_module \
--with-stream \
--with-stream_realip_module \
--with-stream_ssl_module \
--with-stream_ssl_preread_module \
--with-pcre \
--with-pcre-jit \
--with-zlib \
--with-openssl \
--with-openssl-opt="enable-weak-ssl-ciphers" \
--with-debug \
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic' \
--with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
3.2.3 编译参数详解

核心路径参数:

bash 复制代码
--prefix=/usr/local/nginx              # Nginx安装根目录
--sbin-path=/usr/local/nginx/sbin/nginx  # Nginx可执行文件路径
--conf-path=/usr/local/nginx/conf/nginx.conf  # 主配置文件路径
--error-log-path=/var/log/nginx/error.log   # 错误日志路径
--http-log-path=/var/log/nginx/access.log   # 访问日志路径
--pid-path=/var/run/nginx.pid           # PID文件路径
--lock-path=/var/run/nginx.lock        # 锁文件路径
--user=nginx                           # 运行用户
--group=nginx                          # 运行用户组

HTTP模块参数:

bash 复制代码
--with-http_ssl_module                 # SSL/TLS支持(HTTPS必需)
--with-http_stub_status_module         # 状态监控模块
--with-http_realip_module              # 获取真实客户端IP
--with-http_gzip_static_module         # 静态文件压缩
--with-http_v2_module                  # HTTP/2支持
--with-http_auth_request_module        # HTTP认证请求
--with-http_addition_module            # 响应内容追加
--with-http_sub_module                 # 响应内容替换
--with-http_dav_module                 # WebDAV支持
--with-http_flv_module                 # FLV流媒体支持
--with-http_mp4_module                 # MP4流媒体支持
--with-http_gunzip_module              # 动态解压缩
--with-http_random_index_module        # 随机首页
--with-http_secure_link_module         # 安全链接
--with-http_degradation_module         # 服务器降级
--with-http_slice_module               # 分片请求

邮件代理模块:

bash 复制代码
--with-mail                            # 邮件代理模块
--with-mail_ssl_module                 # 邮件SSL支持

Stream模块(TCP/UDP代理):

bash 复制代码
--with-stream                          # TCP/UDP代理模块
--with-stream_realip_module            # 获取真实客户端IP
--with-stream_ssl_module               # Stream SSL支持
--with-stream_ssl_preread_module       # SSL预读

第三方库支持:

bash 复制代码
--with-pcre                            # PCRE正则表达式支持
--with-pcre-jit                        # PCRE JIT编译
--with-zlib                            # zlib压缩支持
--with-openssl                         # OpenSSL支持

编译优化参数:

bash 复制代码
--with-debug                           # 启用调试模式
--with-cc-opt                          # C编译器优化参数
--with-ld-opt                          # 链接器优化参数
3.2.4 可选编译参数(按需添加)

性能优化类:

bash 复制代码
--with-file-aio                        # 异步文件I/O
--with-threads                         # 线程池支持
--with-libatomic                       # 原子操作库

功能扩展类:

bash 复制代码
--with-http_xslt_module                # XSLT转换
--with-http_image_filter_module        # 图像处理
--with-http_geoip_module               # GeoIP地理位置识别
--with-http_perl_module                # Perl支持
--with-google_perftools_module         # Google性能工具

安全增强类:

bash 复制代码
--with-openssl-opt="enable-weak-ssl-ciphers"  # OpenSSL优化选项
--with-md5-asm                         # MD5汇编优化
--with-sha1-asm                        # SHA1汇编优化
3.2.5 编译安装
bash 复制代码
# 编译(使用多核加速编译)
make -j$(nproc)

# 安装
make install

# 创建必要的目录
mkdir -p /var/log/nginx
mkdir -p /var/cache/nginx
mkdir -p /usr/local/nginx/conf/conf.d

# 设置目录权限
chown -R nginx:nginx /var/log/nginx
chown -R nginx:nginx /var/cache/nginx
chown -R nginx:nginx /usr/local/nginx

四、Nginx安装后配置

4.1 创建系统服务

bash 复制代码
# 创建systemd服务文件
cat > /usr/lib/systemd/system/nginx.service << 'EOF'
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

# 重新加载systemd配置
systemctl daemon-reload

# 启动Nginx服务
systemctl start nginx

# 设置开机自启
systemctl enable nginx

4.2 配置环境变量

bash 复制代码
# 添加Nginx到PATH环境变量
echo 'export PATH=/usr/local/nginx/sbin:$PATH' >> /etc/profile

# 立即生效
source /etc/profile

# 验证Nginx命令
nginx -v

4.3 防火墙配置

bash 复制代码
# 开放HTTP端口
firewall-cmd --permanent --add-service=http

# 开放HTTPS端口
firewall-cmd --permanent --add-service=https

# 重新加载防火墙配置
firewall-cmd --reload

# 查看开放的端口
firewall-cmd --list-all

4.4 验证安装

bash 复制代码
# 检查Nginx配置文件语法
nginx -t

# 查看Nginx编译参数
nginx -V

# 查看Nginx进程
ps aux | grep nginx

# 查看Nginx监听端口
netstat -tlnp | grep nginx

# 测试Nginx服务
curl -I http://localhost

五、常见问题与解决方案

5.1 编译错误处理

PCRE库未找到

bash 复制代码
# 错误信息:./configure: error: the HTTP rewrite module requires the PCRE library.
# 解决方案:安装PCRE开发包
yum install pcre-devel -y  # CentOS/RHEL
apt install libpcre3-dev -y  # Ubuntu/Debian

OpenSSL库未找到

bash 复制代码
# 错误信息:./configure: error: SSL modules require the OpenSSL library.
# 解决方案:安装OpenSSL开发包
yum install openssl-devel -y  # CentOS/RHEL
apt install libssl-dev -y  # Ubuntu/Debian

zlib库未找到

bash 复制代码
# 错误信息:./configure: error: the HTTP gzip module requires the zlib library.
# 解决方案:安装zlib开发包
yum install zlib-devel -y  # CentOS/RHEL
apt install zlib1g-dev -y  # Ubuntu/Debian

5.2 运行时错误处理

端口被占用

bash 复制代码
# 错误信息:nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
# 解决方案:停止占用端口的进程或修改Nginx监听端口
netstat -tlnp | grep :80
kill -9 <PID>

权限不足

bash 复制代码
# 错误信息:nginx: [emerg] open() "/var/log/nginx/error.log" failed (13: Permission denied)
# 解决方案:设置正确的目录权限
chown -R nginx:nginx /var/log/nginx
chmod 755 /var/log/nginx

配置文件语法错误

bash 复制代码
# 错误信息:nginx: [emerg] unknown directive "server_name" in /usr/local/nginx/conf/nginx.conf:25
# 解决方案:检查配置文件语法
nginx -t
# 根据错误提示修改配置文件

下一步学习建议:

  • 深入学习Nginx配置文件结构和语法
  • 掌握Nginx基础配置和虚拟主机设置
  • 了解Nginx性能优化和安全配置
  • 学习Nginx反向代理和负载均衡配置

Nginx作为现代Web架构的重要组成部分,掌握其安装和基本配置是每个运维和开发人员的必备技能。希望本文能够帮助你顺利入门Nginx,为后续的深入学习打下坚实基础。