Nginx笔记

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配置图解:

image-20210508182958183

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 rootalias的区别:

针对根路径:

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.logerror.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;属性

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值