一、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 |
用户与权限管理
-
用户操作
bashuseradd webadmin && passwd webadmin # 创建用户并设密码 usermod -aG nginx webadmin # 加入nginx组 sudo visudo # 配置sudo权限 -
文件权限
bashchmod 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