Nginx 学习笔记
最近在搞 Vue3 的前后端分离, 然后看到了 Nginx, 感觉不错, 浅学了下。这里对我学的东西做一些总结, 如果你看到了这篇博客, 希望它能帮你少走一些弯路
介绍
Nginx 是一款轻量级的 Web 服务器、反向代理服务器, 由于它的内存占用少, 启动极快, 高并发能力强, 在互联网项目中广泛应用。
主要特色是静态资源管理, 反向代理和负载均衡
安装 | 指令 | 使用
Windows11
直接上官网下载页下载 windows 版的下载, 解压, 点击就能运行(也支持命令行运行)
Linux | CentOS7
linux 下我推荐这篇
看着一步一步跟着做就行
速查
主要的指令, 注意这些指令需要在 nginx 根目录中使用
- nginx 配置文件的位置:/usr/local/nginx/conf/nginx.conf
# 打开nginx
nginx
# 停止nginx
nginx -s stop
nginx -s quit
# 刷新配置文件
nginx -s reload
Vue-Router 专用配置
location / {
try_files $uri $uri/ /index.html;
}
Linux | ubuntu 20.04
# 直接使用apt安装
sudo apt update
# 安装nginx
sudo apt install nginx
# 查看nginx状态
sudo systemctl status nginx
- 所有的 Nginx 配置文件都在
/etc/nginx/
目录下 - 主要的 Nginx 配置文件是
/etc/nginx/nginx.conf
网站多的话还可以分文件编写,不过我暂时懒得搞了
ubuntu 防火墙 | ufw
# 查看防火墙状态,只有打开了才能看到规则
sudo ufw status
# 开启防火墙
sudo ufw enable
# 关闭防火墙
sudo ufw disable
# 开启某个端口
sudo ufw allow 80
配置文件 | nginx.conf
按推荐程度排序
讲得比较细, 基本上看这一个就够了
nginx 官方文档 | 英文 nginx 官方的文档, 但是是英文, 并且排版比较阴间, 好处是比较完整, 要啥都能查到
Example | 例子
一个简单的配置文件的例子, 便于快速查看
# 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
。
# 语法: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 | 日志格式
# 语法: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 |
$status | HTTP 请求状态 | 200 |
$upstream_status | upstream 状态 | 200 |
$body_bytes_sent | 发送给客户端文件内容大小 | 1547 |
$http_referer | url 跳转来源 | 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_protocol | SSL 协议版本 | 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 | 监听端口
# 语法:listen address:port | port | [address]:port [default_server] [ssl] [http2] [spdy] [proxy_protocol] [setfib=number] [fastopen=num];
# 默认值:listen 80;
# 监听端口
listen 80;
server_name | 服务名(监听的域名)
# 语法:server_name name | name | ...;
# 默认值:server_name "";
# 监听地址
server_name
只有在指定的域名(server_name)或者 ip 访问时,才会使用这个 server 块的配置。
location | 路径
# 语法:location [ = | ~ | ~* | ^~ ] uri { ... }
# 默认值:无;
# 匹配请求的uri
location / {
# 使用proxy_pass可以将请求转发给另一个服务器
proxy_pass http://mysvr;
}
# 匹配请求的uri, 但是不包含正则表达式
location = / {
# 使用proxy_pass可以将请求转发给另一个服务器
proxy_pass http://mysvr;
}
location 块 | 路径块
root | 根目录
# 语法:root path;
# 默认值:root html;
# 根目录
root path;
index | 默认页
# 语法:index file ...;
# 默认值:index index.html;
# 默认页
index vv.txt;
proxy_pass | 转发
# 语法:proxy_pass URL;
# 默认值:无;
# 使用proxy_pass可以将请求转发给另一个服务器
proxy_pass http://mysvr;
deny | 拒绝
# 语法:deny address | CIDR | unix: | all;
# 默认值:无;
# 拒绝的ip
deny
参考资料
下面几个都差不多, 是小短文, 帮助理解的: