Nginx 服务器

Nginx 是一款高性能的HTTP和反向代理服务器。在高连接并发的情况下,能够支持高达5万个并发连接数的响应,而内存、CPU等系统资源消耗却非常低,运行非常稳定。

Nginx 部署

# 安装 nginx
[root@nginx ~ 11:14:02]# yum install -y nginx

# 启动 nginx
[root@nginx ~ 11:14:14]#  systemctl enable nginx --now

# 准备主页
[root@nginx ~ 11:20:26]# mv /usr/share/nginx/html/index.html{,.ori}
[root@nginx ~ 11:20:31]# echo Hello World From Nginx > /usr/share/nginx/html/index.html

# 防火墙
[root@nginx ~ 11:20:36]#  firewall-cmd --add-service=http --permanent
[root@nginx ~ 11:20:40]# firewall-cmd --reload

[root@client ~]# curl http://web.ggg.cloud

# windows客户端修改 C:\Windows\System32\drivers\etc\hosts
# Linux或Unix修改 /etc/hosts
# 添加如下记录
10.1.8.10 web.ggg.cloud web
#在网站测试web.ggg.cloud

Nginx 配置

配置结构

Nginx 配置采用层级化、模块化的组织方式,整体是 “全局块 → 核心模块块 → 业务模块块” 的嵌套结构。

[root@nginx ~ 11:36:01]# vim /etc/nginx/nginx.conf
1. 全局配置块

作用于 Nginx 整个进程的基础配置,不嵌套在任何块内,是配置文件的 “根级别”。

# 全局配置示例
user nginx;                  # 运行Nginx的用户/用户组
worker_processes auto;       # 工作进程数(核心参数,建议设为CPU核心数)
error_log /var/log/nginx/error.log;  # 错误日志路径
pid /run/nginx.pid;          # 主进程PID文件路径
include /usr/share/nginx/modules/*.conf;  # 加载外部模块配置(全局级引入)
2. 核心模块 块

Nginx 的核心功能模块 events 块,用于处理网络连接相关配置。

events {
    worker_connections 1024;  # 每个工作进程的最大并发连接数
    use epoll;                # 事件驱动模型(epoll是Linux下高性能选择)
    multi_accept on;          # 允许一个进程一次性接受多个新连接
}
3. 业务模块 块

处理具体业务的核心配置块,最核心的是 http 块(HTTP/HTTPS 服务),可以包含多个 server 块(虚拟主机)。

# http块:所有HTTP/HTTPS服务的公共配置,可嵌套多个server块
http {
    # HTTP全局公共配置
    include       /etc/nginx/mime.types;  # 加载MIME类型映射
    default_type  application/octet-stream; # 默认响应类型
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request"'; # 日志格式
    access_log  /var/log/nginx/access.log  main; # 访问日志
    sendfile     on;  # 高效文件传输开关
    keepalive_timeout  65;  # 长连接超时时间

    # server块:虚拟主机配置(一个http块可包含多个server)
    server {
        listen       80;  # 监听端口(80=HTTP,443=HTTPS)
        server_name  localhost;  # 域名/IP(可配置多个,用空格分隔)
        root         /usr/share/nginx/html;  # 网站根目录

        # location块:URL路径匹配规则(一个server块可包含多个location)
        location / {
            index  index.html index.htm;  # 默认首页
            try_files $uri $uri/ /index.html;  # 路径匹配规则
        }

        # 错误页面配置
        error_page  404              /404.html;
        error_page  500 502 503 504  /50x.html;
    }

    # 第二个虚拟主机(示例)
    server {
        listen       8080;
        server_name  test.example.com;
        # ... 其他配置
    }
}
4. 特殊配置:HTTPS 专属块

如果配置 HTTPS,会在 server 块内增加 SSL 相关配置:

server {
    listen       443 ssl;  # 监听HTTPS端口并启用SSL
    server_name  example.com;

    # SSL证书配置
    ssl_certificate      /etc/nginx/cert/server.crt;  # 公钥文件
    ssl_certificate_key  /etc/nginx/cert/server.key;  # 私钥文件
    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    # ... 其他配置(如root、location等)
}

配置加载机制

  1. include 指令:Nginx 支持通过 include 引入外部配置文件,实现模块化管理。
    • 把不同虚拟主机配置拆到 /etc/nginx/conf.d/*.conf
    • 把不同代理配置拆到 /etc/nginx/default.d/*.conf
  2. 配置优先级:
    • 同层级:后定义的配置覆盖先定义的;
    • 不同层级:子级(如 location)覆盖父级(如 server/http);
    • location 匹配:精准匹配(=)> 正则匹配(~/~*)> 普通前缀匹配。

nginx.conf 配置详解

# 更多配置详情参考官方文档:
#   * 英文官方文档: http://nginx.org/en/docs/
#   * 俄文官方文档: http://nginx.org/ru/docs/

# 指定Nginx工作进程的运行用户为nginx
user nginx;

# 工作进程数,设置为auto时会自动根据CPU核心数调整
worker_processes auto;

# 错误日志文件路径及存储位置
error_log /var/log/nginx/error.log;

# Nginx主进程PID文件路径,用于标识进程ID
pid /run/nginx.pid;

# 加载动态模块,详细说明可查看/usr/share/doc/nginx/README.dynamic文件
include /usr/share/nginx/modules/*.conf;

# 事件模块配置块,用于设置网络连接相关参数
events {
    # 每个工作进程的最大并发连接数,默认1024
    worker_connections 1024;
}

# HTTP核心模块配置块,包含HTTP服务的主要配置
http {
    # 定义访问日志的格式,命名为main
    # 日志字段说明:客户端IP - 远程用户 [访问时间] "请求信息" 状态码 发送字节数 "来源页面" "用户代理" "代理IP"
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    # 启用访问日志,使用main格式,日志文件存储路径
    access_log  /var/log/nginx/access.log  main;

    # 启用高效文件传输模式,减少磁盘I/O和CPU消耗
    sendfile            on;

    # 启用TCP_NOPUSH选项,在发送响应时累积数据后一次性发送,提高网络效率(需配合sendfile使用)
    tcp_nopush          on;

    # 启用TCP_NODELAY选项,禁用Nagle算法,减少数据传输延迟(适用于实时性要求高的场景)
    tcp_nodelay         on;

    # HTTP长连接超时时间,超过65秒无活动则关闭连接
    keepalive_timeout   65;

    # 文件类型哈希表的最大容量,增大可提高文件类型查找效率
    types_hash_max_size 4096;

    # 引入MIME类型配置文件,定义不同文件后缀对应的响应类型
    include             /etc/nginx/mime.types;

    # 默认MIME类型,当无法识别文件类型时使用(二进制流格式)
    default_type        application/octet-stream;

    # 加载/etc/nginx/conf.d目录下的所有.conf后缀配置文件(模块化配置)
    # 更多说明参考http://nginx.org/en/docs/ngx_core_module.html#include
    include /etc/nginx/conf.d/*.conf;

    # 虚拟主机配置块(默认HTTP服务)
    server {
        # 监听IPv4的80端口(HTTP默认端口)
        listen       80;

        # 监听IPv6的80端口
        listen       [::]:80;

        # 虚拟主机域名,_表示匹配所有未明确指定的域名
        server_name  _;

        # 网站根目录,存放静态资源的路径
        root         /usr/share/nginx/html;

        # 加载默认虚拟主机的额外配置文件(来自/etc/nginx/default.d/*.conf)
        include /etc/nginx/default.d/*.conf;

        # 配置404错误页面,当请求资源不存在时返回/404.html
        error_page 404 /404.html;
        # 精确匹配/404.html的访问路径(无额外配置,直接返回文件)
        location = /404.html {
        }

        # 配置500/502/503/504服务器错误页面,返回/50x.html
        error_page 500 502 503 504 /50x.html;
        # 精确匹配/50x.html的访问路径(无额外配置,直接返回文件)
        location = /50x.html {
        }
    }

# TLS/SSL加密服务配置(默认注释,启用需取消注释并配置证书)
#
#    server {
#        # 监听IPv4的443端口(HTTPS默认端口),启用SSL和HTTP/2协议
#        listen       443 ssl http2;
#        # 监听IPv6的443端口,启用SSL和HTTP/2协议
#        listen       [::]:443 ssl http2;
#        # 虚拟主机域名(需替换为实际域名)
#        server_name  _;
#        # 网站根目录(与HTTP服务一致)
#        root         /usr/share/nginx/html;
#
#        # SSL证书文件路径(公钥)
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        # SSL证书密钥文件路径(私钥,需保密)
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        # SSL会话缓存配置:共享缓存,名称SSL,大小1MB
#        ssl_session_cache shared:SSL:1m;
#        # SSL会话超时时间,10分钟内再次连接无需重新握手
#        ssl_session_timeout  10m;
#        # SSL加密套件,优先选择高强度加密算法,排除aNULL和MD5
#        ssl_ciphers HIGH:!aNULL:!MD5;
#        # 优先使用服务器端指定的加密套件
#        ssl_prefer_server_ciphers on;
#
#        # 加载默认虚拟主机的额外配置文件
#        include /etc/nginx/default.d/*.conf;
#
#        # 404错误页面配置(原配置笔误,应为/404.html,此处保留原注释结构)
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        # 服务器错误页面配置
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }
}

虚拟主机

同一个 web 服务器提供多个站点。

虚拟主机支持多种方式:

  1. 主机名
  2. 端口号
  3. IP地址(基本不用)

根据名称

# 参考主配置文件/etc/nginx/nginx.conf中server块配置
[root@nginx ~ 13:37:43]# cp /etc/nginx/nginx.conf /etc/nginx/conf.d/vhost-web1.conf
[root@nginx ~ 13:38:31]# vim /etc/nginx/conf.d/vhost-web1.conf
server {
    server_name  web1.laoma.cloud;
    root         /usr/share/nginx/web1;
}
[root@nginx ~ 13:49:50]# cp /etc/nginx/nginx.conf /etc/nginx/conf.d/vhost-web2.conf
[root@nginx ~ 13:50:51]# vim /etc/nginx/conf.d/vhost-web2.conf
server {
    server_name  web2.laoma.cloud;
    root         /usr/share/nginx/web2;
}
[root@nginx ~ 13:44:51]# mkdir /usr/share/nginx/web{1,2}
[root@nginx ~ 13:45:15]# echo "Welcome to web1 Site" > /usr/share/nginx/web1/index.html
[root@nginx ~ 13:46:20]# echo "Welcome to web2 Site" > /usr/share/nginx/web2/index.html
[root@nginx ~ 13:46:27]# systemctl restart nginx

客户端测试

# 配置名称解析,假设web服务器ip地址为10.1.8.10
#在本机C:\Windows\System32\drivers\etc\hosts配置
10.1.8.10 web1.ggg.cloud web1
10.1.8.10 web2.ggg.cloud web2

在这里插入图片描述

提示:清理环境,避免影响后续实验。

[root@nginx ~ 13:52:33]# mkdir /etc/nginx/conf.d/vhosts
[root@nginx ~ 13:53:36]# mv /etc/nginx/conf.d/vhost-web{1,2}.conf /etc/nginx/conf.d/vhosts

根据 port

[root@nginx ~ 13:54:37]# vim /etc/nginx/conf.d/vhost-port.conf
server {
    listen       8081;
    server_name  www.laoma.cloud;
    root         /usr/share/nginx/8081;
}
server {
    listen       8082;
    server_name  www.laoma.cloud;
    root         /usr/share/nginx/8082;
}
[root@nginx ~ 13:57:03]# mkdir /usr/share/nginx/808{1,2}
[root@nginx ~ 13:57:59]# echo "Welcome to 8081 Port" > /usr/share/nginx/8081/index.html
[root@nginx ~ 13:58:24]# echo "Welcome to 8082 Port" > /usr/share/nginx/8082/index.html
[root@nginx ~ 13:58:32]# systemctl restart nginx

客户端测试

# 配置名称解析,假设web服务器ip地址为10.1.8.10
#在本机C:\Windows\System32\drivers\etc\hosts配置
10.1.8.10 www.ggg.cloud www

在这里插入图片描述

提示:清理环境,避免影响后续实验。

配置 SSL/TLS

生成证书

#--1--生成私钥 
[root@nginx~ 14:15:08]# mkdir certs&&cd certs
[root@nginx certs 14:15:13]# openssl genrsa -out www.key 2048
Generating RSA private key, 2048 bit long modulus
.........................+++
........+++
e is 65537 (0x10001)  

#--2--生成请求文件csr
[root@nginx certs 14:29:01]# openssl req -new -key www.key -out www.csr -subj "/C=CN/ST=JS/L=NJ/O=WH/OU=DEVOPS/CN=www.ggg.cloud/emailAddress=webadmin@ggg.cloud" 

#每个参数意思
#req: 使用 OpenSSL 的证书请求功能
#-new: 生成新的证书请求
#-key www.key: 指定私钥文件(必须提前有这个文件)
#-out www.csr: 输出的 CSR 文件名(你要交给证书厂商的就是这个文件)
#-subj "...": 直接填写证书信息,不用交互式输入
# CN: 必须是网站域名
#-subj 里面的字段含义
/C=CN        → Country 国家:CN=中国
/ST=JS       → State 省份:JS=江苏
/L=NJ        → Location 城市:NJ=南京
/O=LM        → Organization 公司/组织名:WH
/OU=DEVOPS   → Organization Unit 部门:DEVOPS
/CN=...      → Common Name 你的**域名**(最关键)
/emailAddress=webadmin@ggg.cloud → 管理员邮箱

#--3--使用自己的私钥对请求文件签名,以生成证书 
[root@nginx certs 14:32:15]# openssl x509 -req -days 3650 -in www.csr -signkey www.key -out www.crt
Signature ok
subject=/C=CN/ST=JS/L=NJ/O=WH/OU=DEVOPS/CN=www.ggg.cloud/emailAddress=webadmin@ggg.cloud
Getting Private key
#www.key → 私钥(必须保密)
#www.csr → 证书请求(用完可删)
#www.crt → SSL 公钥证书(配置 Nginx 用)

配置站点

#--4--单独创建一个目录来存放证书和私钥
[root@nginx certs 14:43:33]# mkdir /etc/ssl/certs/www.ggg.cloud
[root@nginx certs 14:46:09]# ls www*
www.crt  www.csr  www.key
[root@nginx certs 14:46:19]# mv www* /etc/ssl/certs/www.ggg.cloud

#--5--参照默认配置修改
[root@nginx certs 14:46:35]# cp /etc/nginx/nginx.conf /etc/nginx/conf.d/vhost-www.ggg.cloud-ssl.conf
[root@nginx certs 14:46:58]# vim /etc/nginx/conf.d/vhost-www.ggg.cloud-ssl.conf
server {
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name  www.laoma.cloud;
    root         /usr/share/nginx/html;
    # 证书
    ssl_certificate "/etc/ssl/certs/www.ggg.cloud/www.crt";
    # 私钥
    ssl_certificate_key "/etc/ssl/certs/www.ggg.cloud/www.key";
}
#--6--重启服务并验证
root@nginx certs 14:50:27]# systemctl restart nginx

在这里插入图片描述

在这里插入图片描述

配置HTTP重定向到https

#配置重定向
[root@nginx certs 14:53:30]# vim /etc/nginx/conf.d/vhost-www.ggg.cloud-ssl.conf
server {
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name  www.laoma.cloud;
    root         /usr/share/nginx/html;
    # 证书
    ssl_certificate "/etc/ssl/certs/www.ggg.cloud/www.crt";
    # 私钥
    ssl_certificate_key "/etc/ssl/certs/www.ggg.cloud/www.key";
}

# 配置HTTP重定向到https
server {
    listen       80;
    listen       [::]:80;
    server_name  www.ggg.cloud;
    root         /usr/share/nginx/html;
    # 添加重定向
    return       301 https://$host$request_uri;
}
#重启服务
[root@nginx certs 15:14:34]# systemctl restart nginx

# 防火墙设置
[root@nginx certs 15:14:34]# firewall-cmd --add-service=https --permanent
[root@nginx certs 15:14:34]# firewall-cmd --reload

# 测试
[root@nginx certs 15:16:03]# curl http://www.ggg.cloud
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>

# 使用-k指明目标站点不是一个安全站点
[root@nginx certs 15:15:47]# curl -k https://www.ggg.cloud/

# 使用-L指明跟随重定向
[root@nginx certs 15:15:47]# curl -kL http://www.ggg.cloud
Hello World

配置基本认证

用户名和密码使用plain text发送,所以最好配置SSL/TLS。

# 添加用户基本认证
[root@nginx ~ 15:45:53]# cd /etc/nginx/conf.d/
[root@nginx conf.d 15:48:20]# vim vhost-ssl.conf
# add into the [server] section
server {
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name  www.ggg.cloud;
    root         /usr/share/nginx/html;
    ssl_certificate "/etc/ssl/certs/www.ggg.cloud/www.crt";
    ssl_certificate_key "/etc/ssl/certs/www.ggg.cloud/www.key";    
    location /sercret/ {
        auth_basic            "Basic Auth";
        auth_basic_user_file  "/etc/nginx/.htpasswd";
    }
 }
server {
    listen       80;
    listen       [::]:80;
    server_name  www.ggg.cloud;
    root         /usr/share/nginx/html;
    # 添加重定向
    return       301 https://$host$request_uri;
}
#重启服务
[root@nginx conf.d 15:50:23]# systemctl restart nginx

#安装工具
[root@nginx ~ 15:35:55]# yum install -y httpd-tools
[root@nginx conf.d 15:50:33]# htpasswd -b -c /etc/nginx/.htpasswd ggg 123456

# create a test page
[root@nginx ~ 15:51:52]# mkdir /usr/share/nginx/html/sercret
[root@nginx ~ 15:52:05]# vim /usr/share/nginx/html/sercret/index.html
<html>
<body>
<div style="width: 100%; font-size: 40px; font-weight: bold; text-align: ggger;">
Test Page for Basic Authentication
</div>
</body>
</html>

# 测试,通过-u选项指定用户名和密码
[root@nginx ~ 15:55:40]# curl -ku ggg:123456 https://www.ggg.cloud/sercret/

在这里插入图片描述

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐