Linux的nginx服务器
·
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等)
}
配置加载机制
- include 指令:Nginx 支持通过
include引入外部配置文件,实现模块化管理。- 把不同虚拟主机配置拆到
/etc/nginx/conf.d/*.conf - 把不同代理配置拆到
/etc/nginx/default.d/*.conf
- 把不同虚拟主机配置拆到
- 配置优先级:
- 同层级:后定义的配置覆盖先定义的;
- 不同层级:子级(如 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 服务器提供多个站点。
虚拟主机支持多种方式:
- 主机名
- 端口号
- 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/

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

所有评论(0)