1. 参考资料
2. Nginx 配置
2.1 Nginx 目录结构
nginx-1.20.2
|
|--- nginx.exe
|
|--- conf
| |--- nginx.conf #nginx配置文件
| |--- mime.types
| |--- fastcgi.conf
| |--- fastcgi_params
| |--- koi-utf
| |--- koi-win
| |--- scgi_params
| |--- uwsgi_params
| |--- win-utf
|
|--- html
| |--- 50x.html
| |--- index.html
|
|--- logs
|
|--- temps
|
|--- docs
|
|--- contrib
2.2 nginx.conf 结构
nginx.conf
|
|--- main //
|
|--- events
|
|--- http
|
|--- server
|--- location
nginx 配置文件主要由 main、events、http、server、location 块组成。每个块的作用:
- main : 主要控制子进程所属的用户和用户组、派生子进程数、错误日志位置、pid进程文件位置与级别、子进程优先级、进程对应 CPU以及进程能够打开的最大文件描述符等。
-
- events:控制 Nginx 处理连接方式
- http:Nginx 处理 HTTP 请求的主要配置块
- server: Nginx 中虚拟主机配置块,可配置多个虚拟主机
- location: server 中对应目录级别的控制块,可以有多个
nginx.conf 内容:
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
2.3 nginx.conf 配置详解
Nginx 配置文件中默认配置指令含义:
worker_processes
:配置 Nginx 工作进程数,一般是 CPU核数或CPU核数的2倍worker_connections
: 配置 Nginx 允许单个进程并发连接的最大请求数include
:用于引入配置文件default_type
:设置默认文件类型sendfile
:默认值为 on,表示开启高速文件传输模式。listen
:监听端口server_name
:设置主机域名,用于和 HTTP 请求头中的“Host”域匹配root
:主机站点的根目录地址,即应用目录index
:指定默认索引文件,一般为 index.htmlerror_page
:错误页面,比如 404.html
2.3.1 配置子进程的用户和用户组
Nginx 是由一个主进程和多个工作进程组成的,主进程一般是 root 用户启动,工作进程默认是 nobody 用户启动。nobody 用户是一个不能登录的用户。
nginx.conf:
# user [用户名] [用户组名]
user nouser nogroup; # 表示用户是nouser,用户组是nogroup
2.3.2 自定义错误页面
nginx 使用 error_page
指令配置错误页面。
error_page
指令语法:
error_page code ... [=[response]] uri;
# code: HTTP 错误码
# =response : 修改响应的错误码,匹配到的错误码统一返回 response
# uri : 转发的地址
error_page
指令可放置的上下文:http, server, location, if in location
- 为每种错误设置单独的处理方式
error_page 403 /403.html
error_page 404 /404.html
- 利用在线资源处理错误
error_page 403 http://backend/forbidden
error_page 500 502 503 504 http://backend/error
- 更改响应编码
error_page 404 =200 /404.html
2.3.3 访问控制
Nginx 提供了 2 个配置访问控制权限的指令: allow
,deny
。
allow
指令
语法:allow address | CIDR | unix: | all;
上下文:http, server, location, limit_except
deny
指令
语法:deny address | CIDR | unix: | all;
上下文:http, server, location, limit_except
注意:
- 单个IP指定范围最小,all指定范围最大
- 同一个块中,若同时存在多个 allow/deny 指令配置,那么先出现的访问权限生效,会覆盖之后相同范围的设置。
- 当多个块(http,server,location)中都出现了权限设置,则内层的块设置优先级最高。
2.3.4 location 指令
location
指令
语法: location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
上下文: server, location
location 前缀:
=
:根据其后的模式进行精确匹配,必须完全一致才能执行之后的指令块~
:使用正则表达式完成 location 匹配,区分大小写~*
:使用正则表达式完成 location 匹配,不区分大小写^~
:不使用正则表达式匹配,以指定模式为开头匹配 location@
:用于定义一个 location块,外部客户端无法访问只能是 nginx 内部配置指令访问
location 前缀遵循“最大前缀匹配”,即前缀匹配最多的优先
# "localtion / {...}" 和 "localtion =/ {...}"区别:
(1)localtion / {...} 遵循最大前缀匹配原则,相当于站点的默认配置
(2)localtion =/ {...} 精确匹配,只能匹配网站根目录
2.3.5 日志文件
2.3.5.1 访问日志
nginx 使用 log_format
和access_log
指令配置访问日志。
log_format
指定日志打印格式;access_log
指令指定访问日志路径。
log_format
指令:
语法: log_format name [escape=default|json|none] string ...;
默认值: log_format combined "...";
上下文: http
nginx.conf :
http {
...
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;// main 是日志格式的名字。
...
}
日志格式相关的内置变量:
- $remote_addr:客户端IP
- $remote_user:客户端用户名,用于记录浏览者进行身份认证时的用户名,没有验证则为空
- $time_local:访问的时间与时区
- $request:请求的 URI 和 HTTP 协议版本
- $status:请求返回的 HTTP 状态码
- $body_bytes_sent:发送给客户端 body 内容大小
- $http_referer:来路 URL 地址
- $http_user_agent:客户端浏览器引擎
- $http_x_forwarded_for:客户端IP地址列表(包括中间经过的代理)
access_log
指令
语法: access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
默认配置: access_log logs/access.log combined;
上下文: http, server, location, if in location, limit_except
关闭访问日志:
access_log off;
2.3.5.2 错误日志
nginx 使用 error_log
指令配置错误日志。
默认配置:
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
语法: error_log file [level];
默认配置: error_log logs/error.log error;
上下文: main, http, mail, stream, server, location
关闭错误日志:
error_log /dev/null
2.3.5.3 日志切割
- 自动切割
编写以下脚本,进行日志切割
#!/bin/bash
# 1.指定日志文件路径
log_path="/usr/local/nginx/logs"
# 2.备份日志文件
mv $log_path/access_log.log $log_path/`date + "%Y%m%d%H%M"`.log
# 3.nginx 重新打开文件
/usr/local/nginx/nginx -s reopen
2.3.6 虚拟主机
2.3.6.1 基于端口号配置虚拟主机
原理是一个Nginx 监听多个端口,根据不同的端口号区分不同的应用。
http {
server {
# 基于 8000 端口
listen 8000;
server_name 192.168.20.1;
location / {
# 网站根目录是 html/8000 文件夹
root html/8000;
index index.html index.htm;
}
}
server {
# 基于 9000 端口
listen 9000;
server_name 192.168.20.1;
location / {
# 网站根目录是 html/9000 文件夹
root html/9000;
index index.html index.htm;
}
}
}
2.3.6.2 基于 IP 配置虚拟主机
http {
server {
# 基于 8000 端口
listen 8000;
# 基于IP
server_name 192.168.30.1;
location / {
# 网站根目录是 html/192.168.30.1 文件夹
root html/192.168.30.1;
index index.html index.htm;
}
}
server {
# 基于 8000 端口
listen 8000;
# 基于IP
server_name 192.168.30.2;
location / {
# 网站根目录是 html/192.168.30.2 文件夹
root html/192.168.30.2;
index index.html index.htm;
}
}
}
2.3.6.3 基于域名配置虚拟主机
http {
# another virtual host using mix of IP-, name-, and port-based configuration
#
server {
# 基于 80 端口
listen 80;
# 基于域名
server_name www.lihwstudy.com;
location / {
# 网站根目录是 html 文件夹
root html;
index index.html index.htm;
}
}
}
2.3.6.4 server_name
指令
server_name
指令配置主要用于和 HTTP 请求头中“Host”域进行匹配
语法: server_name name ...;
默认配置: server_name "";
上下文: server
虚拟主机名字支持通配符、正则表达式匹配。
server_name 匹配优先级
1. 精确匹配最高
2. 以“*”开头的最长通配符匹配
3. 以“*”结尾的最长通配符匹配
4. 第一个匹配的正则表达式
2.3.6.5 设置目录列表
Nginx 默认不允许列出所有目录,当用户访问站点时,且站点下没有index指定的默认索引文件,那么会报 403 forbidden。
nginx 使用autoindex
指令设置网站目录列表;
语法: autoindex on | off;
默认配置: autoindex off;
上下文: http, server, location
nginx 使用autoindex_exact_size
指令设置是否显示文件大小;
语法: autoindex_exact_size on | off;
默认配置: autoindex_exact_size on;
上下文: http, server, location
autoindex_localtime
设置显示服务器时间;
语法: autoindex_localtime on | off;
默认配置: autoindex_localtime off;
上下文: http, server, location
2.3.6.6 引入子配置文件
nginx 使用 include
指令引入子配置文件。
语法: include file | mask;
上下文: any
2.3.7 连接数优化
# worker_processes 设置工作进程个数,auto 将按照CPU核心数控制
worker_processes auto;
# 最大打开文件个数
worker_rlimit_nofile 65535;
events {
# 设置每个工作进程最大连接数
worker_connections 65535;
# 是否允许一个工作进程响应多个请求
multi_accept on;
}
2.3.8 客户端并发请求控制
这里需要用到几个指令:
limit_conn
:限制并发连接数limit_conn_zone
:开辟一个共享内存空间保存客户端IP
# key :存储的 key
# name:空间名字
# size:空间大小
语法: limit_conn_zone key zone=name:size;
上下文: http
# 1mb 空间可以保留 32000条 32字节的状态或16000条 64字节状态.
limit_rate
:服务器在响应时传输速率限制limit_rate_after
:用于在已经传出固定大小数据后,再开始限速
- 限制同一个 IP 的并发数
http {
# $binary_remote_addr 客户端IP二进制
# 开辟一块名字为 perip 大小为 10m,用于存储IP和其连接数
limit_conn_zone $binary_remote_addr zone=perip:l0m;
limit_conn perip 10;
}
- 限制虚拟主机的并发数
http {
limit_conn_zone $server_name zone=zonename:l0m;
server {
listen 80;
server_name localhost;
limit_conn zonename 10;
}
}
- 限制响应传输速率
http {
# 100kb/s
limit_rate 100k;
# 传输10m后再限速
limit_rate_after 10m;
}
在传输10m以后,限制速率为 100kb/s
2.3.9 缓存优化
expires
指令为静态资源设置过期时间。
会修改响应码为200, 201 , 204, 206, 301, 302, 303, 304, 307 , 308 的响应头中“Expires” 和 “Cache-Control”域
# epoch:
# max:表示 10年后
# off:关闭
语法: expires [modified] time;
expires epoch | max | off;
默认配置: expires off;
上下文: http, server, location, if in location
time的值:参见 https://nginx.org/en/docs/syntax.html
2.4 nginx.conf 配置例子
2.4.1 反向代理
http {
server {
# 基于 80 端口
listen 80;
server_name www.lihwstudy.com;
# 将所有访问 www.lihwstudy.com 域名的请求都转发到 http://192.168.10.1:8080/
location / {
proxy_pass http://192.168.10.1:8080/
}
}
server {
# 基于 80 端口
listen 80;
server_name www.lihwwork.com;
# 将所有访问 www.lihwwork.com 域名的请求都转发到 http://192.168.10.2:8080/
location / {
proxy_pass http://192.168.10.2:8080/
}
}
}
Nginx 提供的反向代理的指令:
proxy_pass
:设置后端服务器地址
语法: proxy_pass URL;
上下文: location, if in location, limit_except
proxy_set_header
:在请求发送给服务器前,更改来自客户端请求头中的信息
语法: proxy_set_header field value;
默认配置: proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
上下文: http, server, location
proxy_connect_timeout
:配置尝试连接的超时时间
语法: proxy_connect_timeout time;
默认配置: proxy_connect_timeout 60s;
上下文: http, server, location
proxy_read_timeout
:Nginx 向服务器发出read 请求后,等待响应的超时时间
语法: proxy_read_timeout time;
默认配置: proxy_read_timeout 60s;
上下文: http, server, location
proxy_send_timeout
:Nginx 向服务器发出 write 请求后,等待响应的超时时间
语法: proxy_send_timeout time;
默认配置: proxy_send_timeout 60s;
上下文: http, server, location
proxy_redirect
:修改服务器返回的响应头中的 Location 和 refresh
语法: proxy_redirect default;
proxy_redirect off;
proxy_redirect redirect replacement;
默认配置: proxy_redirect default;
上下文: http, server, location
2.4.2 负载均衡
nginx 使用upstream
指令配置负载均衡。upstream
指令属于 ngx_http_upstream_module 模块
ngx_http_upstream_module 模块定义一组服务器,可以被proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass, and grpc_pass 指令引用
语法: upstream name { ... }
上下文: http
配置例子:
upstream 服务器组名 {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;
server backup1.example.com:8080 backup;
server backup2.example.com:8080 backup;
}
server {
location / {
proxy_pass http://服务器组名;
}
}
负载均衡配置方式
- 轮询
- 权重
- ip_hash
- 第三方模块
2.4.2.1 轮询
# 配置负载均衡服务器组
upstream web_server {
server 192.168.20.1;
server 192.168.20.2;
}
server {
listen 80
server_name www.lihwstudy.com
location / {
proxy_pass http://web_server;
}
}
2.4.2.2 加权轮询
可以添加 weight 参数指定权重。
# 配置负载均衡服务器组
upstream web_server {
server 192.168.20.1 weight=1;
server 192.168.20.2 weight=3;
}
server {
listen 80
server_name www.lihwstudy.com
location / {
proxy_pass http://web_server;
}
}
upstream 块中 server
指令:
语法: server address [parameters];
上下文: upstream
server
指令参数:
- weight=number 权重,默认值1
- max_conns=number 单个服务最大连接数,0代表不限制
- max_fails=number 最大失败尝试次数,默认 1 次。
- fail_timeout=time 经历了 max_fails 次失败后,暂停服务的时间,默认 10 秒
- backup 预留的备份机器,不能和hash, ip_hash, random搭配使用
- down 表示当前 server 不参与负载均衡
- resolve 服务器域名对应的IP地址如果如发生改变,会自动改变配置文件,不需要重启 Nginx;必须在 http或 upstream块中声明resolver 指令。
- route=string 设置该服务器路由名字
- service=name 必须使用resolve参数才能生效
- slow_start=time 不健康的server等待多长时间恢复为健康,0表示禁止。不能和hash, ip_hash, random搭配使用
2.4.2.3 IP Hash
ip hash 是将每个请求按照客户端的IP的hash结果分配。
# 配置负载均衡服务器组
upstream web_server {
ip_hash;
server 192.168.20.1;
server 192.168.20.2;
}
server {
listen 80
server_name www.lihwstudy.com
location / {
proxy_pass http://web_server;
}
}
ip_hash 方式,server不能使用 backup和weight参数
2.4.2.4 第三方模块
以 fair 为例:
(1)备份原来的nginx
(2)重新编译安装nginx
github上下载 nginx-upstream-fair-master.zip
./configure --prefix=/usr/local/nginx --with-http_ssl_module --add-module=/root/nginx-upstream-fair
(3)打开新安装的nginx 配置文件添加负载均衡配置
# 配置负载均衡服务器组
upstream web_server {
fair;
server 192.168.20.1;
server 192.168.20.2;
}
server {
listen 80
server_name www.lihwstudy.com
location / {
proxy_pass http://web_server;
}
}
2.4.3 防盗链
valid_referers
指令:
Syntax: valid_referers none | blocked | server_names | string ...;
Default: —
Context: server, location
valid_referers
指令参数:
- none :请求头中没有 Referer域
- blocked:请求头中有 Referer域,但是值被删了
- server_names:请求头中有 Referer域包含一个服务器名字
- 任意字符串:定义一个服务器名或URI前缀
- 正则表达式:必须以“~”开头
location ~* \.(gif|jpg|png|swf|flv)$ {
root html
valid_referers none blocked *.nginxcn.com
if( $invalid_referer) {
# 如果请求头中声明了 Referer 值,$invalid_referer 变量值为空字符串;如果没有声明,那么$invalid _referer 变量值为 1。
rewrite ^/ [www.nginx.cn](http://www.nginx.cn)
# return 404
}
}
2.4.4 解决跨域
转自https://www.cnblogs.com/PengfeiSong/p/12993446.html
server{
listen 5000;
server_name localhost;
location /test {
proxy_pass http://localhost:3000/test;
# 指定允许跨域的方法,*代表所有
add_header Access-Control-Allow-Methods *;
# 预检命令的缓存,如果不缓存每次会发送两次请求
add_header Access-Control-Max-Age 3600;
# 带cookie请求需要加上这个字段,并设置为true
add_header Access-Control-Allow-Credentials true;
# 表示允许这个域跨域调用(客户端发送请求的域名和端口)
# $http_origin动态获取请求客户端请求的域 不用*的原因是带cookie的请求不支持*号
add_header Access-Control-Allow-Origin $http_origin;
# 表示请求头的字段 动态获取
add_header Access-Control-Allow-Headers
$http_access_control_request_headers;
# OPTIONS预检命令,预检命令通过时才发送请求
# 检查请求的类型是不是预检命令
if ($request_method = OPTIONS){
return 200;
}
}
}
3. Nginx 高可用方案
Nginx + Keepalived 实现 Nginx 服务的高可用。
Keepalived 下载地址:https://www.keepalived.org/download.html
- 主服务器Keepalived配置
vrrp_script chk_nginx { # 配置用于检测Nginx运行状态的脚本
script "/chk_nginx.sh" # 脚本路径
interval 2 # 每 2 秒调用1次脚本
weigth -20 # 当检测失败时,权重发生变化
}
vrrp_instance VT_1 { # 配置一个虚拟路由,名字为 VT_1
state MASTER # 指定 keepalived 角色 MASTER 或 BACKUP
interface eth0 # 指定检测的网卡
virtual_router_id 21 # 虚拟路由的标识,同一个 VRRP 的 MASTER 或 BACKUP 一致
mcast_src_ip 192.168.10.1 # 设置真实 IP (可忽略,默认使用主网卡的IP)
priority 100 # 优先级、权重,范围 0~254
advert_int 1 # MASTER 和 BACKUP 之间同步检查时间间隔,单位:秒。
authentication { # 设置验证和密码
auth_type PASS # 验证类型,PASS 表示用密码
auth_pass 123456 # 设置密码,用于 MASTER 和 BACKUP 使用相同密码通信
}
virtual_ipaddress { # 设置虚拟IP地址池,每行1个
192.168.10.10 # 为 MASTER 或 BACKUP 设置相同的 虚拟IP
}
track_script {
chk_nginx
}
}
- 从服务器Keepalived配置
vrrp_script chk_nginx { # 配置用于检测Nginx运行状态的脚本
script "/chk_nginx.sh" # 脚本路径
interval 2 # 每 2 秒调用1次脚本
weigth -20 # 当检测失败时,权重发生变化
}
vrrp_instance VT_1 { # 配置一个虚拟路由,名字为 VT_1
state BACKUP # 指定 keepalived 角色 MASTER 或 BACKUP
interface eth0 # 指定检测的网卡
virtual_router_id 21 # 虚拟路由的标识,同一个 VRRP 的 MASTER 或 BACKUP 一致
mcast_src_ip 192.168.10.1 # 设置真实 IP (可忽略,默认使用主网卡的IP)
priority 90 # 优先级、权重,范围 0~254,比主服务低即可
advert_int 1 # MASTER 和 BACKUP 之间同步检查时间间隔,单位:秒。
authentication { # 设置验证和密码
auth_type PASS # 验证类型,PASS 表示用密码
auth_pass 123456 # 设置密码,用于 MASTER 和 BACKUP 使用相同密码通信
}
virtual_ipaddress { # 设置虚拟IP地址池,每行1个
192.168.10.10 # 为 MASTER 或 BACKUP 设置相同的 虚拟IP
}
track_script {
chk_nginx
}
}
- 检测 nginx 服务脚本
chk_nginx.sh:
#!/bin/bash
if [ `ps -C nginx --no-header | wc -l ` -eq 0 ];then
service nginx start
sleep 2
if [ `ps -C nginx --no-header | wc -l ` -eq 0 ];then
service keepalived stop
fi
fi
4.Nginx 命令
nginx 脚本使用例子:
nginx [-?hvVtTq] [-s signal] [-p prefix]
[-e filename] [-c filename] [-g directives]
# 参数含义说明:
# h:帮助
# v:显示 Nginx 版本并退出
# V:显示 Nginx 版本和配置选项然后退出
# t:测试配置并退出
# T:测试配置,dump 配置并退出
# q:在测试配置过程中,不打印非错误信息
# s:给主进程发送信号
# p:设置前缀 path
# e:设置 error 日志文件
# c: 设置配置文件
# g: 设置配置文件以外的全局指令
使用例子:
# 1. 启动时指定配置文件
./nginx -c /usr/local/nginx/conf/nginx.conf
# 2. 设置路径前缀
./nginx -p /usr/local/nginx/ -c conf/nginx.conf
# 3. 设置错误日志
./nginx -e /usr/local/nginx/logs/error.log
# 4. 立马停止 nginx
./nginx -s stop
# 5. 平滑停止 nginx
./nginx -s quit
# 6. 重新打开日志文件
./nginx -s reopen
# 7. 重新加载 Nginx 配置
./nginx -s reload
# 8.设置全局配置
nginx -g "pid /var/run/nginx.pid; worker_processes `sysctl -n hw.ncpu`;"
本文来自博客园,作者:不安分的黑娃,转载请注明原文链接:https://www.cnblogs.com/lihw-study/p/15596582.html