深入掌握Nginx服务器

本文介绍nginx服务器及其主要特性,首先给出了包管理器安装及编译安装两种方式,然后重点对 nginx 配置文件中的指令及参数进行详细说明,在了解 nginx 的工作方式后,从 nginx 实现请求访问控制 (IP、带宽、连接数限制及参数校验)、反向代理、跨域请求、负载均衡策略 (轮询、权重、IP 哈希、最少连接数)、缓存方式及配置SSL证书提供Https访问方面进行详细说明。

Nginx 简介

Nginx(发音engine x)是一个高性能的 HTTP 和反向代理服务器、IMAP/POP3代理服务器、邮件代理服务器和通用的TCP/UDP代理服务器,最初由俄罗斯工程师伊戈尔・西索耶夫(Igor Sysoev)用 C 语言开发,2004 年公开发布,2011 年成立 nginx 公司,提供相应支持及其付费软件 nginx plus。

nginx 主要特性

  • 高并发连接处理能力:事件驱动和非阻塞 I/O,内存占用低,支持多进程,可处理数万至数十万并发连接。
  • 高效率处理静态网页:通过文件缓存、内存读取,快速响应图像、CSS、HTML 等静态内容。
  • 强大的反向代理:接收客户端请求,转发至后端服务器并返回结果,客户端无感知,可缓存请求。
  • 多种负载均衡策略:支持轮询、权重、IP 哈希、最少连接数等算法,合理分配后端集群流量。
  • 请求过滤和正则匹配:支持 gzip 压缩、字节限制、图像转换;支持请求路径正则匹配。
  • 灵活的访问控制:校验客户端 IP、限制连接数与速率、记录访问日志。
  • SSL/TLS 协议支持:保障通信加密安全;HTTPS 基于 SSL/TLS 加密传输,防窃取与篡改。

通过包管理器安装 nginx

以 Ubuntu 20 为例,使用apt/apt-get安装,简便快捷,但版本可能滞后、自定义有限。
# 安装nginx
sudo apt install nginx

# 启动/查看状态/重新加载配置
systemctl start nginx
systemctl status nginx
systemctl reload nginx

# 查看版本
nginx -v

查看 nginx 信息

# 查看已安装nginx包
apt list --installed | grep nginx

# 查看路径
whereis nginx
which nginx

# 查看系统环境变量
cat /etc/environment
默认配置文件:/etc/nginx/nginx.conf

编译安装 nginx

可自定义模块、使用最新版、优化性能,但步骤复杂、需自行处理依赖。
官方下载:nginx: download
nginx-1.26.1在 Ubuntu 20 编译安装为例:

1. 下载并解压

tar -vxf nginx-1.26.1.tar.gz
cd nginx-1.26.1 && ls

2. 安装依赖

sudo apt-get install libpcre3 libpcre3-dev
sudo apt-get install zlib1g zlib1g-dev
sudo apt-get install libssl-dev

3. 配置 nginx

sudo ./configure
常见自定义配置:
sudo ./configure \
    --sbin-path=/usr/local/nginx/nginx \
    --conf-path=/usr/local/nginx/nginx.conf \
    --pid-path=/usr/local/nginx/nginx.pid \
    --with-http_ssl_module

4. 编译与安装

sudo make
sudo make install

5. 启动 nginx

sudo /usr/local/nginx/nginx
curl localhost

Nginx 管理命令

nginx -s stop    # 快速关闭
nginx -s quit    # 优雅关闭(处理完请求)
nginx -s reload  # 重新加载配置
ps -ax | grep nginx  # 查看进程
sudo kill -s quit <主进程ID>  # 关闭

nginx 配置文件

配置由简单指令(空格分隔、分号结尾)和块指令(大括号包裹)组成,#为注释。

典型 nginx.conf 结构

nginx
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 768;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

请求访问控制

IP 限制

nginx
location /admin {
    allow 192.168.58.0/24;
    deny all;
}

路径重写与参数校验

nginx
location /protected {
    if ($arg_token != "123") {
        return 403;
    }
    rewrite ^/protected/1$ /protected/index.html last;
}

请求限流

nginx
limit_req_zone binary_remote_addr zone=resource_one:10m rate=1r/s;
limit_conn_zone binary_remote_addr zone=resource_addr:10m;

server {
    listen 8000;
    server_name localhost;

    location /resources {
        limit_rate 10k;
        limit_req zone=resource_one burst=5 nodelay;
        limit_conn resource_addr 1;
        root /var/www;
        index index.html;
    }
}

反向代理

nginx
location /api {
    proxy_pass http://192.168.58.59:8080;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

跨域请求配置

nginx
server {
    listen 8000;
    server_name localhost;

    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Credentials true;
    add_header Access-Control-Allow-Methods "GET,POST,PUT,DELETE,OPTIONS";
    add_header Access-Control-Allow-Headers "Origin,X-Requested-With,Content-Type,Accept";

    location /resources {
        root /var/www;
        index index.html;
    }
}

负载均衡策略

nginx
upstream backend {
    server 192.168.58.59:8080;
    server 192.168.58.60:8080;
    # 轮询(默认)
    # 权重:server ... weight=2;
    # IP哈希:ip_hash;
    # 最少连接:least_conn;
}

server {
    listen 80;
    location / {
        proxy_pass http://backend;
    }
}

反向代理缓存

nginx
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=app_cache:10m max_size=1g inactive=30m use_temp_path=off;

server {
    listen 8000;
    location /api {
        proxy_cache app_cache;
        proxy_cache_valid 200 302 304 15m;
        proxy_cache_valid 404 1m;
        proxy_pass http://192.168.58.59:8080;
    }
}

配置 SSL 证书支持 HTTPS

1. 生成自签名证书(测试用)

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/nginx-selfsigned.key \
-out /etc/ssl/certs/nginx-selfsigned.crt

2. HTTPS 配置

nginx
server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;

    server_name devp.com www.devp.com;

    ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
    ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;

    ssl_session_timeout 5m;
    ssl_session_cache shared:SSL:10m;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        root /var/www/html;
        index index.html;
    }
}

3. 验证

nginx -t
nginx -s reload
curl -k https://devp.com

参考资料

nginx 官方文档

原创文章,作者:余初云,如若转载,请注明出处:https://blog.jidcy.com/jsjc/2631.html

Like (1)
Previous 2026年5月7日 上午11:33
Next 2026年5月8日

相关推荐

  • 一文读懂 WebP 图像格式是什么?

    许多网站开始采用一种名为 WebP 的新图像格式。它究竟是什么,又为何比其他格式更有优势? WebP 是谷歌收购 On2 Technologies 后开发的图像格式,基于 VP8 …

    2026年4月11日
    0
  • 什么是LLM?企业导入LLM的常见应用场景

    自2022年ChatGPT的惊艳问世,到如今国内文心一言、豆包、deekseek、千问等国内AI工具激烈竞争,生成式人工智能已彻底改变了我们的生活与工作方式。但你是否好奇,这些强大…

    2026年4月1日
    0
  • 网站打开速度越来越慢和主机有关系吗?

    网站上线运营一段时间后,页面加载越来越慢几乎是个绕不开的问题。 出现这种情况,很多站长的第一反应是去查代码、压图片、卸插件,或者觉得是最近网络不稳定。这些方向不能说没有道理,但常常…

    2026年4月13日
    0
  • 什么是 CSRF 攻击?

    平时登录各类网站后,无需重复输入账号密码就能正常使用,这一便捷体验全都依靠 Cookie 实现。但 Cookie 在提升使用体验的同时,也存在安全漏洞,极易被不法分子利用,冒用用户…

    2026年5月18日
    0
  • 数据库读写分离是什么?小白一看就懂

    网站运营步入正轨,用户规模从最初寥寥数十人,如今已然突破万人。可随之而来的问题也逐渐凸显,网页加载速度越来越慢,不少用户纷纷吐槽卡顿,网站运行压力肉眼可见攀升。 其实这是网站流量上…

    2026年5月19日
    0
  • Nginx与Apache的区别,谁是主流?

    NGINX 和 Apache 是目前最流行的两款 Web 服务器软件,都属于成熟的开源项目,为全球数百万网站提供支持。根据实际需求,两者都能帮助构建强大、可扩展、高性能的 Web …

    2026年4月9日
    0
  • 什么是静态 IP 地址?

    静态 IP 地址保持一致且可预测,不会被路由器或互联网服务提供商(ISP)自动重新分配,因此适用于托管服务、远程访问和企业网络。 静态 IP 地址在实践中有哪些用途?很多时候,它能…

    2026年5月16日
    0
  • sql注入攻击是什么意思?有何防护措施?

    SQL注入就是用恶意SQL语句攻击数据驱动的应用程序,通常目的是获取敏感数据。 什么是SQL注入? 结构化查询语言(Structured Query Language,SQL)注入…

    2026年4月27日
    0
  • Vim 自动缩进命令

    Vim 是一款模式化文本编辑器,支持多种编辑模式,不同模式下键盘按键的功能会发生变化。它自带一套功能强大、设置灵活的自动缩进机制,核心就是 indentexpr 选项。写代码时缩进…

    2026年4月29日
    0
  • 什么是 LAMP 堆栈?LAMP 用于什么?

    LAMP堆栈是一种流行的软件组合,通过开源组件来构建和交付网络应用程序。 开发人员基本都知道LAMP,因为自20世纪90年代末以来,它就一直是网络开发的常用工具。LAMP堆栈以开源…

    2026年4月29日
    0