Skip to content

Nginx 学习笔记

最近在搞 Vue3 的前后端分离, 然后看到了 Nginx, 感觉不错, 浅学了下。这里对我学的东西做一些总结, 如果你看到了这篇博客, 希望它能帮你少走一些弯路

介绍

Nginx 是一款轻量级的 Web 服务器、反向代理服务器, 由于它的内存占用少, 启动极快, 高并发能力强, 在互联网项目中广泛应用。

主要特色是静态资源管理, 反向代理和负载均衡

安装 | 指令 | 使用

Windows11

直接上官网下载页下载 windows 版的下载, 解压, 点击就能运行(也支持命令行运行)

Linux | CentOS7

linux 下我推荐这篇

看着一步一步跟着做就行

速查

主要的指令, 注意这些指令需要在 nginx 根目录中使用

  • nginx 配置文件的位置:/usr/local/nginx/conf/nginx.conf
shell
# 打开nginx
nginx
# 停止nginx
nginx -s stop
nginx -s quit
# 刷新配置文件
nginx -s reload

Vue-Router 专用配置

conf
location / {
    try_files $uri $uri/ /index.html;
}

Linux | ubuntu 20.04

shell
# 直接使用apt安装
sudo apt update
# 安装nginx
sudo apt install nginx
# 查看nginx状态
sudo systemctl status nginx
  • 所有的 Nginx 配置文件都在/etc/nginx/目录下
  • 主要的 Nginx 配置文件是/etc/nginx/nginx.conf

网站多的话还可以分文件编写,不过我暂时懒得搞了

ubuntu 防火墙 | ufw

shell
# 查看防火墙状态,只有打开了才能看到规则
sudo ufw status
# 开启防火墙
sudo ufw enable
# 关闭防火墙
sudo ufw disable
# 开启某个端口
sudo ufw allow 80

配置文件 | nginx.conf

按推荐程度排序

Example | 例子

一个简单的配置文件的例子, 便于快速查看

conf
# nginx.conf
#########每个指令必须有分号结束。#################
# 配置用户或者组, 默认为nobody nobody。
# user administrator administrators;

# 允许生成的进程数, 默认为1, 一般建议设成CPU核数1-2倍,auto表示自动配置。
# worker_processes 2;

# 指定nginx进程运行文件存放地址,需要在目录下手动创建,不然会报错。
# pid /nginx/pid/nginx.pid;

# 制定日志路径, 级别。这个设置可以放入全局块, http块, server块
# 级别依次:debug|info|notice|warn|error|crit|alert|emerg
# log文件可以写多个配置, 多种级别
# info级别的日志可以记录所有访问
error_log log/error.log debug;


events {
    # 使用epoll的I/O 模型处理轮询事件。
    # 可以不设置, nginx会根据操作系统选择合适的模型
    # use epoll;

    # 设置网路连接序列化, 防止惊群现象发生, 默认为on
    accept_mutex on;
    # 设置一个进程是否同时接受多个网络连接, 默认为off
    multi_accept on;
    # 事件驱动模型,
    # use epoll;      select|poll|kqueue|epoll|resig|/dev/poll|eventport
    # 最大连接数, 默认为512
    worker_connections 1024;

    # http层面的keep-alive超时时间
    keepalive_timeout 60;

    # 客户端请求头部的缓冲区大小
    client_header_buffer_size 2k;
}

http {
    # 文件扩展名与文件类型映射表
    include mime.types;
    # 默认文件类型, 默认为text/plain
    default_type application/octet-stream;
    # access_log off; # 取消服务日志

    # 日志格式及access日志路径
    log_format main '$remote_addr - $remote_user [$time_local] $status '
    '"$request" $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';
    access_log logs/access.log main;

    # 允许sendfile方式传输文件, 默认为off, 可以在http块, server块, location块。
    sendfile on;
    tcp_nopush on; # sendfile开启时才开启。
    # 每个进程每次调用传输数量不能大于设定的值, 默认为0, 即不设上限。
    sendfile_max_chunk 100k;
    # 连接超时时间, 默认为75s, 可以在http, server, location块。
    keepalive_timeout 65;

    upstream mysvr {
        server 127.0.0.1:7878;
        server 192.168.10.121:3333 backup; # 热备
    }

    error_page 404 https://www.baidu.com; # 错误页


    # 简单反向代理
    server {
        listen 80;
        server_name domain2.com www.domain2.com;
        access_log logs/domain2.access.log main;

        # 转发动态请求到web应用服务器
        location / {
            proxy_pass http://127.0.0.1:8000;
            deny 192.24.40.8; # 拒绝的ip
            allow 192.24.40.6; # 允许的ip
        }

        # 错误页面
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
    }

    # 负载均衡
    upstream backend_server {
        server 192.168.0.1:8000 weight=5; # weight越高, 权重越大
        server 192.168.0.2:8000 weight=1;
        server 192.168.0.3:8000;
        server 192.168.0.4:8001 backup; # 热备
    }

    server {
        listen 80;
        server_name big.server.com;
        access_log logs/big.server.access.log main;

        charset utf-8;
        client_max_body_size 10M; # 限制用户上传文件大小, 默认1M

        location / {
            # 使用proxy_pass转发请求到通过upstream定义的一组应用服务器
            proxy_pass http://backend_server;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
        }

    }
}


#     server {
#         keepalive_requests 120; # 单连接请求上限次数。
#         listen 4545; # 监听端口
#         server_name 127.0.0.1; # 监听地址
#         # 可以修改监听地址来分流不同域名来的请求, 并且支持通配符
#         location ~*^.+$ {
#             # root path;  # 根目录
#             # index vv.txt;  # 设置默认页
#             proxy_pass http://mysvr; # 请求转向mysvr 定义的服务器列表
#             deny 127.0.0.1; # 拒绝的ip
#             allow 172.18.5.54; # 允许的ip
#         }
#         location / {
#             # 使用proxy_pass可以将请求转发给另一个服务器
#             proxy_pass http://mysvr;
#         }
#     }
}

详解

全局块 | global

user | 用户

  • 语法:user [username] [groupname];
  • 默认值:user nobody nobody;
  • 配置用户或者组, 默认为 nobody nobody。

worker_processes | 进程数

  • 语法:worker_processes number | auto;

pid | 进程文件

  • 语法:pid file;
  • 默认值:pid logs/nginx.pid;

指定 nginx 进程运行文件存放地址,需要在目录下手动创建,不然会报错。关闭 nginx 时需要这个文件才能关, 找不到文件只能强关了。

log | 日志

nginx 的日志分为两种,一种是错误日志error_log,一种是访问日志access_log

conf
# 语法:error_log file [level];
# 默认值:error_log logs/error.log error;
# 级别依次:debug | info | notice | warn | error | crit | alert | emerg
error_log logs/error.log debug;

# 语法:access_log path [format [buffer=size]];
# 默认值:access_log logs/access.log main;
access_log logs/access.log main;
# 有时候会报错找不到main?
  • 注意 error_log 的日志格式和 access_log 的日志格式不一样

access_log 的日志格式可以自定义, 也可以使用预定义的格式, 预定义的格式有combined | main | json | none | combined_if_not_empty | main_if_not_empty | json_if_not_empty | off

log_format | 日志格式

conf
# 语法:log_format name string ...;
# 默认值:无;
# 日志格式及access日志路径,记录在文件中不会分行,一行显示。
log_format main '$remote_addr - $remote_user [$time_local] $status '
'"$request" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;

可设置的参数格式

参数说明示例
$remote_addr客户端地址211.28.65.253
$remote_user客户端用户名称--
$time_local访问时间和时区18/Jul/2012:17:00:01 +0800
$request请求的 URI 和 HTTP 协议"GET /article-10000.html HTTP/1.1"
$http_host请求地址,即浏览器中你输入的地址(IP 或域名)www.wang.com 192.168.100.100
$statusHTTP 请求状态200
$upstream_statusupstream 状态200
$body_bytes_sent发送给客户端文件内容大小1547
$http_refererurl 跳转来源https://www.baidu.com/
$http_user_agent用户终端浏览器等信息"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; GTB7.0; .NET4.0C;
$ssl_protocolSSL 协议版本TLSv1
$ssl_cipher交换数据中的算法RC4-SHA
$upstream_addr后台 upstream 的地址,即真正提供服务的主机地址10.10.10.100:80
$request_time整个请求的总时间0.205
$upstream_response_time请求过程中,upstream 响应时间0.002

server 块 | 服务块

listen | 监听端口

conf
# 语法:listen address:port | port | [address]:port [default_server] [ssl] [http2] [spdy] [proxy_protocol] [setfib=number] [fastopen=num];
# 默认值:listen 80;
# 监听端口
listen 80;

server_name | 服务名(监听的域名)

conf
# 语法:server_name name | name | ...;
# 默认值:server_name "";
# 监听地址
server_name

只有在指定的域名(server_name)或者 ip 访问时,才会使用这个 server 块的配置。

location | 路径

conf
# 语法:location [ = | ~ | ~* | ^~ ] uri { ... }
# 默认值:无;
# 匹配请求的uri
location / {
    # 使用proxy_pass可以将请求转发给另一个服务器
    proxy_pass http://mysvr;
}

# 匹配请求的uri, 但是不包含正则表达式
location = / {
    # 使用proxy_pass可以将请求转发给另一个服务器
    proxy_pass http://mysvr;
}

location 块 | 路径块

root | 根目录

conf
# 语法:root path;
# 默认值:root html;
# 根目录
root path;

index | 默认页

conf
# 语法:index file ...;
# 默认值:index index.html;
# 默认页
index vv.txt;

proxy_pass | 转发

conf
# 语法:proxy_pass URL;
# 默认值:无;
# 使用proxy_pass可以将请求转发给另一个服务器
proxy_pass http://mysvr;

deny | 拒绝

conf
# 语法:deny address | CIDR | unix: | all;
# 默认值:无;
# 拒绝的ip
deny

参考资料

下面几个都差不多, 是小短文, 帮助理解的:

Copyright © 2022 田园幻想乡 浙ICP备2021038778号-1