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

相关推荐
好奇的菜鸟1 分钟前
在 WSL 中安装 Docker
运维·docker·容器
x***440123 分钟前
linux 设置tomcat开机启动
linux·运维·tomcat
2301_8049475832 分钟前
nginx的https的搭建
运维·nginx·https
K***430634 分钟前
httpslocalhostindex 配置的nginx,一刷新就报404了
运维·nginx
正在努力的小河42 分钟前
Linux 块设备驱动实验
linux·运维·服务器
h***67371 小时前
Prometheus(普罗米修斯)----- Nginx监控
运维·nginx·prometheus
颜颜yan_1 小时前
基于CANN多Stream异步执行的智能推理管道:突破传统串行瓶颈
运维·架构·stream·昇腾·cann
wadesir1 小时前
Nginx配置文件CPU优化(从零开始提升Web服务器性能)
服务器·前端·nginx
j***49562 小时前
Linux(CentOS)安装 Nginx
linux·nginx·centos
SoleMotive.2 小时前
1、nginx反向代理了解吗?怎么配置nginx服务器?nginx负载均衡的算法都有哪些? 2、后端服务器宕机了,nginx服务器是怎么检查的
服务器·nginx·负载均衡