Nginx 使用入门
说明
Nginx 是一个开源、高效可靠的 HTTP 服务器和反向代理;Nginx 有一个主线程和几个工作线程,主线程的目的是加载和验证配置文件、维护工作线程,工作线程用来处理实际的请求,其数量可配置,也可以自动调整为服务器 CPU 数量
1. 环境
1. 关闭 iptables 规则
方便测试要关闭服务器防火墙的规则
sudo iptables -F
sudo iptables -t nat -F
2. 安装
# ubuntu 下安装
sudo apt install nginx
# Mac
brew install nginx
3. 安装目录说明
/etc/logrotate.d/nginx
配置文件,用于 Nginx 日志轮转/etc/nginx
nginx 配置文件目录
/etc/nginx/nginx.conf
Nginx 主配置文件 Nginx 启动时主要读入这个文件/etc/nginx/conf.d
次级配置文件目录
/etc/nginx/conf.d/default.conf
默认配置文件
/etc/nginx/mime.types
用于设置 http 协议 Content-Type 与扩展名对应关系的配置文件
/var/log/nginx
Nginx 的日志目录
2. 基本命令
1. 启动服务
# 启动服务
sudo nginx
2. 关闭服务
# 快速关闭
sudo nginx -s stop
# 优雅关闭,会等到工作进程处理完当前请求、然后将其关闭
sudo nginx -s quit
3. 重新加载配置文件
sudo nginx -s reload
4. 检查配置文件是否正确
sudo nginx -t
3. Nginx 配置文件
Nginx 配置文件用来配置 Nginx 的工作方式,主配置文件:
/etc/nginx/nginx.conf
下(Linux)除此之外nginx.conf
还会加载其他的配置文件,他们被保存在/etc/nginx/conf.d/*.conf
下Nginx 由不同的模块组成,这些模块由配置文件中指定的指令控制
- 简单指令:包含指令名称和指令参数,以空格分隔,
;
结尾 - 块指令: 指令参数用
{}
包围,块指令{}
中可以包含其他指令,这个时候块指令就是被包围指令的上下文
server { # 块指令
listen 80; # 简单指令
server_name localhost; # server 就是 server_name 的上下文 Context
}
1. 主要配置说明
Nginx 配置的核心是定义要处理的 URL 以及如何响应这些 URL 请求,即定义一系列的虚拟服务器
server
控制对特定域名或者 IP 的请求的处理每一个虚拟服务器
server
又可以定义一系列的location
控制处理特定的 URI 集合
# nginx.conf
user www-data; # 设置 nginx 服务的系统使用用户
worker_processes auto; # 工作进程数
error_log /var/log/nginx/error.log; nginx 的错误日志
pid /run/nginx.pid; nginx 服务启动时的 pid
events {
worker_connections 768; 每个进程允许的最大连接数,一般 nginx 优化时会调节
}
http {
keepalive_timeout 65; # 设置请求超时时间
# 定义一个 日志格式 main
log_format main '$remote_addr - $remote_user [$time_local] '
: '"$request" $status $bytes_sent '
: '"$http_referer" "$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main; # Nginx 请求的访问状态日志,使用 main 的格式记录
error_log /var/log/nginx/error.log; # Nginx 处理 http 请求错误的以及 Nginx 服务错误的日志
# 服务配置,可以创建多个 server 服务,一般创建在次一级配置中 通过 include 引用
# 一个 server 配置一个虚拟、独立的站点
server {
listen 80; # 监听的端口
server_name localhost; # 主机名、域名、或者是 IP
# location 是 server_name 下每一层路径的访问设置
location / {
root /var/www/html; # 存放响应文件的路径
index index.html index.htm; # 默认的响应文件名
}
}
# Nginx 会读取 nginx.conf 文件,执行到这一句时会将 /etc/nginx/conf.d/ 目录下的所有 .conf 类型文件读取,并加载其中配置
include /etc/nginx/conf.d/*.conf;
}
2. location 的路径匹配
1. location 用来解析网络请求 uri 到服务器本地文件的映射关系, 其中 root 用来指定文件路径
# 如下 location 块指定 / 前缀与请求中的 URI 对比,URI 将被添加到 root 指令中指定的路径,以此形成本地文件系统的路径
location uri {
root localPath
}
location /test {
root /www/html
}
# 例子: 请求 http://localhost/test/default.html 会被解析为系统路径 /www/html/test/default.html
# root 命令也可以直接写到 server 块中,这个时候,如果 location 中没有 root 监视使用 所属上下文的 server 中的 root 命令
server {
listen 8080;
root /www;
location / {
# 使用上下文的 root /www
}
}
2. 可以看到 root 命令映射的本地路径会包含 location 匹配的路径,与 root 类似的命令 alias
可以忽略 location 后匹配的路径
# 同样一个请求 http://localhost/test/index.html
location /test {
root /www/html; # 会映射到 /www/html/test/index.html
index index.html;
}
location /test {
alias /www/html; # 会映射到 /www/html/index.html;
index index.html;
}
3. 一个 server 块中可以包含多个 location 块,Nginx 采用最长前缀匹配原则,因此如果有较长的 uri 则优先匹配
# 如下 访问 http://localhost/test/index.html 会优先匹配 location /test 解析后会到本地文件夹 /www/test/index.html 寻找文件
server {
listen 8082;
server_name localhost;
location / {
root /www/html;
index index.html;
}
location /test {
root /www; # 匹配的路径/test 的请求回到 /www/test 下寻找文件
index index.html;
}
}
4. 除了最长前缀匹配原则,location 还有一些其他的匹配规则
匹配规则优先级
location = / {}
优先级最高,一旦匹配成功不在查找其他匹配项location ^~ /test {}
前缀匹配,一旦匹配成功不查找其他项location ~ \/images\ {}
区分大小写的正则表达式匹配location ~* \/images\ {}
不区分大小写的正则表达式匹配location / {}
通用匹配,如果没有其他的匹配,则会匹配到这里
3. Nginx 日志
包括 error_log 和 access_log
- error_log 记录 Nginx 处理 http 请求错误的状态以及 Nginx 服务错误的状态
- access_log 记录每一次 Nginx 请求的访问状态
通过 log_format 可以定义日志记录的格式
log_format main '$remote_addr - $remote_user [$time_local] '
: '"$request" $status $bytes_sent '
: '"$http_referer" "$http_user_agent" "$http_x_forwarded_for"';
其中 “$” 开头的就是 Nginx 变量,基本上分为如下几类
HTTP 请求变量
扫描二维码关注公众号,回复: 2431923 查看本文章- http + ‘*’ + 请求头的参数 表示取得 ‘请求’ 的对应请求头信息
- $sent*http*[HEADER] 表示取得响应的响应头信息
- 注意:要小写并且使用下划线
其他的变量 可以在这里查找
4. 代理服务器
Nginx 的一个常见的功能是将其设置为代理服务器,即接受客户端的请求并将其转发给代理服务器,再接受代理服务器的响应,将他们发送到客户端
server {
listen 8082;
server_name localhost;
location / {
root /www/html;
index index.html;
}
}
server {
listen 8083;
server_name localhost;
location / {
proxy_pass http://localhost:8082; # 请求代理到另外一个地址
}
location ^~ /test { # 请求以 /test 开始则直接返回内容
root /www;
index index.html;
}
}
5. 负载均衡
upstream backend {
server localhost:8082;
server localhost:8082;
keepalive 30;
}
server {
listen 8082;
server_name localhost;
location / {
root /www/html;
index index.html;
}
}
server {
listen 8083;
server_name localhost;
location / {
proxy_pass http://backend; # 负载均衡
}
location ^~ /test {
root /www;
index index.html;
}
}