## 1 配置yum源
“`sh
[root@web01 ~]# cat /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[root@web01 ~]# yum install -y nginx
[root@web01 ~]# systemctl enable –now nginx
“`
### 2 部署第二个网站
| 网站要求 | 说明 |
| ———- | ————————————— |
| 域名 | bird.ysllinx.cn |
| 站点目录 | /app/code/bird |
| 子配置文件 | /etc/nginx/conf.d/bird.ysllinux.cn.conf |
| 代码来源 | bird.tar.gz |
nginx只处理静态资源:
html 人
css 衣服
js 特效
动态资源这里是指:用户上传,用户注册,用户评论等等
“`sh
[root@web01 /etc/nginx/conf.d]# cat bird.ysllinux.cn.conf
server {
listen 8080;
server_name bird.ysllinux.cn;
root /root/code/bird;
location / {
index index.html;
}
}
“`
### 3 流程
1、nginx完成部署与测试;
2、根据要求创建自配置文件,准备环境;
3、检查语法后重启
4、hosts文件解析
### 4 ngx核心功能讲解
#### 1 配置文件
/etc/nginx/nginx.conf
##### 1 主配置文件
“`sh
user nginx; #指定nginx所属用户,工具人进程用户
worker_processes auto; #工具人进程
error_log /var/log/nginx/error.log notice; #ngx错误日志路径及级别
pid /var/run/nginx.pid #pid文件
events {
worker_connections 1024; #每个工具人进程最大连接数
}
http {
include /etc/nginx/mime.types; #引用的媒体类型
default_type application/octet-stream; #设置默认的媒体类型
logformat main ‘remote_addr-$remote_user [$time_local] $request’
‘$status $body_types_sent “$http_referer”‘
‘”$http_user_agent” $http_x_forwarded_for’; #指定nginx访问日志格式,格式叫做main,访问里面记录什么内容
access_log /var/log/nginx/access.log main; #使用日志路径,main格式
sendfile on; #提高nginx性能
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf; #引用子配置文件
}
“`
[老男孩教育-最新架构-WEB服务-NGX-nginx.conf| ProcessOn免费在线作图,在线流程图,在线思维导图](https://www.processon.com/view/link/6679326da1d80a3c06ff5575)
\Typora\006-nginx\image-20250107124752793.png)
##### 2 子配置文件
| 网站中常用必会指令 | 说明 |
| —————— | ———————————————————— |
| listen | 指定监听端口 |
| server_name | 指定域名,多个通过空格分隔 |
| location | 匹配请求中的uri,资源地址 |
| root | 指定站点目录,网站的根目录 |
| index | 指定站点的首页文件,用户访问的时候不加任何文件,展示首页文件 |
| error_log | 指定错误状态码与对应的错误页面 |
“`sh
如果站点目录不存在,进行访问会发生什么? 404 Not Found
如果首页文件不存在,进行访问会发生什么? 403 Forbidden
查看错误日志: error.log
“`
\Typora\006-nginx\image-20250107124804175.png)
“`sh
用户请求nginx详细描述
1、dns解析,将域名解析成ip
2、通过ip+端口,三次捂手建立连接
3、http请求
GET / HTTP1.1
Host:域名
User-Agent:UA头,用户浏览器
4、请求通过建立的连接80端口,到达ngx,ngx开始处理,http区域处理
5、用户请求的域名与http配置文件里面的server_name部分匹配
如果匹配成功,则对应的server处理用户请求
如果匹配失败,默认的default_server标记或按照顺序匹配第一个,按名字abc顺序
6、站点处理用户请求时候根据用户请求的uri+站点目录进行处理
7、处理完成后把结果发回给用户
“`
\Typora\006-nginx\image-20250107124841904.png)
##### 3 设置网站的默认站点
“`sh
server {
listen 80 default_server; #标记当前的站点是默认的.
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
“`
uri
例:http://bird.ysllinux.cn uri就是斜线
nginx处理的时候是uri+站点目录,/index.html+/app/code/bird/
index index.html;首页文件
### 5 ngx核心功能详解
#### 1 虚拟主机
虚拟主机:相当于是一个网站,在ngx中通过server{}区域实现
ngx中虚拟主机有不同的类型
#### 2 概述与分类
| 虚拟主机的分类 | 说明 | 应用场景 |
| —————— | ———————— | ———————————————— |
| 基于域名的虚拟主机 | 不同域名,访问不同的站点 | 生产环境最常用 |
| 基于端口的虚拟主机 | 不同端口访问不同站点 | 保护,设置1024以上端口 |
| 基于ip的虚拟主机 | 不同ip访问不同的站点 | 保护,用户只能通过某个ip连接进来,一般适用于内网 |
#### 3 搭建网站流程
“`sh
1、准备子配置文件与检查语法
2、准备目录
3、准备代码,解压过去
4、hosts解析与调试
5、不通域名访问不同主机
“`
#### 4 基于域名的虚拟主机
案例02-创建conf.ysllinux.cn
站点目录/app/code/conf/
“`sh
1、完成后不出案件站点目录进行访问看看报什么错误
没有网站目录,报错404
2、创建站点目录后再访问看看报什么错误
没有首页文件,报错403
3、查看首页文件和内容,访问看看显示什么
[root@web01 /etc/nginx/conf.d]# cat game.ysllinux.cn.conf
server {
listen 80;
server_name game.ysllinux.cn;
root /app/code/game/;
location / {
index index.html;
}
}
本地测试小技巧
curl -H Host:game.ysllinux.cn http://192.168.137.7
-H修改请求头里的内容
“`
#### 5 基于ip的虚拟主机
“`sh
[root@web01 /etc/nginx/conf.d]# cat game.ysllinux.cn.conf
server {
listen 172.16.1.7:8848;
server_name game.ysllinux.cn;
root /app/code/game/;
location / {
index index.html;
}
}
“`
#### 5 案例03-给每个虚拟主机指定自己的错误日志
“`sh
[root@web01 /etc/nginx/conf.d]# cat game.ysllinux.cn.conf
server {
listen 80;
server_name game.ysllinux.cn;
root /app/code/game/;
access_log /etc/nginx/logs/access/game.ysllinux.cn.access.log main;
error_log /etc/nginx/logs/error/game.ysllinux.cn.error.log notice;
location / {
index index.html;
}
}
“`
### 6 ngx日志
| 日志 | 使用建议 | 定义 | 使用 |
| ——– | ———————————- | ——————————– | ———- |
| 错误日志 | 发生错误的时候可以查看 | 通过错误级别指定 | error_log |
| 访问日志 | 记录着用户什么时候访问,用户信息等 | 公共log_format定义访问日志的格式 | access_log |
#### 1 错误日志
指定错误日志的位置和错误级别
格式:error_log 文件名 错误日志级别;
指令放在哪:main,http,mail,stream,server,location
#### 2 错误日志级别
debug,info,notice,warn,error,crit,alert,or emerg
error是默认的
notice是推介的
debug是开发调试使用,临时开启
#### 3 访问日志
访问日志主要用来分析
访问日志是记录用户信息的宝藏
格式:
log_format 格式名字 格式
放在http
#### 4 内置变量
| ngx内置变量 | 说明 |
| ——————— | —————————————————- |
| $remote_addr | 客户端ip地址 |
| $remote_user | 用户名,nginx进行认证用户 |
| $time_local | 时间 |
| $request | 请求报文,请求起始行,(GET URI HTTP/1.1) |
| $status | http状态码 |
| $body_bytes_sent | 响应给客户的文件大小,响应报文主体大小,单位字节byte |
| $http_referer | 从哪里跳转来访问到这个网站的 |
| $http_user_agent | UA客户端代理(浏览器) |
| $http_x_forwarded_for | xff头,使用负载时记录真是ip地址 |
| 其他常用ngx变量 | |
| $requst_method | 请求方法 |
| $uri | 请求中的uri部分 |
access_log指定日志,使用对应格式
使用方法
access_log 日志位置 格式;
放在哪
http,server,localtion if in location,limit_execpt
#### 5 access_log其他选项
| access_log | 说明 |
| —————- | ———————————————————— |
| access_log off | 关闭访问日志一般要配合if或location精确匹配与处理,access_log off或access_log /dev/null |
| 访问日志进行压缩 | gzip文件需要通过zcat/zless/zgrep查看 |
| 进行缓存 | buffer = 32k ,先把日志写入到内存中,定期写入磁盘 |
| 定时刷新 | flush = 10s |
| | 进行缓存和定时刷新哪个先满足就执行哪个 |
access_log /var/log/nginx/bird.ysllinux.cn-access.log main gzip buffer=32k flush=10s
### 7 案例-05搭建大型直播购物网站
“`sh
域名:buy.ysllinux.cn
站点目录:/app/code/buy/
用户首页文件:/app/code/buy/index.html
后台管理页面:/app/code/buy/admin/index.html
要求后台只能内网访问:172.16.1.0/24网段.
[root@web01 /etc/nginx/conf.d]# cat buy.ysllinux.cn.conf
server {
listen 80;
server_name buy.ysllinux.cn;
access_log /etc/nginx/logs/access/buy.ysllinux.cn.access.log main;
error_log /etc/nginx/logs/error/buy.ysllinux.cn.error.log notice;
root /app/code/buy/;
location / {
index index.html;
}
location /admin/ {
allow 172.16.1.0/24;
deny all;
}
}
“`
### 8 案例06:搭建bird小鸟飞飞网站,给网站加速,设置缓存,网站中html,js,css结尾的文
件缓存1天,图片缓存1小时. 浏览器缓存.
“`sh
[root@web01 /etc/nginx/conf.d]# cat bird.buffer.ysllinux.cn.conf
server {
listen 8080;
server_name bird.buffer.ysllinux.cn;
root /app/code/bird/;
location / {
index index.html;
}
location ~* \.(jpg|jpeg|png|gif|bmp)$ {
expires 1h;
}
location ~* \.(html|js|css)$ {
expires max;
}
}
“`
### 9 查看缓存多久
F12-网路-查看右边cache
如果没有F12-选中右键-响应头-cache-control
案例07-部署china站点
“`sh
[root@web01 /etc/nginx/conf.d]# cat china.ysllinux.cn.conf
server {
listen 80;
server_name china.ysllinux.cn;
access_log /etc/nginx/logs/access/china.ysllinux.cn.access.log main;
error_log /etc/nginx/logs/access/china.ysllinux.cn.error.log notice;
root /app/code/china/;
location / {
index index.html;
}
}
“`
\Typora\006-nginx\image-20250107125229416.png)
\Typora\006-nginx\image-20250107125235576.png)
补充打开浏览器F12显示是否缓存的方法:
\Typora\006-nginx\image-20250107125256161.png)
### 10 location概述
#### 1 ngx的location规则
在ngx用于匹配用户请求中的uri,ngx对用户请求中的uri进行判断;
如果请求的uri是xxx则做xxx;
接下来详细说说location规则
url网址https://nginx.org/en/docs/
uri:/en/docs/
http://www.baidu.com/ysl/ysl.avi
uri:/ysl/ysl.avi
url:http://www.baidu.com/ysl/ysl.avi
uri是/后面的内容
location匹配uri,location匹配目录,uri开头的部分;
location /admin/ {}匹配uri中admin开头的。
allow和deny先allow再deny
课后思考与测试,location /admin/匹配uri中包含/admin/还是以/admin/开头
buy.ysllinux.cn/admin #正常
buy.ysllinux.cn/ysladmin/ #404,原因,没有目录
buy.ysllinux.cn/img/admin/ #404,原因,没有目录
#### 2 小结
location规则与正则合用,perl正则
location ~* 正则
~ 区分大小写
~* 不区分大小写
expires 设置浏览器缓存
perl正则新写法
\d相当于[0-9]匹配数字
\w相当于[a-zA-Z0-9_]匹配所有和下划线
#### 3 location小结
| 序号 | location规则 | 说明 |
| —- | —————————- | ———————————————————— |
| 1 | location / {xxx} | 默认规则,保底,location规则在匹配的时候,其他规则都匹配失败了,这个时候匹配默认规则 |
| 2 | location /image/ {} | 用于匹配请求中的uri路径,bird.ysllinux.cn/image/ysl.txt |
| 3 | location ~ \.(jpg\|jpeg)$ {} | 支持正则,区分大小写 |
| 4 | location ~ .*(jpgjpeg)$ {} | 支持正则,不区分大小写 |
| 5 | location ^~ /ysl/ | 不区分正则,仅匹配普通字符,很少使用,优先 |
| 6 | location = /50x.html | 请求的uri与书写的内容一模一样,精确匹配,使用很少 |
| 7 | location @名字 | 命名的location,一般用于return/error_log内部跳转 |
#### 4 以后如果碰到错误页面,让开发写个好看点的
“`sh
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
这句话的意思是只要碰到500就显示/usr/share/nginx/html/50x.html页面
“`
#### 5 案例07-部署china代码
项目需求:
代码:china.tar.gz
站点目录:/app/code/china/
域名:china.buffer.ysllinux.cn
如果访问.js文件,设置1天缓存,站点目录设置为/app/code/china/js
如果访问.css文件,设置1天缓存,站点目录设置为/app/code/china/css
“`sh
server {
listen 80;
server_name china.buffer.ysllinux.cn;
access_log /etc/nginx/logs/access/china.buffer.ysllinux.cn.access.log main;
error_log /etc/nginx/logs/access/china.buffer.ysllinux.cn.error.log notice;
root /app/code/china/;
location / {
index index.html;
}
location ~* \.js$ {
root /app/code/china/js;
expires 1d;
}
location ~* \.css$ {
root /app/code/china/css;
expires 1d;
}
}
“`
#### 6 location匹配时的优先级
| 优先级 | location |
| —— | ——– |
| 1 | = |
| 2 | ^~ |
| 3 | ~ ~* |
| 4 | /image/ |
| 5 | / |
### 11 自建下载站
域名:v.ysllinux.cn
站点目录: /app/code/v/
touch 几个文件即可
温馨提示:不要创建首页文件
自动索引功能(列表站点目录的内容),首页文件不存在
#### 1 aotoindex模块
| autoindex | 应用场景 |
| ———————————————————— | ——————————- |
| autoindex on;开启目录索引功能(显示站点目录下的文件的列表,首页文件不存在) | 用户共享下载网站,配置内部yum源 |
| autoindex_localtime on;显示本地时间 | |
| autoindex_esact_size off;关闭精确大小,off表示以人类可读形式显示大小 | |
#### 2 nginx增加简单认证功能
增加一个svip目录,里面创建文件
增加认证功能(用户名密码)
auth_basic模块
“`sh
server {
listen 80;
server_name v.ysllinux.cn;
root /app/code/v/;
error_log /etc/nginx/logs/error/v.ysllinux.cn.error.log notice;
access_log /etc/nginx/logs/access/v.ysllinux.cn.access.log main;
charset utf8;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
location / {
index index.html;
}
}
location /svip/ {
auth_basic “input password:”;
auth_basic_user_file /etc/nginx/user;
location /status/ {
stub_status;
}
}
yum install -y httpd-tools
#创建文件
htpasswd -bc /etc/nginx/user ysl996 1
#增加用户
htpasswd -b /etc/nginx/user ysl 1
#修改权限
chmod 600 /etc/nginx/user
chown nginx.nginx /etc/nginx/user
“`
访问v.ysllinux.cn时出现以下信息
“`sh
Active connections: 2
server accepts handled requests
14 14 12
Reading: 0 Writing: 1 Waiting: 1
活跃连接数:2
服务器接受已处理的请求
14 14 12
正在阅读: 0 写入: 1 等待中: 1
“`
| ngx状态模块中的指标说明 | 说明 | 说明 |
| ———————– | —————————- | ———– |
| active connections | 当前已建立的连接数和等待数量 | 体现ngx并发 |
| server accepts | 已经接收到客户端的连接总是 | |
| handled | 服务端已经处理的连接数 | |
| requests | 客户端发出请求的总数 | |
| reading | 正在读取的请求头连接数量 | |
| writing | 正在进行的响应的连接数量 | |
| waiting | 排队情况 | |
### 12 ab压力测试功能 apache bench
ab -n 99999 -c 300 http://bird.ysllinux.cn
ab -n 9999 -c 3 -H -Host:v.ysllinux.cn http://192.168.137
-n 次数
-c 并发
### 13 总结
| 模块 | 模块中的核心命令 |
| ————— | —————————————— |
| 目录索引 | autoindex on; |
| 认证功能模块 | auto_basic_user_file; |
| 访问控制模块 | allow,deny |
| ngx状态检查模块 | stub_status |
| ngx核心模块 | root,location,error_log,server_name,listen |
| ngx日志模块 | access_log,log_format |
| …… | |
### 14 动态网站架构(部署一份开发的php代码)
| 网站架构 | 说明与特点 | 性能 | 一句话说明 |
| ——– | ——————————————————— | ———————————————————— | ————————————————– |
| 静态资源 | 网站仅仅包含html,css,js脚本,图片,视频 | 只需要web服务器即可,可以承受高访问量,不支持动态的功能:注册,评论,静态网站功能单一 | 浏览器解析,服务端仅仅负载发送 |
| 动态资源 | 动态网站一般是通过开发语言实现:java,php,python,golang | 动态资源页面需要服务器进行处理ngx+php/tomcat…+数据库,处理后把结果返回给用户 | 动态请求需要服务端进行处理与解析,把结果返回给用户 |
如何区分动态资源和静态资源
动态资源uri一般包含&?
静态资源uri一般包含php,jsp
#### 1 项目01-lnmp环境部署在1台机器
条件
nginx1.26.1
php2
mairadb 10.3
“`sh
1、数据库
web01
mairadb
yum install -y mariadb-server
systemctl enable –now mariadb
mysql_secure_installation
输入
Enter current password for root (enter for none):回车
Set root password? [Y/n] Y设置密码
New password: 输入密码
Re-enter new password: 再次输入
Password updated successfully!
Reloading privilege tables..
… Success!
Remove anonymous users? [Y/n] Y 删除数据库中的匿名用户(没有用户名
的用户,容易导致安全问题)
Disallow root login remotely? [Y/n] Y 是否禁止root远程登录
Remove test database and access to it? [Y/n] Y 是否删除test测试
用的数据库
Reload privilege tables now? [Y/n] Y 是否更新权限信息表
查看库里所有的表
show tables from mysql;
user用户名
host用户白名单,用户可以从哪里登录. 用户是否可以从指定的ip或网段登录. 一般只
能本地登录.
select user,host from mysql.user;
MariaDB [(none)]> select user,host from mysql.user;
+——+———–+
| user | host |
+——+———–+
| root | 127.0.0.1 |
| root | ::1 |
| root | localhost |
+——+———–+
3 rows in set (0.000 sec)
MariaDB [(none)]> create database wordpress;
Query OK, 1 row affected (0.000 sec)
MariaDB [(none)]> grant all on wordpress.* to ‘wordpress’@’172.16.1.%’ idetified by ‘XZnh@95599’;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘idetified by ‘XZnh@95599” at line 1
MariaDB [(none)]> grant all on wordpress.* to ‘wordpress’@’172.16.1.%’ identified by ‘XZnh@95599’;
Query OK, 0 rows affected (0.000 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.000 sec)
2、php安装
清理已经安装php
systemctl stop php-fpm
yum -y remove php*
yum -y install php php-bcmath php-cli php-common php-devel php-embedded php-fpm php-gd php-intl php-mbstring php-mysqlnd php-opcache php-pdo php-process php-xml php-json
[root@web01 /etc]# systemctl enable –now php-fpm
/etc/php-fpm.conf #主配置文件
/etc/php-fpm.d
/etc/php-fpm.d/www.conf #子配置文件,修改目标
使用rpm -ql php-fpm查看
[root@web01 /etc]# egrep -n ‘^(user|group|listen =)’ /etc/php-fpm.d/www.conf
24:user = nginx
26:group = nginx
38:listen = 127.0.0.1:9000
检查语法:
php-fpm -t 看是否有successful
#8.重启服务或reload都行
systemctl restart php-fpm.service
3、下载wordpress
wget https://wordpress.org/latest.zip
unzip latest.zip -d /app/code/blog/
4、配置nginx
server {
listen 80;
server_name blog.ysllinux.cn;
error_log /etc/nginx/logs/error/blog.ysllinux.cn.error.log notice;
access_log /etc/nginx/logs/access/blog.ysllinux.cn.access.log main;
root /app/code/blog/;
location / {
index index.php;
}
location ~* \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
浏览器访问blog.lodboylinux.cn
总结:注意相关目录文件权限,/app/code/blog/目录,将下载的文件放入此目录,注意nginx配置文件时conf结尾
如果要配置客户端上传文件大小需要修改nginx和/etc/php.ini的配置文件
nginx http区需要添加以下配置
client_max_body_size 50m;
修改/etc/php.ini
post_max_size = 80M
upload_max_filesize = 80M
nginx http配置
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;
sendfile on;
这个指令启用了sendfile特性,它允许操作系统直接将文件内容从磁盘传输到网络,而不需要复制到用户空间。这样可以提高文件传输效率。
tcp_nopush on;
这个指令启用了TCP_NOPUSH选项,它告诉操作系统不要在TCP包中立即发送数据,而是等待更多的数据一起发送。这样可以减少TCP包的数量,提高网络效率。
tcp_nodelay on;
这个指令启用了TCP_NODELAY选项,它禁用了Nagle算法。Nagle算法会合并小的数据包以减少网络拥塞,但有时会导致延迟增加。禁用Nagle算法可以减少延迟,尤其是在需要实时性的应用中。
keepalive_timeout 65;
这个指令设置了TCP连接的保持活动超时时间。当一个连接在65秒内没有任何数据传输时,Nginx会关闭这个连接。这有助于释放不再使用的连接,避免资源浪费。
types_hash_max_size 4096;
这个指令设置了types_hash的最大大小。types_hash是一个哈希表,用于存储MIME类型。增加这个值可以提高查找MIME类型的效率,但同时也会消耗更多的内存。
“`
\Typora\006-nginx\image-20250107125353132.png)
\Typora\006-nginx\image-20250107125400015.png)
上图是处理静态和动态请求
#### 2 mysql备份与恢复
“`sh
[root@web01 /app/code/blog]# mysqldump -uroot -p –databases wordpress | gzip > /backup/blog.sql.gz
恢复
zcat /backup/blog.sql.gz | mysql -uroot -p wordpress
mysql -uroot -p wordpress < /backup/blog.sql
```
### 15 部署负载均衡进行配置
```sh
配置ngx作为负载均衡
[root@lb01 ~]# cat /etc/nginx/conf.d/blog.ysllinux.cn.conf
upstream blog_pools {
server 10.0.0.7:80;
server 10.0.0.8:80;
}
server {
listen 80;
server_name blog.ysllinux.cn;
error_log /var/log/nginx/blog.ysllinux.cn-error.log
notice;
access_log /var/log/nginx/blog.ysllinux.cn-access.log
main;
location / {
proxy_pass http://blog_pools;
proxy_set_header Host $http_host;
}
}
proxy_set_header:告诉 Nginx 要设置一个代理请求头
location / {
proxy_pass http://backend;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
在这个例子中,proxy_pass 指令告诉 Nginx 将请求转发到 http://backend。proxy_set_header 指令设置了四个不同的请求头:
Host:将客户端请求中的 Host 头部值传递给后端。
X-Real-IP:设置请求头 X-Real-IP 为客户端的 IP 地址。
X-Forwarded-For:添加或更新 X-Forwarded-For 请求头,包含客户端的 IP 地址。
X-Forwarded-Proto:设置请求头 X-Forwarded-Proto 为原始请求使用的协议(http 或 https)。
这些设置确保后端服务器能够接收到所有必要的信息,以便正确处理请求。
```
\Typora\006-nginx\image-20250107125456098.png)
\Typora\006-nginx\image-20250107125556856.png)
\Typora\006-nginx\image-20250107125620894.png)
#### 1 负载均衡指令与模块
2个模块:upstream与proxy
upstream指令
proxy_pass指令
proxy_set_header指令
proxy_pass把指令请求往后抛
proxy_pass http://10.0.0.7:80
proxy_pass http://分组名字(upstream)
#### 2 upstream写在http模块中,不能写在server,他们是并列的
```sh
[root@lb01 /etc/nginx/conf.d]# cat lb.lodboylinux.cn.conf
upstream lb_pools {
server 192.168.137.7:80;
server 192.168.137.8:80;
}
server {
listen 80;
server_name lb.lodboylinux.cn;
error_log /var/log/nginx/lb_error.log notice;
access_log /var/log/nginx/lb_access.log main;
location / {
proxy_pass http://lb_pools;
proxy_set_header Host $http_host;
}
}
```
#### 3 proxy_set_header:负载均衡多虚拟主机的故障案例
现象;web节点上有多个虚拟主机,负载均衡在转发数据的时候回出现访问异常,访问多个虚拟主机的默认的或第一个
原因:负载均衡向后端节点发出请求的时候,请求头中的host变成了upstream名字,相当于使用ip访问
解决:通过proxy_set_header指令修改负载到web节点的请求头
proxy_set_header Host $http_host
#### 4 proxy_set_header:经过负载均衡后web节点如何记录客户端真实ip地址
解决:增加xff请求头,X-Forwarded-For记录用户真实ip地址
在负载均衡上设置
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-Ip $remote_addr;
`X-Forwarded-For`用于在代理链中传递客户端的IP地址,而`X-Real-Ip`用于在Nginx和后端服务器之间传递客户端的真实IP地址。在配置这些请求头时,需要确保它们的使用是安全的,并且只对信任的代理开放。
### 16 网站架构优化方案:动静分离
#### 1 背景
随着网站访问量增加,我们发现网站的动态资源和静态资源,随着访问的
读多写少
我们采取动静分离方案
web服务器为动态服务器(ngx+php),静态服务器)(ngx)
#### 2 环境准备
| 环境准备 | 负载均衡 | ip |
| -------- | -------------- | ----------- |
| lb01 | 负载均衡 | 192.168.135 |
| web01 | 动态、默认请求 | 192.168.137 |
| web02 | 上传 | 192.168.138 |
| web03 | 静态请求 | 192.168.139 |
\Typora\006-nginx\image-20250107125639831.png)
#### 3 静态组(web03)
部署ngx
nfs服务端
部署代码
```sh
1.安装ngx
cat >>/etc/yum.repo.d/nginx.repo<
advert_int 1 #心跳间隔,多久发送一次vrrp数据包
authentication { #授权与认证,保持默认即可,对数据包加密
auth_type PASS #简单认证
auth_pass 1111 #111
}
virtual_ipaddress { #设置vip地址
192.168.137.3 dev ens33 label ens33:0 #label设置了别名
}
}
tcpdump抓包
tcpdump -vvv -nnn vrrp -w ~/vrrp.pcap
“`
#### 3 问题
1.脑裂
现象:主备都有vip
原因:
备认为主挂了,接管资源生成vip,实际上主并没有挂,仍有vip
有很多原因可以导致脑裂,开启防火墙,selinux,keepalived配置,物理线路
解决:
监控,备节点,只要备节点有vip就告警
找个第3放机器,在这个机器上执行ssh到备节点,查看是否存在vip
监控到备节点有vip就真的将主节点挂掉
在备节点上执行监控脚本,统计vip数量,判断如果等于1则发出邮件告警
案例01-keepalived基于主机高可用软件
问题:
keepalived只会在主机挂了,网络断开后才会进行主备切换
默认情况下keepalived不会监控某个服务
项目目标:某个服务关闭了,keepalived就进行主备切换
项目步骤
书写脚本,过滤服务进程数,端口数量,检查是否运行,curl或wget
然后在脚本中进行判断,如果服务没有运行,则关闭keepalived
修改keepalived配置文件,通过keepalived调用这个脚本,监控nginx
在keepalived中调用脚本
track_script {
keep_lb.sh
}
#### 4 keepalived双主模式
在主备的/etc/keepalived/keepalived.conf下都添加
“`sh
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb02
}
vrrp_instance vip_3 {
state BACKUP
interface ens33
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.137.3 dev ens33 label ens33:0
}
}
vrrp_instance vip_4 {
state MASTER
interface ens33
virtual_router_id 52
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.137.4 dev ens33 label ens33:1
}
}
“`
\Typora\006-nginx\image-20250107130045512.png)
\Typora\006-nginx\image-20250107130050383.png)
##### 1 非抢占模式
keepalived主备默认是抢占模式,主挂了,备接管,主恢复,不希望主重新抢回资源
流程
配置两个节点都是BACKUP
在state BACKUP下面添加一行
nopreempt
\Typora\006-nginx\image-20250107130056572.png)
### 3 https证书
#### 1 概述
“`sh
https == https over tls
基于http协议,传输的时候进行加密
如果不使用https,数据传输都是明文的
应用场景:
目前大部分企业的业务都是使用https加密
企业想使用http 2.0基于https
https加密的流程
1、域名*.jd.com www.jd.com
2、根据域名申请https证书(私钥和公钥(ca证书)),自己创建。(免费的https证书有效期为3个月)
3、进行配置web/lb
4、跳转http–https
“`
\Typora\006-nginx\image-2025011311584525png)
\Typora\006-nginx\image-20250113115915828.png)
#### 2 https申请
\Typora\006-nginx\image-20250113123724603.png)
\Typora\006-nginx\image-20250113123825770.png)
创建–填写信息,审核即可
#### 3 https加密流程和80跳转443
“`sh
申请的https证书的域名与网站域名一致才能正常使用
否则用户访问会有警告与提示
server {
listen 80;
server_name linux.yangsenlin.top;
return 301 https://linux.yangsenlin.top$request_uri;
}
server {
listen 8001 ssl;
server_name linux.yangsenlin.top;
root /app/code/blog/;
ssl_certificate /app/code/https/linux.yangsenlin.top.pem;
ssl_certificate_key /app/code/https/linux.yangsenlin.top.key;
location / {
index index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:8888;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
“`
#### 4 https认证原理
\Typora\006-nginx\image-20250113180044799.png)
\Typora\006-nginx\image-20250113180103529.png)
#### 5 命令行创建https证书
“`sh
#创建私钥 私钥server.key
openssl genrsa -idea -out server.key 2048
#根据私钥创建 证书 server.crt .pem证书
openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt
“`
#### 6 网站集群https配置
\Typora\006-nginx\image-20250113180326780.png)
“`sh
温馨提示: 用户–>负载加密(https) 负载到web未加密(http) 配置php网站的时候
有问题.
对php动态部分进行配置.
fastcgi_param HTTPS on; #前面部分的请求是https
“`
#### 7 网站集群全部配置https并配置http2.0
\Typora\006-nginx\image-20250114120216830.png)
“`sh
web01配置
server {
listen 443 ssl http2;
server_name ssl.ysllinux.cn;
root /app/code/ssl;
#ssl key
ssl_certificate
/etc/nginx/ssl_keys/ssl.ysllinux.cn.pem;
ssl_certificate_key
/etc/nginx/ssl_keys/ssl.ysllinux.cn.key;
location / {
index index.html;
}
}
lb01
upstream ssl_pools {
server 10.0.0.7:443 ;
}
server {
listen 80;
server_name ssl.ysllinux.cn;
return 301 https://ssl.ysllinux.cn$request_uri;
}
server {
listen 443 ssl http2;
server_name ssl.ysllinux.cn;
ssl_certificate
/etc/nginx/ssl_keys/ssl.ysllinux.cn.pem;
ssl_certificate_key
/etc/nginx/ssl_keys/ssl.ysllinux.cn.key;
location / {
proxy_pass https://ssl_pools;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For
$proxy_add_x_forwarded_for;
proxy_set_header X-Real-Ip $remote_addr;
}
}
“`
#### 8 网站集群部分配置https并配置http2.0
\Typora\006-nginx\image-2025011412025286png)
“`sh
web配置
server {
listen 80;
server_name ssl.ysllinux.cn;
root /app/code/ssl;
location / {
index index.html;
}
}
#lb配置
upstream ssl_pools {
server 10.0.0.7:80 ;
}
server {
listen 80;
server_name ssl.ysllinux.cn;
return 301 https://ssl.ysllinux.cn$request_uri;
}
server {
listen 443 ssl http2;
server_name ssl.ysllinux.cn;
#ssl keys
ssl_certificate
/etc/nginx/ssl_keys/ssl.ysllinux.cn.pem;
ssl_certificate_key
/etc/nginx/ssl_keys/ssl.ysllinux.cn.key;
location / {
proxy_pass http://ssl_pools; #注意
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For
$proxy_add_x_forwarded_for;
proxy_set_header X-Real-Ip $remote_addr;
}
}
温馨提示: 用户–>负载加密(https) 负载到web未加密(http) 配置php网站的时候
有问题.
对php动态部分进行配置.
fastcgi_param HTTPS on; #前面部分的请求是http
server {
listen 80;
server_name blog.ysllinux.cn;
root /app/code/blog;
error_log /var/log/nginx/blog-error.log notice;
access_log /var/log/nginx/blog-access.log main;
location / {
index index.php;
}
location ~* \.(html|js|css|jpg|png|jpeg)$ {
expires max;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param HTTPS on; #适用于 负载是https web是
http场景下添加.
#HTTPS on告诉php 请求是来自于
负载的https请求.
fastcgi_param SCRIPT_FILENAME
$document_root$fastcgi_script_name;
include fastcgi_params;
}
}
“`
#### 9 优化与监控
##### 1 优化
“`sh
server {
listen 443 ssl;
keepalive_timeout 70;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; #指定ssl
加密协议的版本
ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DESCBC3-SHA:RC4-MD5:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5; #加密算
法. 需要排除不安全的算法
#排除null空算法, md5算法
ssl_certificate /usr/local/nginx/conf/cert.pem;
ssl_certificate_key /usr/local/nginx/conf/cert.key;
#设置https 会话缓存 10MB大小的空间用于存储缓存.
ssl_session_cache shared:SSL:10m;
#超时时间 10分钟
ssl_session_timeout 10m;
…
}
“`
##### 2 监控
“`sh
监控方案(https证书是否过期)
1 命令行curl的方式监控,https证书已经部署到网站上并且可以访问
2 命令行openssl命令的方法监控,证书无法通过curl访问
脚本流程:
1 域名列表
2 通过命令获取证书的过期日期
3 与当前日期对比,30天之前,转换为秒
4 获得剩余的时间,如果小于30天就发送邮件告警
curl -Lv https://linux.yangsenlin.top:8001 -o /dev/null | & grep ‘expire date’
-o表示把curl命令的响应报文信息定向到指定位置,这里是/dev/null空
|& 表示把管道前面标准输出(正确)和标准错误输出 都传递给后面的命令.如果不加,默认传递标准输出(正确)
1 获取过期日期
export LANG=en_US.UTF-8
curl -Lv https://linux.yangsenlin.top:8001 -o /dev/null |& grep ‘expire date:’|awk -F ‘date:|GMT’ ‘{print $2}’
2 将过期日期转换为秒
date +%s -d ” `curl -Lv https://linux.yangsenlin.top:8001 -o /dev/null |& grep ‘expire date:’|awk -F ‘date:|GMT’ ‘{print $2}’`”
3 获取当前时间
date +%s
4 相减获取还有多少天过期
echo “(1691270161 – 1687142200)/60/60/24” |bc
脚本
#1.vars
export LANG=en_US.UTF-8
url=https://$1
warn=3000
#2.curl 获取日期
expire_date_ori=`curl -v $url |& grep ‘expire date’ |
awk ‘{print $4,$5,$(NF-1)}’`
expire_date_second=`date -d “${expire_date_ori}” +%s`
now_date_second=`date +%s `
#3.计算
days_left=`echo “($expire_date_second –
$now_date_second)/60/60/24” |bc`
#4.判断
if [ $days_left -le $warn ];then
echo “https证书$url,还有$days_left过期,请及时续费”
fi
此脚本可添加for循环
url_info=`cat /url_info.txt`
for url in $url_info
do
脚本命令
done
“`
### 4 nginx优化
合并PDF-2081页
#### 1 安全优化
| 优化说明 | 优化方法 |
| ———————————- | ———————————————————— |
| 1 隐藏nginx版本 | 修改nginx配置文件 server_tokens off;http模块中配置 |
| 2 修改web服务名字 | 修改 nginx 源码配置文件:nginx-xxx/src/core/nginx.h nginx-xxx/src/http/ngx_http_header_filter_module.c nginx-xxx/src/http/ngx_http_special_response.c |
| 3 修改进程用户 | user www www; |
| 4 优化你先服务上传文件大小限制 | client_max_body_size,响应的php也要修改 |
| 5 配置nginx服务相关日志操作 | 防止日志过大进行轮询切割yum安装nginx自动切割logrotate,编译安装手动切割,不分日志内容不进行记录,logrotate日志切割工具+定时任务 |
| 6 配置默认站点禁止恶意解析 | server模块添加return 403; |
| 7 nginx图片及目录防盗链解决方案 | 根据http referer实现防盗链,用户从哪里跳转过来的,referer控制,加入登录与认证,根据cookie防盗链,在产品设计上解决防盗链方案 |
| 8 nginx错误页面的优雅显示 | 对错误代码实行本地页面跳转 |
| 9 nginx站点目录文件及目录权限优化 | 只将用户上传数据的目录权限设置为755,用户和组使用nginx,其余目录和文件未755/644,用户和组使用root |
| 10 nginx防爬虫优化 | 利用robots.txt机器人协议防止爬虫(君子协议),在网站站点下面放robots.txt,利用$http_user_agent变量阻止爬虫代理访问 |
| 11 利用nginx限制请求方法 | $request_method限制请求方法GET,POST,HEAD |
| 12 使用普通用户启动nginx,监牢模式 | 普通用户无法使用1-1024端口,可以使用80跳转8080 |
| 13 控制nginx并发连接数 | limit_req和limit_conn 防止ddos |
| 14 控制客户端请求nginx的速率 | limit_rate |
#### 2 安全优化实践
“`sh
1、隐藏版本server_tokens off;
http {
server_tokens off;
}
http模块中配置
ubuntu安装openssl-devel pcre-devel
apt install -y libssl-dev libpcre2-dev
4、设置用户上传文件大小
client_max_body_size 50m;
可以放在http、server、location模块中,影响程度不一样
nginx修改了还需要修改php.ini文件
/etc/opt/remi/php74/php.ini
694 post_max_size = 5M
846 upload_max_filesize = 50M
配置完成后还需要安装wordpress插件才能生效
“`
\Typora\006-nginx\image-20250116124424496.png)
“`sh
5、日志轮询或日志切割
yum或者apt安装的nginx日志切割文件在/etc/logrotate.d/nginx文件里
cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 640 nginx adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
日志文件解析
cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily#每日切割一次
missingok#文件不存在报错
rotate 52#循环52次,从第53次开始删除就的切割
compress#压缩
delaycompress#延后一天进行压缩
notifempty#如果文件为空则不切割
create 640 nginx adm#切割后文件的属性
sharedscripts#切割后运行指定的命令,一般是重启的命令
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
6 对用户请求的URI进行访问控制
location /admin/ {
return 403;#或者deny all
}
7 什么是盗链:网站中盗取其他人网站的资源链接
1 加水印
2 通过referer头判断,用户间接访问就会有这个头部信息
3 配置认证,登录后才能用
在server模块中添加以下信息,可以拒绝
if ( $http_referer ~”img.ysllinux.cn”) {
return 403;
}
“`
\Typora\006-nginx\image-20250116154847610.png)
“`sh
8 错误页面优雅显示
error_page 501 502 503 504 /50x.html;
location = /50x.html {
root /app/code/error/;
}
error_page 400 401 402 403 404 405 406 407 408 409 410 412 413 414 415 /40x.html;
location = /40x.html {
root /app/code/error/;
}
#在 return 如何指定错误提示的页面
set $flag 1;
if ( $flag = 1) {
return 503 http://lb.ysllinux.cn/50x.html ;
}
#404 页面:
https://volunteer.cdn-go.cn/404/latest/404.html
10 nginx防爬虫
什么是爬虫?
通过命令或者软件下载网站指定的信息
curl或wget
登录功能,验证码功能,python,golang
如何访爬虫?
1 君子协议,robots.txt,spider或bot
2 在ngx中通过ua变量进行判断,手动屏蔽爬虫,运营搜索引擎的爬虫爬取你的网站
3 增加登录认证功能,验证码
4 访问频率限制
server {
#下面的屏蔽容易导致误杀,一些搜索引擎的爬虫,未来想精确,写出具体不想要的爬虫即可. if ($http_user_agent ~* “spider|bot” ){
return 403 ;
}
if ($http_user_agent !~* “baidu|google|android|ios|windows” ){
return 403;
}
11 利用nginx限制请求访问
用户请求方法限制 GET,HEAD,POST,PUT,DELETE,OPTIONS.
if ( $http_method !~ “GET|HEAD|POST” ) {
return 403 http://lb.ysllinux.cn/40x.html; #或 deny all;
}
12 nginx监牢模式
监牢模式:通过普通用户运行与管理指定的服务. 这里的用户是普通用户,非虚拟用户.这个用户可以登录系统. 一般编译安装的软件(可以安装到指定目录–prefix=/app/tools/nginx/). 还可以是二进制软件. 如果是 ngx 还有个坑,1-1024 范围的端口特权端口,只能 root 管理.
13 限制下载速度
限制下载速度. limit_rate 100k;
#map 类似 if map $slow $rate {
1 4k; #如果$slow 的值是 1 则$rate 的值是 4k
2 8k; #如果$slow 的值是 2 则$rate 的值是 8k
}
limit_rate $rate;
14 限速(访问频率,ngx处理的频率)
limit_conn_module(connection) 连接频率限制(服务端)
limit_req_module(requst) 请求频率限制(客户端)
木桶原则:
“`
\Typora\006-nginx\image-20250116162218526.png)
“`sh
#测试 limit_conn
limit_conn_zone
limit_conn zone number;
限制这个区域(ip 命名区域) 每一次只能有 number 个链接. Sets the shared memory zone and the maximum allowed number of connections for a given key value. [root@web02 nginx]# cat conf/nginx.conf
worker_processes 1;
user www www;
events {
worker_connections 1024;
}
http{
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
#limit_conn_zone 创建木桶
#$binary_remote_addr 根据客户端 ip 进行限制. #zone=木桶名字:大小;
server {
limit_conn conn_zone 10;
#1 个 ip 地址连接并发数是 1;
location / {
root /app/nginx/html/;
index index.html;
}
}
}. #完成的主配置文件和子配置文件
[root@web01 ~]# cat /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
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;
server_tokens off;
client_max_body_size 50m;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
#limit_conn 部分
#创建 limit_conn 木桶 $客户端 ip 地址 zone=桶名字:大小
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
include /etc/nginx/conf.d/*.conf;
}
[root@web01 ~]# vim
[root@web01 ~]# vim /etc/nginx/conf.d/default.conf
[root@web01 ~]# cat /etc/nginx/conf.d/default.conf
[root@web01 ~]# cat /etc/nginx/conf.d/default.conf
server {
listen 80 default_server;
server_name localhost;
charset utf8;
autoindex on;
#调用 limit_conn 木桶 每个 ip 并发连接是 1
limit_conn conn_zone 1;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
#测试命令
ab -n 20 -c 2 10.0.0.8/
#检查错误日志中查看和访问日志
[root@web02 ~]# tail -f /app/nginx/logs/error.log
2019/10/23 17:35:51 [error] 9039#0: *307824 limiting connections by zone “conn_zone”, client:
10.0.0.8, server: , request: “GET / HTTP/1.0”, host: “10.0.0.8” 2019/10/23 17:35:51 [error] 9038#0: *307827 limiting connections by zone “conn_zone”, client:
10.0.0.8, server: , request: “GET / HTTP/1.0”, host: “10.0.0.8” 2019/10/23 17:35:51 [error] 9038#0: *307832 limiting connections by zone “conn_zone”, client:
10.0.0.8, server: , request: “GET / HTTP/1.0”, host: “10.0.0.8” 2019/10/23 17:35:51 [error] 9038#0: *307881 limiting connections by zone “conn_zone”, client:
10.0.0.8, server: , request: “GET / HTTP/1.0”, host: “10.0.0.8” 2019/10/23 17:35:51 [error] 9042#0: *307890 limiting connections by zone “conn_zone”, client:
10.0.0.8, server: , request: “GET / HTTP/1.0”, host: “10.0.0.8”
“`
\Typora\006-nginx\image-20250116162354082.png)
“`sh
#限制请求频率
[root@web01 ~]# cat /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
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;
server_tokens off;
client_max_body_size 50m;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
#limit_conn 部分
#创建 limit_conn 木桶 $客户端 ip 地址 zone=桶名字:大小
#limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
#limit_req 部分
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
include /etc/nginx/conf.d/*.conf;
}
[root@web01 ~]# cat /etc/nginx/conf.d/default.conf
server {
listen 80 default_server;
server_name localhost;
charset utf8;
autoindex on;
#调用 limit_conn 木桶 每个 ip 并发连接是 1
#limit_conn conn_zone 1;
#调用 limit_req 并发处理 5
limit_req zone=one burst=5;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
#每个 ip 每秒请求超过 1 就会提示 delaying request 延迟处理请求.
“`
\Typora\006-nginx\image-2025011616244178png)
“`sh
#整体并发超过 5 则提示 limiting requests
“`
\Typora\006-nginx\image-20250116162525856.png)
#### 3 性能优化
| 优化说明 | 优化方法 |
| —————————————- | ———————————————————— |
| 1 修改nginx worker_process | 一般与cpu数量一致,高并发可以为cpu两倍 |
| 2 cpu亲和力(工具人进程平均使用cpu核心) | 利用 worker_cpu_affinity 进行优化(**cpu 亲和力**) 让 CPU 的每隔核心 平均4 颗 CPU 优化配置参数为 0001 0010 0100 1000worker_cpu_affinity 0101 1010;worker_cpu_affinity auto;Linux 系统设置 cpu 亲和力 taskset (15k)Taskset -p oxf pid\#把进程绑定到对应的 cpu 核心上. |
| 3 优化nginx事件处理模型 | use epoll |
| 4 优化nginx工具人进程连接数 | worker_connections |
| 5 优化nginx服务进程打开文件数 | worker_rlimit_nofile 65535; |
| 6 优化nginx服务数量高效传输模式 | 利用sendfile on;开启高效传输模式,tcp_nopush on;表示将数据积攒到一定量再进行传输,tcp_nodelay on;表示将数据信息进行快速传输 |
| 7 优化nginx服务与连接缓存与缓冲信息 | 优化利用fastcgi与php连接的缓存、缓存信息,注意ngx各种的buffer和cache |
| 8 配置nginx gzip压缩 | 利用gzip命令对数据信息压缩优化 |
| 9 brotli压缩第三方 | https环境中 |
| 10 配置nginx expires缓存 | 在location模块中,利用expires将信息缓存到用户浏览器中 |
| 11 超级性能优化 | multi_accept on; events区域,启用后,工作进程将尝试一次接受多个新的链接,这样可以介绍系统调用的此处,可以提高处理连接的效率,尤其是在高并发场景下 |
| | |
“`sh
1 工具人用户
worker_processes 8;cpu数
2 ngx cpu亲和力
worker_cpu_affinity auto;
3 nginx io模型
在events区域增加use epoll
4 优化nginx单工具人进程客户端连接数
events区域增加
worker_connections 10000;需要进行压力测试
5 配置nginx gzip实现性能优化
给静态资源进行压缩,节约带宽.对静态文字资源进行压缩,html,css,js,文字内容.其他静态资源图片,视频不推荐使用 gzip 压缩. gzip on;
gzip on;
gzip_min_length 1k; #设置大于 1K 才进行压缩
gzip_buffers 4 16k; #设置压缩缓存 4 个每个 16k
#gzip_http_version 1.0;
gzip_comp_level 2; #压缩级别 数字越大 压缩率(占用空间)越小 占用 CPU 越多
gzip_types text/plain application/x-javascript text/css application/xml text/javascript
application/x-httpd-php ; #哪些类型的文件 需要进行压缩 这些类型需用 mime type 媒体类型. #mime types #媒体类型(http) === 文件类型(linux)
故障案例:
NSES WITH THE “TEXT/HTML” TYPE ARE ALWAYS COMPRESSED.
GZIP 默认压缩 TEXT/HTML 类型,不用指定,指定会报错。
nginx: [warn] duplicate MIME type “text/html” in /app/nginx-1.14.0//conf/nginx.conf:13
检查:
chrome 浏览器 按 F12
“`
\Typora\006-nginx\image-20250116171218006.png)
\Typora\006-nginx\image-20250116171223159.png)
“`sh
6 配置 Nginx brotli 压缩实现性能优化(下面有案例)
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css text/xml application/json application/javascript
application/rss+xml application/atom+xml image/svg+xml;
“`
\Typora\006-nginx\image-20250116171258384.png)
“`sh
7 配置nginx expires缓存
设置静态资源在客户端浏览器中缓存. 图片 类
html,css,js 类
缓存时间设置,变化少,改动少的就可以增加缓存时间缓存 1 天或 10 天. 经常变动的缓存较短 1 小时
location ~* \.(gif|jpg|jpeg|png|bmp|ico)$ {
root /var/www/img/;
expires 30d;
#access_log off;
}
8 优化 nginx 服务与连接缓存与缓冲信息
Linux 中有各种的 buffer 和 cache,他们作用类似实现加速用户读或写操作. 利用软件在内存中创建 buffer 和 cache 区域. cache 用于加速读取. buffer 用于加速写入. 写 buffer 读 cache. #cache 类用于加速读取. 有各种类型,php(fastcgi_cache),通用类(proxy_cache),python(uwsgi_cache)
使用方法都类似. proxy_cache 与 proxy_pass http 区域
proxy_cache_path /dev/shm/ngx_cache/ levels=1:2 keys_zone=ysl_ysl:10m;
http 或 server 或 locaiton 配置
proxy_pass http://blog_pools;
proxy_cache ysl_ysl; #cache 区域名字. proxy_cache_valid 200 302 1h;
proxy_cache_valid 301 1d;
proxy_cache_valid any 1m;
[root@lb01 ~]# cat /etc/nginx/nginx.conf user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid; events { worker_connections 1024;
}stream { upstream l4_pools { server 10.0.0.7:8848; server 10.0.0.8:8848;
}
#log_format server {
listen 8848;
#error_log
#access_log
proxy_pass l4_pools;
}
}
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;
#gzip on;
proxy_cache_path /dev/shm/ngx_cache/ levels=1:2 keys_zone=ysl_ysl:10m;
include /etc/nginx/conf.d/*.conf;
}
[root@lb01 ~]# cat /etc/nginx/conf.d/lb.ysllinux.cn.conf
[root@lb01 ~]# cat /etc/nginx/conf.d/lb.ysllinux.cn.conf
#创建分组
upstream lb_pools { server 10.0.0.7:80; server 10.0.0.8:80; check interval=3000 rise=2 fall=5 timeout=1000 type=http;
#Host 部分需要改成站点对应的域名
check_http_send “HEAD / HTTP/1.0\r\nHost: lb.ysllinux.cn\r\nUser-Agent: lb_check\r\n\r\n”; check_http_expect_alive http_2xx http_3xx;
}server {
listen 80; server_name lb.ysllinux.cn;
#access_log
#error_log
location / {
#lb_pools 分组的名字
proxy_pass http://lb_pools;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache ysl_ysl;
proxy_cache_valid 200 302 1h;
proxy_cache_valid 301 1d;
proxy_cache_valid any 1m;
}
location /status { check_status; access_log off;
}
}
检查 :
“`
\Typora\006-nginx\image-20250116171502025.png)
“`sh
# 使用 include 功能精简,配置文件
[root@lb01 ~]# cat /etc/nginx/nginx.conf user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid; events { worker_connections 1024;
}stream { upstream l4_pools { server 10.0.0.7:8848; server 10.0.0.8:8848;
}
#log_format server {
listen 8848;
#error_log
#access_log
proxy_pass l4_pools;
}
}
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;
#gzip on;
proxy_cache_path /dev/shm/ngx_cache/ levels=1:2 keys_zone=ysl_ysl:10m;
include /etc/nginx/conf.d/*.conf;
}
[root@lb01 ~]# cat /etc/nginx/proxy.conf
[root@lb01 ~]# cat /etc/nginx/proxy.conf
#Host 头保留
proxy_set_header Host $http_host;
#XFF 头
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache ysl_ysl;
proxy_cache_valid 200 302 1h;
proxy_cache_valid 301 1d;
proxy_cache_valid any 1m;
[root@lb01 ~]# cat /etc/nginx/conf.d/blog.ysllinux.cn.conf upstream blog_pools { server 10.0.0.7:80; server 10.0.0.8:80;
}server {
listen 80; server_name blog.ysllinux.cn; access_log /var/log/nginx/blog-access.log main; error_log /var/log/nginx/blog-error.log notice;
location / {
proxy_pass http://blog_pools;
include proxy.conf;
}
}
“`
\Typora\006-nginx\image-20250116171539316.png)
“`sh
ngx 的各种 buffer. 开启 buffer 功能,设置缓冲区. proxy_buffer fastcgi_buffer uwsgi_buffer. #Host 头保留
proxy_set_header Host $http_host;
#XFF 头
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache ysl_ysl;
proxy_cache_valid 200 302 1h;
proxy_cache_valid 301 1d;
proxy_cache_valid any 1m;
#ngx buffer 配置
proxy_buffering on;
proxy_buffer_size 128k;
proxy_busy_buffers_size 256k;
proxy_buffers 32 128k;
9 timeout系列
一般表示超时时间,连接的时候时间,超过这个时间未完成连接,读/写/连接.
proxy_connect_timeout 连接超时时间.
proxy_read_timeout 定义从代理服务器读取响应的超时. 适当可以加长 300s. proxy_send_timeout 设置将请求传输到代理服务器的超时。适当可以加长 300s.
10 优化nginx服务进程打开文件数量
Linux 文件描述符,用于控制每个进程最多可以打开多少文件. 这个值分为 2 个部分:
1. 系统的设置. [root@web01 ~]# egrep -v ‘^$|#’ /etc/security/limits.conf * soft nofile 65535
* hard nofile 65535
[root@web01 ~]# ulimit -n 65535
2. 服务软件的设置. ngx 主配置文件
user www;
worker_processes auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 65535;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 60000;
use epoll;
}
pidstat -l |grep nginx #ab 访问
“`