目录
1. nginx
简介
Nginx
是一款基于异步框架的轻量级/高性能的Web服务器/反向代理服务器/缓存服务器/电子邮件代理服务器,并在BSD-like协议下发行。由俄罗斯程序设计师Igor Sysoev
所开发,最初供俄国大型网站Rambler.ru
及搜索引擎Rambler使用。
Nginx
特点:
优点:
- 高并发
- 内存消耗少
- 简单稳定
- 支持
Rwrite
重写规则 - 低成本
- 支持多系统
缺点:
- 动态处理差
- rewrite弱
2. Nginx
常用命令小记
常用命令:
# ubuntu使用ssh连接服务器:
ssh root@ip: # 然后按提示输入密码
# 安装nginx
sudo apt install nginx
# 查看nginx版本:
nginx -v
# 查看是否处于运行状态
ps jx |grep nginx
# 关闭nginx服务
service nginx stop
# 开启nginx服务
service nginx start
# nginx配置文件目录:/etc/nginx/
# nginx的log日志目录: /var/log/nginx/
# nginx默认首页目录: /usr/share/nginx/html/index.html
# 查看nginx是否成功
# 测试nginx配置是否正确:
nginx -t
# 重新加载配置信息
nginx -s reload
Nginx
配置图解:
3. VScode
远程连接虚拟机上的ubuntu
系统
sudo apt install openssh-server
# 修改配置允许远程连接
cd /etc/ssh/
sodu vim sshd_config
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fAD3HeDx-1620542439365)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20210508181026750.png)]
将PermitRootlogin
取消注释并确保为yes
。
4. location中的常见动作
4.1 nginx
匹配路径后斜杠问题
当location /path 后面不加斜杠时,访问时无论请求加不加斜杠请求都能够被匹配到。如:
location /a {
return 400;
}
请求路径最后加不加斜杠都能匹配到。
如果加了斜杠后,访问时加斜杠才能被匹配到,不加斜杠不会被匹配到。
4.2 try_files和return的使用和区别
location / {
try_files $uri $uri/ =401;
}
try_files不能匹配根路径,如上面这种配置访问不会出现401。下面的这种可以访问。
location /a {
try_files $uri $uri/ =401;
}
try_files配合@使用
location /a {
try_files $uri $uri/ @project
}
location @project {
return 402;
}
return 的使用跳转
location / {
return 302 http://www.baidu.com;
}
4.3 root
和alias
的区别:
针对根路径:
location / {
root /etc/nginx/html;
# 指定返回的首页文件(默认返回index.html文件)
# index index.html
index 指定的.html文件
}
# 如果使用root可以匹配,如果不是root,则匹配不了,如果是alias,需要增加斜杠结尾。
location / {
alias /etc/nginx/html/;
}
针对子路径的话:root属性在子路径下不能使用(404),应该使用alias属性
location /a {
alias /etc/nginx/html;
# 指定
}
4.4 访问控制
location / {
stub_stutas on; # 返回nginx状态信息
allow 10.212.12.34; # 指定哪些ip可以访问
deny all; # 除了允许的,其他都拒绝。
}
4.5 目录下载功能
location /download {
alias /etc/nginx; # 指定下载目录
autoindex on; # 开启下载模式
}
5. 反向代理
正向代理转发:将客户端的信息进行了隐藏
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R9YSLI8y-1620542439375)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20210509100155797.png)]
反向代理转发:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yVl1D2r3-1620542439380)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20210509100303240.png)]
反向代理的是服务器端,可以隐藏服务器端的信息。
server{
listen 10.211.23.29:80;
location / {
proxy_pass http://10.211.23.29:8000;# 转发给8000端口
}
}
server{
listen 10.211.23.29:8000; # 由8000端口重新进行操作。
location / {
root /etc/nginx/html;
index. index.html;
}
}
6. 负载均衡
当多次请求时,将比较均衡地转发给upsteam my_project
中的地址
# 负载均衡
upsteam my_project {
# 默认轮训
server 10.211.23.29:8000;
server 10.211.23.29:8001;
server 10.211.23.29:8002;
# 加权轮训
server 10.211.23.29:8000 weight=1;
server 10.211.23.29:8001 weight=2;
server 10.211.23.29:8002 weight=3;
# ip_hash 第一次请求会分配一个服务器端的ip,以后的所有请求都是使用第一的服务ip
ip_hash;
server 10.211.23.29:8000;
server 10.211.23.29:8001;
server 10.211.23.29:8002;
}
# 反向代理
server {
listen 10.211.23.29:80;
location / {
proxy_pass http://my_project
}
}
server {
listen 10.211.23.29:8000;
location / {
root /etc/nginx/html;
index 8000.html;
}
}
server {
listen 10.211.23.29:8000;
location / {
root /etc/nginx/html;
index 8001.html;
}
}
server {
listen 10.211.23.29:8000;
location / {
root /etc/nginx/html;
index 8002.html;
}
}
7. 日志解析
日志功能简介
日志简介
Nginx
默认提供了两个日志文件 access.log
和error.log
,通过access.log
可以得到用户请求的相关信息;通过error.log
可以获取某个web服务故障或其性能瓶颈等信息。
而且nginx
的日志支持定制化格式,这样我们就可以根据实际的业务情况更好的高效工作。最常见的场景就是获取客户端的IP
,记录用户访问量。
官方介绍:http://nginx.org/en/docs/http/ngx_http_log_module.html
基本配置
# cat /etc/nginx/nginx.conf -n
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
注意:
nginx
日志属性设置的完整格式是:
属性名称 access_log
存储位置 /var/log/nginx/access.log
日志格式 位置为空表示使用默认的combined 日志格式。它是通过log_format设置的
默认日志格式
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
注意:log_format
是有一批nginx
内置变量组合而成的。
日志样式:
\# tail /var/log/nginx/access.log
192.168.8.14 - - [12/Nov/2018:08:24:18 -0800] "GET /favicon.ico HTTP/1.0" 404 580 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
**nginx
常用内置变量 **
nginx
常用的内置变量主要是用来分析日志中的http
记录的,我们可以根据内置的变量精确的获取相关的信息
# 默认变量
$remote_addr 前一台主机的ip地址,不一定是真实的客户端IP
$remote_user 用于记录远程客户端的用户名称(一般为“-”)
$time_local 用于记录访问时间和时区
$request 用于记录请求的url以及请求方法
$status 响应状态码,例如:200成功、404页面找不到等。
$body_bytes_sent 给客户端发送的文件主体内容字节数
$http_referer 可以记录用户是从哪个链接访问过来的
$http_user_agent 用户所使用的代理(一般为浏览器)
其他常用变量
$request_uri 包含请求参数的原始URI,不包含主机名
$uri 不带请求参数的当前URI,不包含主机名
$http_x_forwarded_for 可以记录客户端IP,通过代理服务器来记录客户端的ip地址
$http_x_real_ip 可以记录客户端IP,通过代理服务器来记录客户端的ip地址
$args 这个变量等于请求行中的参数,同$query_string
$host 请求主机头字段,否则为服务器名称。
$scheme HTTP方法(如http,https)
$document_uri 与$uri相同
$document_root 当前请求文件配置文件中html的根目录即root值
$request_filename 当前请求的文件路径,由root或alias指令与URI请求生成
示例:
例:http://localhost:10086/sswang1/sswang2/test.txt
$host localhost
$server_port 10086
$request_uri /sswang1/sswang2/test.txt
$document_uri /sswang1/sswang2/test.txt
$document_root /var/www/html
$request_filename /var/www/html/sswang1/sswang2/test.txt
自定义日志实践
需求:
基于代理方式访问app1
应用,日志存放在/var/logs/nginx/app1/access.log,要求能从日志中获取客户端的IP地址
因为是获取代理前面客户端的真实IP,需要nginx
开启 --with-http_realip_module 功能,使用nginx -V来检查,ubuntu默认安装的已经开启了该功能。
设置日志格式
~# vim /etc/nginx/nginx.conf
# Logging Settings
## 设定日志格式的方法: log_format 格式名称 "日志表现样式"
log_format proxy_format '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent "$http_referer"'
'"$http_user_agent" "$http_x_real_ip" "$http_x_forwarded_for"';
access_log 日志路径 格式名称;
负载均衡配置文件
vim /etc/nginx/conf.d/upstream.conf
upstream backends {
server 192.168.8.14:10086;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://backends;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
后端代理配置文件
vim /etc/nginx/conf.d/backend.conf
server {
listen 192.168.8.14:10086;
root /var/www/html/app1/;
access_log /var/log/nginx/app1/access.log proxy_format;
real_ip_header X-Forwarded-For;
set_real_ip_from 192.168.0.0/16;
real_ip_recursive on;
location / {
try_files $uri $uri/ =404;
}
}
准备后端服务文件
mkdir -p /var/www/html/app1/
echo '<h1>backend_app1</h1>' > /var/www/html/app1/index.html
mkdir /var/log/nginx/app1 -p
检查nginx
配置后重载服务
/usr/sbin/nginx -t
systemctl reload nginx
netstat -tnulp | grep nginx
查看效果
在多台主机上执行如下命令
curl http://192.168.8.14
查看日志:
# app1日志
192.168.8.1 - - [12/Nov/2018:18:28:46 -0800] "GET / HTTP/1.0" 200 22 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36" "192.168.8.1" "192.168.8.1"
192.168.8.14 - - [12/Nov/2018:18:29:30 -0800] "GET / HTTP/1.0" 200 22 "-" "curl/7.47.0" "192.168.8.14" "192.168.8.14"
192.168.8.15 - - [12/Nov/2018:18:31:43 -0800] "GET / HTTP/1.0" 200 22 "-" "curl/7.29.0" "192.168.8.15" "192.168.8.15
注意:因为我们的虚拟机使用的是nat网络模型,所以我们用外部的宿主机来访问的话,是通过VMnat8网卡IP来访问nginx代理的,所以记录的是192.168.8.1
注意:
如果生产中出现了多级代理,
在第一层代理上添加 proxy_set_header X-Real-IP $remote_addr;属性
在所有代理上必须添加 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;属性
真实主机上使用 real_ip_header X-Forwarded-For;属性