Nginx

一、Linux 基础复习

系统信息查看
命令 功能说明 示例
cat /etc/os-release 查看系统发行版详情 cat /etc/redhat-release
uname -r 查看内核版本 uname -r
date 显示/设置系统时间 date +"%F %T"
timedatectl 管理系统时区与时间同步 timedatectl set-timezone Asia/Shanghai
hostnamectl 修改主机名(永久生效) hostnamectl set-hostname nginx01
用户与权限管理
  • 用户操作

    bash 复制代码
    useradd webadmin && passwd webadmin # 创建用户并设密码 
    usermod -aG nginx webadmin # 加入nginx组 
    sudo visudo # 配置sudo权限
  • 文件权限

    bash 复制代码
    chmod 750 /var/www/html # 设置目录权限 
    setfacl -m u:nginx:rx /etc/nginx # 添加ACL权限
软件包管理
系统类型 安装命令 示例
RHEL/CentOS dnf install dnf install nginx -y
Ubuntu apt install apt install nginx
源码编译 ./configure && make
网络配置
bash 复制代码
nmcli con add type ethernet ifname eth0 con-name eth0 # 创建连接 
nmcli con mod eth0 ipv4.addresses 192.168.1.100/24 # 配置IP 
nmcli con up eth0 # 激活连接
文件管理
bash 复制代码
find /etc -name "*.conf" -mtime -7 # 查找7天内修改的.conf文件 
tar czvf nginx_conf.tar.gz /etc/nginx # 打包配置目录 
rsync -avz ./nginx root@backup:/backup # 远程同步

二、Nginx 服务部署与配置

安装方式对比
方式 优点 缺点 适用场景
包管理器安装 快速、自动解决依赖 版本可能较旧 快速部署标准环境
源码编译安装 定制化高、优化性能 步骤复杂、需手动管理 生产环境性能优化
核心配置文件
bash 复制代码
# /etc/nginx/nginx.conf 主结构 
user nginx; 
# 运行用户 
worker_processes auto; 
# 工作进程数(建议=CPU核心数) 
error_log /var/log/nginx/error.log warn; 
# 错误日志级别 
events
{ 
worker_connections 1024; # 单个进程最大连接数 
} 
http 
{ 
include /etc/nginx/mime.types; 
default_type application/octet-stream; # 日志格式定制 
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status$body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; 
access_log /var/log/nginx/access.log main; # 性能优化参数 
sendfile on; tcp_nopush on; 
keepalive_timeout 65; # 子配置引入 
include /etc/nginx/conf.d/*.conf; 
}
虚拟主机配置(多站点支持)

场景1:基于域名

bash 复制代码
/etc/nginx/conf.d/site1.conf server { listen 80; server_name www.example.com; root /var/www/site1; index index.html; location / { try_files $uri $uri/ =404; } }

场景2:基于端口

bash 复制代码
server { 
listen 8080; 
server_name _;
 root /var/www/admin; 
auth_basic "Restricted"; 
auth_basic_user_file /etc/nginx/htpasswd; }
高级功能配置

① 状态监控页面

bash 复制代码
location /nginx_status { stub_status on; 
access_log off; 
allow 192.168.1.0/24; 
deny all; }

输出示例:

复制代码
Active connections: 3 
server accepts handled requests
 45 45 78 
Reading: 0 Writing: 1 Waiting: 2

② Gzip 压缩优化

bash 复制代码
ip_min_length 1k;
 gzip_comp_level 6;
 gzip_types text/plain text/css application/json; 
gzip_vary on;

③ 防盗链配置

bash 复制代码
location ~* \.(jpg|png)$ { 
valid_referers none blocked *.mydomain.com;
 if ($invalid_referer) {
 return 403; # rewrite ^/.*$ http://anti-theft.mydomain.com/403.jpg;
 } 
}

④ HTTPS 加密部署

bash 复制代码
server { listen 443 ssl; 
server_name secure.mydomain.com; 
ssl_certificate /etc/nginx/ssl/server.crt;
 ssl_certificate_key /etc/nginx/ssl/server.key; # HSTS 安全增强 
add_header Strict-Transport-Security "max-age=31536000; 
includeSubDomains" always; 
location / { root /var/www/secure; 
} 
}

三、安全加固

SSH 安全策略
bash 复制代码
 #/etc/ssh/sshd_config 
PermitRootLogin no # 禁止root登录
 PasswordAuthentication no # 关闭密码登录 
AllowUsers webadmin@192.168.* # IP白名单限制
Nginx 安全防护
bash 复制代码
# 隐藏版本信息 
server_tokens off; 
# 防止敏感文件泄露 
location ~ /\.(env|git) { deny all; } 
# CSP内容安全策略 
add_header Content-Security-Policy "default-src 'self'; 
script-src 'nonce-xxxx'";

四、关键问题

问题现象 排查命令 解决方案
502 Bad Gateway tail -f /var/log/nginx/error.log 检查后端服务状态及代理配置
连接数飙升 ss -s `netstat -ant grep ESTAB`
SSL握手失败 openssl s_client -connect domain:443 检查证书链完整性和加密套件兼容性
静态资源加载慢 curl -I URL 查看缓存头 配置expires缓存策略

五、实验

基于域名的虚拟主机配置
复制代码
第一步:恢复快照,安装nginx
bash 复制代码
[root@server ~]# setenforce 0 
[root@server ~]# systemctl stop firewalld 
[root@server ~]# systemctl disable firewalld 
[root@server ~]# yum install nginx -y 
[root@server ~]# systemctl start nginx # 启动httpd 
[root@server ~]# systemctl enable nginx # 设置开机启动
第二步:创建网站目录
bash 复制代码
[root@server ~]# mkdir -p /www/{a,b} 
[root@server ~]# echo "www.a.com" > /www/a/index.html 
[root@server ~]# echo "www.b.com" > /www/b/index.html
第三步:创建虚拟主机配置文件
bash 复制代码
[root@server ~]# vim /etc/nginx/conf.d/a.conf server { listen 80; server_name www.a.com;
 # 第一个域名 location / { root /www/a; # 网站目录位置 index index.html index.htm; } } 
[root@server ~]# vim /etc/nginx/conf.d/b.conf server { listen 80; server_name www.b.com;
 # 第二个域名 location / { root /www/b; index index.html index.htm; } }
  • 第四步:检查配置文件后重启服务
bash 复制代码
[root@server ~]# nginx -t
[root@server ~]# nginx -s reload
  • 第五步:windows配置域名解析
bash 复制代码
# 修改C:\Windows\System32\drivers\etc\hosts文件 
192.168.48.130 www.a.com 
192.168.48.130 www.b.com
  • 第六步:测试

在浏览器中输入 www.a.com 和 www.b.com 测试

基于端口的虚拟主机配置

第一步:准备配置文件
bash 复制代码
[root@server ~]# vim /etc/nginx/conf.d/a.conf server { 
listen 80; server_name www.a.com; # 第一个域名 
location / { root /www/a; # 网站目录位置 
index index.html index.htm; 
}
 } 
root@server ~]# vim /etc/nginx/conf.d/b.conf server { 
listen 8080; # 修改端口 
server_name www.b.com; # 第二个域名 
location / { root /www/b; index index.html index.htm;
 } 
}
第二步:检查配置并重启服务
bash 复制代码
[root@server ~]# nginx -t 
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful 
[root@server ~]# nginx -s reload
第三步:测试

浏览器访问 www.a.com:80 和 www.b.com:8080

基于IP地址的虚拟主机配置

第一步:给服务器增加一张网卡(VMware中操作)

虚拟机设置---添加---网络适配器---完成

第二步:查看网卡信息
bash 复制代码
[root@server ~]# nmcli device 
DEVICE TYPE STATE CONNECTION ens33 ethernet 连接的 ens33 ens38 ethernet 已断开 -- lo loopback 管理的 lo
第三步:激活网卡
bash 复制代码
[root@server ~]# nmcli connection add type ethernet ifname ens38 con-name ens38 
# 新建连接名称为ens38 连接"ens38"(c9f7c7ca-8c9b-4c8b-9b5f-5f5d9d5f5d5f) 已成功添加。 
[root@server ~]# nmcli connection up ens38 
# 激活连接 连接已成功激活(D-Bus 活动径:/org/freedesktop/NetworkManager/ActiveConnection/5)
第四步:配置IP地址
bash 复制代码
[root@server ~]# nmcli connection modify ens38 ipv4.addresses 192.168.48.140/24 ipv4.method manual 
[root@server ~]# nmcli connection down ens38 [root@server ~]# nmcli connection up ens38
第五步:检查IP地址
bash 复制代码
[root@server ~]# ip a

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:0c:29:8a:1f:58 brd ff:ff:ff:ff:ff:ff inet 192.168.48.130/24 brd 192.168.48.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe8a:1f58/64 scope link valid_lft forever preferred_lft forever 3: ens38: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:0c:29:8a:1f:62 brd ff:ff:ff:ff:ff:ff inet 192.168.48.140/24 brd 192.168.48.255 scope global noprefixroute ens38 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe8a:1f62/64 scope link valid_lft forever preferred_lft forever
第六步:配置虚拟主机
bash 复制代码
修改虚拟主机配置文件 
[root@server ~]# vim /etc/nginx/conf.d/a.conf 
server { 
listen 80; server_name www.a.com; # 第一个域名 
location / { root /www/a; # 网站目录位置 
index index.html index.htm; 
}
 } 
[root@server ~]# vim /etc/nginx/conf.d/b.conf 
server { listen 80; # 端口相同 
server_name www.b.com; # 第二个域名 
location / { root /www/b; 
index index.html index.htm; 
}
 }
第七步:检查配置并重启服务
bash 复制代码
[root@server ~]# nginx -t 
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful 
[root@server ~]# nginx -s reload
第八步:测试

修改windows的hosts文件: 192.168.48.130 www.a.com 192.168.48.140 www.b.com 浏览器中输入: http://192.168.48.130 http://192.168.48.140

配置nginx状态页面
第一步:修改配置文件
bash 复制代码
[root@server ~]# vim /etc/nginx/nginx.conf 
server { listen 80 default_server; 
listen [::]:80 default_server;
 server_name _;
 root /usr/share/nginx/html; 
# Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { } error_page 404 /404.html; location = /404.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } location = /status { stub_status; } }
  • 第二步:检查配置文件后重启服务
bash 复制代码
[root@server ~]# nginx -t 
[root@server ~]# nginx -s reload
  • 第三步:测试
bash 复制代码
[root@server ~]# curl localhost/status 
Active connections: 1 server accepts handled requests 1 1 1 Reading: 0 Writing: 1 Waiting: 0 # 解析: Active connections:当前活动的连接数(客户端与服务器建立的连接数)。 server:表示Nginx启动以来共处理了1个连接(accepts)。 handled:成功的连接数(handled connections)。通常这个值与accepts相同,除非达到了一些资源限制(如worker_connections限制)。 requests:客户端总共发起了1个请求(requests)。 Reading:Nginx正在读取请求头的连接数。 Writing:Nginx正在将响应写回客户端的连接数。 Waiting:空闲连接(等待客户端发送请求)的数量。
日志管理

访问日志:access.log

错误日志:error.log

配置文件:
bash 复制代码
[root@server ~]# vim /etc/nginx/nginx.conf
access_log /var/log/nginx/access.log main; # 访问日志存放路径及格式 error_log 
/var/log/nginx/error.log notice; # 错误日志级别
日志格式
nginx默认的日志格式
bash 复制代码
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
各变量的含义
变量名称 含义
$remote_addr 客户端的IP地址(如果中间有代理服务器,该地址为代理服务器地址)
$remote_user 用于HTTP认证的用户名,记录已经经过验证的用户名
$time_local 本地时间,日志记录的时间
$request 请求的URL和HTTP协议,如:GET /index.html HTTP/1.1
$status 响应状态码
$body_bytes_sent 发送给客户端的字节数,不含响应头的大小
$http_referer 记录从哪个页面链接访问过来的。如果直接在浏览器输入URL,则referer为空
$http_user_agent 客户端浏览器信息
$http_x_forwarded_for 客户端IP地址列表(中间以逗号分隔)。经过代理时,代理服务器会在头部加上原始客户端IP地址列表
日志切割备份
bash 复制代码
[root@server ~]# vim /etc/logrotate.d/nginx 
/var/log/nginx/*log { create 0644 nginx nginx daily rotate 10 missingok notifempty compress sharedscripts postrotate /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true endscript }
配置网页压缩
第一步:修改配置文件
bash 复制代码
[root@server ~]# vim /etc/nginx/nginx.conf 
gzip on; # 开启压缩 
gzip_min_length 1k; # 超过1k的文件开始压缩 
gzip_comp_level 6; # 压缩级别,1-9,越大压缩率越高,消耗CPU也越高 
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; # 指定文件类型压缩 gzip_vary on; # 是否发送"Vary: Accept-Encoding"响应头,告知客户端是否压缩
第二步:检查配置并重启服务
bash 复制代码
[root@server ~]# nginx -t 
[root@server ~]# nginx -s reload
第三步:测试
bash 复制代码
[root@server ~]# curl -I -H "Accept-Encoding: gzip, deflate" http://192.168.48.130 
HTTP/1.1 200 OK Server: nginx/1.14.1 Date: Wed, 23 Mar 2022 06:46:48 GMT Content-Type: text/html Last-Modified: Tue, 22 Mar 2022 07:33:31 GMT Connection: keep-alive Keep-Alive: timeout=65 ETag: W/"6239a00b-19" Content-Encoding: gzip # 显示压缩
配置防盗链
第一步:准备测试页面
bash 复制代码
# 服务器(192.168.48.130)上的测试页面,其中包含一张图片 
[root@server ~]# mkdir /www 
[root@server ~]# vim /www/index.html 
<html> <head> <title>防盗链测试</title> </head> <body> <h1>这是一张图片</h1> <img src="1.jpg"> </body> </html> # 将一张图片放到/www目录下,图片名称1.jpg 
[root@server ~]# cp /root/anaconda-ks.cfg /www/1.jpg
第二步:配置虚拟主机
bash 复制代码
[root@server ~]# vim /etc/nginx/conf.d/daolian.conf 
server { listen 80; server_name www.test.com; location / { root /www; index index.html; } }
第三步:重启服务并测试
bash 复制代码
[root@server ~]# nginx -t 
[root@server ~]# nginx -s reload # windows配置hosts文件解析: 192.168.48.130 www.test.com
第四步:使用其他主机(192.168.48.131)测试盗链
bash 复制代码
# 在192.168.48.131上搭建nginx服务(过程略),编辑测试页面: 
[root@node1 ~]# vim /usr/share/nginx/html/index.html 
<html> <head> <title>盗链测试</title> </head> <body> <h1>盗链测试</h1> <img src="http://www.test.com/1.jpg"> </body> </html> # 在windows浏览器中打开192.168.48.131,查看图片是否显示
第五步:配置防盗链
bash 复制代码
[root@server ~]# vim /etc/nginx/conf.d/daolian.conf 
server { listen 80; server_name www.test.com; location / { root /www; index index.html; valid_referers none blocked *.test.com test.com; if ($invalid_referer) { return 403; } } }
第六步:重启服务并测试
bash 复制代码
[root@server ~]# nginx -t 
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful 
[root@server ~]# nginx -s reload # 重新在windows中访问192.168.48.131,图片无法显示(403 forbidden)
第七步:设置盗链后的替代图片
bash 复制代码
修改防盗链配置规则 
[root@server ~]# vim /etc/nginx/conf.d/daolian.conf 
server { listen 80; server_name www.test.com; location / { root /www; index index.html; valid_referers none blocked *.test.com test.com; if ($invalid_referer) { rewrite ^(.*)$ /2.jpg break; } } } # 准备一张替代图片放到/www目录下 
[root@server ~]# cp /root/initial-setup-ks.cfg /www/2.jpg
第八步:重启服务并测试
bash 复制代码
[root@server certs]# nginx -t 
[root@server certs]# nginx -s reload

# 重新在浏览器中打开192.168.48.131,图片显示为替代图片

配置重定向
永久重定向(301)
  • 将原有网站重定向到另一个网站。例如:将旧域名重定向到新域名,旧目录重定向到新目录。
bash 复制代码
server { listen 80; server_name www.old.com; return 301 http://www.new.com$request_uri; }
临时重定向(302)
  • 临时将网站重定向到另一个网站。
bash 复制代码
server { listen 80; server_name www.old.com; return 302 http://www.new.com$request_uri; }
重定向到指定目录
bash 复制代码
server { listen 80; server_name www.test.com; location / { root /www; index index.html; } location /bbs/ { rewrite ^/bbs/(.*)$ /forum/$1 permanent; # 将/bbs目录重定向到/forum目录 } }
  • 实验测试:在服务器上创建目录
bash 复制代码
[root@server ~]# mkdir /www/forum 
[root@server ~]# echo "forum page" > /www/forum/index.html
重定向示例(http跳转到https)
bash 复制代码
server { listen 80; server_name www.test.com; return 301 https://$server_name$request_uri; }
配置HTTPS
第一步:安装mod_ssl软件包
bash 复制代码
[root@server ~]# yum install mod_ssl -y
第二步:生成证书文件
bash 复制代码
[root@server ~]# cd /etc/pki/tls/certs/ 
[root@server certs]# ls ca-bundle.crt make-dummy-cert Makefile renew-dummy-cert 
[root@server certs]# make 
server.key # 生成私钥 umask 77 ; \ /usr/bin/openssl genrsa -aes128 2048 > server.key Generating RSA private key, 2048 bit long modulus (2 primes) .................. e is 65537 (0x010001) Enter pass phrase: # 输入私钥密码,比如123456 Verifying - Enter pass phrase: # 再次输入 [root@server certs]# make server.crt # 生成证书 umask 77 ; \ /usr/bin/openssl req -utf8 -new -key server.key -x509 -days 365 -out server.crt Enter pass phrase for server.key: # 输入私钥的密码123456 You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:SC Locality Name (eg, city) [Default City]:CD Organization Name (eg, company) [Default Company Ltd]:test Organizational Unit Name (eg, section) []:test Common Name (eg, your name or your server's hostname) []:www.test.com Email Address []:admin@test.com
第三步:配置SSL虚拟主机
bash 复制代码
[root@server certs]# vim /etc/nginx/conf.d/ssl.conf 
server { listen 443 ssl; server_name www.test.com; ssl_certificate /etc/pki/tls/certs/server.crt; ssl_certificate_key /etc/pki/tls/certs/server.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root /www; index index.html index.htm; } }
第四步:重启服务
bash 复制代码
[root@server certs]# nginx -t 
[root@server certs]# nginx -s reload
第五步:测试

windows浏览器访问:https://192.168.48.130

相关推荐
YH行业报告分析15 分钟前
2026电缆铺设设备市场:自动化敷设与电网升级驱动增长
运维·自动化
ajassi20001 小时前
AI语音智能体开发日记(十八)智能体服务器xiaozhi-esp32-server源码部署指南
运维·服务器·人工智能·ai·ai编程
‎ദ്ദിᵔ.˛.ᵔ₎1 小时前
linux 进程信号(下)
linux·运维·服务器
Mikko72 小时前
Linux 磁盘满了但 du 找不到?LVM 扩容 df 不变?fstab 写错开不了机?三台真机实测磁盘排查
linux·运维·centos
蓝胖的四次元口袋2 小时前
Jenkins知识梳理(2)
运维·jenkins
yumgpkpm2 小时前
Acceldata ODP 3.3.6.4 vs CDP Private Cloud Base 7.3.2 对比
大数据·运维·服务器·hadoop·华为·zookeeper·hbase
Liuqy-052 小时前
特殊进程——孤儿、僵尸、守护进程
linux·运维·服务器
code_slave(码畜)2 小时前
微服务架构落地:消息队列架构设计(下篇)——消息堆积、死信治理与集群监控告警实战
spring boot·spring cloud·微服务·云原生·中间件·架构
考研保研资料分享3 小时前
自动化控制保研经验合辑:上交夏令营、北工大预推免与跨专业面试复盘(2025)
运维·面试·自动化
乐维_lwops3 小时前
2026选择运维监控系统时应该重点考察哪些功能?
大数据·运维·人工智能