8.13 Nginx
• Nginx常用到的命令:
▪ nginx -s stop:快速关闭nginx,可能不保存相关信息,迅速终止web服务
▪ nginx -s quit:平稳关闭nginx,保存相关信息,有安排的结束web服务
▪ nginx -s reload:改变了nginx相关配置,需要重新加载
▪ nginx -s reopen:重新打开日志文件
▪ nginx -s filename:为nginx指定一个配置文件,来代替缺省的
▪ nginx -t:不运行,仅仅测试配置文件
▪ nginx -v:显示nginx的版本
▪ nginx -V:显示nginx的版本,编译器版本和配置参数
▶ Nginx配置文件详解:
• nginx默认的配置文件时在安装目录下的/etc/nginx/conf.d目录下(主配置是/etc/nginx/nginx.conf)

• 配置文件详解:
[root@nginx-a ~]# grep -Ev "#|^$" /etc/nginx/nginx.conf
user nginx; #使用谁的身份干活
▶ 思考:如果这个服务以root来启动,会出现什么问题?
root是系统最高权限账号。一旦Nginx系统出现漏洞,攻击者就会直接获得服务器最高管理员权限,整台服务器沦陷。以普通用户启动,即使被入侵了,入侵者的权限也很有限,降低了损伤程度。
▶ 思考:如果用户带/bin/bash会怎样,应不应该带?
nginx用户一般默认不带/bin/bash,如果带了的话,入侵者就可以远程登录,危害系统。
worker_processes auto; #一共有多少人干活
error_log /var/log/nginx/error.log; #干错了 记录在哪里
pid /run/nginx.pid; #nginx进程身份好,便于系统记录和管理它
include /usr/share/nginx/modules/*.conf; #增强这个工人的工具库,让它能力值上升
**以上为全局块配置**
events {
worker_connections 1024; **events事件块配置**
}
#log_format
#定义日志的格式,比如记录:
#谁访问的($remote_addr = IP地址)
#什么时候($time_local)
#访问了啥($request = 比如 GET /index.html)
#HTTP响应状态码($status)
#发送给客户端的响应体字节大小($body_bytes_sent)
#用户从哪个网页跳转过来访问当前接口($http_referer)
#用的什么浏览器($http_user_agent)
#用来获取经过反向代理、多层Nginx、负载均衡之后,最原始的客户端真实IP($http_x_forwarded_for)
http {
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; #优化网络传输
tcp_nodelay on; #优化网络传输
keepalive_timeout 65; #连接完成后保持65秒(防止频繁重新握手)
types_hash_max_size 4096;
include /etc/nginx/mime.types; #告诉nginx不同文件后缀的格式
default_type application/octet-stream; #如果不认识的文件,默认当成二进制流(直接下载)浏览器收到改类型,不会尝试解析渲染,直接触发文件下载
include /etc/nginx/conf.d/*.conf; #要是有其他的需求,也加载进来,让工人处理
**HTTP块**
server {
listen 80; #监听端口
listen [::]:80; #监听端口十六进制表达
server_name _; #指定当前虚拟主机匹配的域名 _表示匹配全部
root /usr/share/nginx/html; #静态资源的磁盘根路径
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html; #404页面配置
location = /404.html {
} **location块**
error_page 500 502 503 504 /50x.html; #50x页面配置
location = /50x.html {
}
**server块**
}
}
▶ 配置单一的图文并茂的静态网站:
1.在根目录下创建一个html目录,在里面再创建一个single-web目录
mkdir -p /html/single-web
2.在此目录下存放html文件
3.编写配置文件(需要把/etc/nginx/nginx.conf配置文件中server块注释掉)
vim /etc/nginx/conf.d/single-web.conf
server {
listen 80;
server_name _;
charset utf-8;
location / {
root /html/single-web;
index index.html index.htm;
}
}
4.测试配置文件有没有问题
nginx -t
5.修改html目录的所属主和所属组都为nginx
chown -R nginx:nginx /html
6.重新加载nginx配置文件,让配置生效
systemctl reload nginx.service
7.测试能否正常访问网站
▶ 访问不了排错:
• 防火墙是否关闭
• 服务是否成功启动
• 阿里云安全组是否配置
• 是否给html授权
• 修改配置文件之后是否重新加载
• 输入网址是否为配置文件中监听的端口(http:80 https:443)
• 之前配置错误访问到默认index(没有注释原配置文件中的server块),重新配置后,浏览器存在缓存,需要切换浏览器或者打开一个无痕浏览窗口
• 可以配置多ip、多端口、多域名(多个server块)
▶ nginx的alise使用:
• 将/static/映射到服务器上的/data/web/assets/目录(而非/data/web/assets/static/
▶例:输入www.xx.com/湖水/,湖水这张图片保存在image目录下
location /湖水/{
root /image; ------------->会去匹配/image/湖水/ 这个目录
} **找不到**
location /湖水/{
alias /image/; ------------->会去匹配/image/这个目录
} **找得到**
▶ nginx的Rewrite使用:
• 将旧路径/old-page永久重定向到新路径/new-page(permanent)
location /old-page {
rewrite ^/old-page$ /new-page permanent;
}
• 强制HTTPS跳转:
rewrite ^(.*)$ https://$host$1 permanent
**作用:所有通过HTTP访问的请求(如http://example.com)会被重定向到HTTPS(https://example.com)**
**•** 路径前缀替换:
将/blog/2023/some-post重写为/posts/2023/some-post
location /blog {
rewrite ^/blog/(.*)$ /posts/$1 break;
}
**break:终止后续的所有rewrite指令,直接处理重写后的路径。**
**last:表示终止当前location块的后续匹配**
**▶** HTTP反向代理
• 代理服务器proxy配置如下:
server {
listen 80;
charset utf-8;
server_name 11.0.1.251 #代理服务器的私网ip
location / {
**proxy_pass** http://11.0.1.252:80; #真实服务器的私网ip
}
}
tips:代理服务器要和真实服务器处在同一个VPC下,能够互相访问
▶ 负载均衡:
关键字:upstream:设定负载服务器的服务器列表
weight:参数表示权值,权值越高被分配到的几率越大
▶ 调配算法:
1.轮询(默认)
2.weight(轮询权值)
3.ip_hash:每个请求按访问IP的哈希结果分配
4.url_hash:按访问的URL的哈希结果来分配请求
5.fair:比weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,相应时间短的优先分配。
配置:
upstream **fzjh** {
server 11.0.1.251:80 weight=1;
server 11.0.1.252:80 weight=1;
server 11.0.1.253:80 weight=1;
}
代理服务器的location块中要与upstream之后一样
proxy_pass http://**fzjh** ;
▶ 动静分离:
• 什么是动:网页的数据是动态加载------>动态加载:不是web服务器的一个静态文件(图片,文本文件等文件),加载的数据是在数据库中读取的
• 什么是静:网页的数据是静态资源
• 什么是动静分离:用代理服务器,使后台服务器分离处理动态资源和静态资源
tips:动态后端服务器对CPU要求较高
静态后端服务器对内存、硬盘、网络要求较高
• 配置动静分离总体流程:
1.配置静态服务器,正则匹配一个图片目录
▪ location ~* .*\\.(png|jpg|gif)${
root /html/static/images;
}
**补充:**
~*:表示执行一个正则匹配,不区分大小写
~:表示执行一个正则匹配,区分大小写
=:普通字符精准匹配
2.配置一个动态服务器jsp
▪ 安装tomcat,编写一个简单的jsp代码:
代码放在/usr/share/tomcat/webapps/ROOT目录下
3.单独检查动态和静态资源是否正常
4.配置代理服务器
▪ upstream static {
server 静态服务器私网ip
}
upstream java {
server 动态服务器私网ip
}
server {
listen 80;
charset utf -8;
server_name 代理服务器私网ip
location ~* .*\\.(png|jpg|gif)$ {
proxy_pass http://static;
include proxy_params; #引用请求头文件,静态可不写
}
location ~* .*\\.jsp$ {
proxy_pass http://java;
include proxy_params; #引用请求头文件,动态必须写
}
}
5.配置请求头
创建一个请求头代理信息,在/etc/nginx目录下创建proxy_params这个文件,内容如下:
▪ proxy_set_header Host $http_host;
#Host设置的是代理主机ip
▪ proxy_set_header X-Real-IP $remote_addr;
#X-Real-IP指客户端的真实IP
▪ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#X-Forwarded-For提供了记录整个请求链路上所有IP地址的能力
▪ proxy_set_header X-Forwarded-Proto $scheme;
#X-Forwarded-Proto用来确定客户端和服务器或代理连接之间所采取的协议(https http)
6.启动代理服务器,访问代理服务器,测试验证效果