目录
nginx配置文件结构
nginx文件结构
... #全局块
events { #events块
...
}
http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}
说明:
- 全局块: 配置影响nginx全局的指令. 一般有运行nginx服务器的用户组, nginx进程pid存放路径, 日志存放路径, 配置文件引入, 允许生成worker process数等.
- events块: 配置影响nginx服务器或与用户的网络连接. 有每个进程的最大连接数, 选取哪种事件驱动模型处理连接请求, 是否允许同时接受多个网路连接, 开启多个网络连接序列化等
- http块: 可以嵌套多个server, 配置代理, 缓存, 日志定义等绝大多数功能和第三方模块的配置. 如文件引入, mime-type定义, 日志自定义, 是否使用sendfile传输文件, 连接超时时间, 单连接请求数等.
- server块: 配置虚拟主机的相关参数, 一个http中可以有多个server.
- location块: 配置请求的路由, 以及各种页面的处理情况.
配置文件详解
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
#worker_processes 2; #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
#user administrator administrators; #配置用户或者组,默认为nobody nobody。
#worker_processes auto;
#worker_processes 2; #允许生成的进程数,默认为1
error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512
}
#rtmp server
#rtmp {
# server{
# listen 1935; #服务端口
# chunk_size 4000; #传输块的大小
#
# #流应用
# application live
# {
# live on;
# record off; #关闭录制
# allow play all; #允许任何人发起请求
# }
# }
#}
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 /var/log/nginx/access.log main; # 日志的格式, 指定为上面自定义的main
sendfile on; #开启高效文件传输模式, sendfile指令指定nginx是否调用sendfile函数
#来输出文件, 对于普通应用设为on, 如果用来进行下载等应用磁盘IO重负
#载应用, 可设置为off, 以平衡磁盘与网络I/O处理速度, 降低系统的负载,
#注意: 如果图片显示不正常, 把这个改为off
sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
#tcp_nopush on; #防止网络阻塞
#tcp_nodelay on; #防止网络阻塞
keepalive_timeout 65; #长连接超时时间, 单位秒
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream; #默认文件类型 默认为text/plain
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
ssl_certificate "/etc/nginx/cert/cert.pem";
ssl_certificate_key "/etc/nginx/cert/cert.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
#listen 80 default_server;
#listen [::]:80 default_server;
listen 80;
listen [::]:80;
root /usr/share/nginx/html;
keepalive_requests 120; #单连接请求上限次数。
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
root /usr/share/nginx/html; # 根目录
index index.html index.htm; # 默认页
# proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
deny 127.0.0.1; #拒绝的ip
allow 172.18.5.54; #允许的ip
}
error_page 404 /404.html;
location = /40x.html {
root /usr/share/nginx/html;
index 40x.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
# Settings for a TLS enabled server.
#
# server {
# listen 443 ssl http2 default_server;
# listen [::]:443 ssl http2 default_server;
# server_name _;
# root /usr/share/nginx/html;
#
# ssl_certificate "/etc/pki/nginx/server.crt";
# ssl_certificate_key "/etc/pki/nginx/private/server.key";
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 10m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# location / {
# }
#
# error_page 404 /404.html;
# location = /40x.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }
}
上面是nginx的基本配置,需要注意的有以下几点:
- $remote_addr 与 $http_x_forwarded_for 用以记录客户端的ip地址
- $remote_user 用来记录客户端用户名称
- $time_local 用来记录访问时间与时区
- $request 用来记录请求的url与http协议
- $status 用来记录请求状态. 成功是200
- $body_bytes_s ent 记录发送给客户端文件主体内容大小
- $http_referer 用来记录从那个页面链接访问过来的
- $http_user_agent 记录客户端浏览器的相关信息
- 惊群现象: 一个网路连接到来, 多个睡眠的进程被同事叫醒, 但只有一个进程能获得链接, 这样会影响系统性能
- 每个指令必须有分号结束
负载均衡配置
upstream
upstream这个配置是写一组被代理的服务器地址, 然后配置负载均衡的算法. 这里的被代理服务器地址有2中写法
upstream mysvr {
server 192.168.10.121:3333;
server 192.168.10.122:3333;
}
server {
....
location ~*^.+$ {
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
}
upstream mysvr {
server http://192.168.10.121:3333;
server http://192.168.10.122:3333;
}
server {
....
location ~*^.+$ {
proxy_pass mysvr; #请求转向mysvr 定义的服务器列表
}
upstream配置算法
热备
如果你有2台服务器, 当一台服务器发生事故时, 才启用第二台服务器给提供服务. 服务器处理请求的顺序: AAAAAA突然A挂啦, BBBBBBBBBBBBBB…..
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
轮询
nginx默认就是轮询其权重都默认为1, 服务器处理请求的顺序: ABABABABAB….
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333;
}
加权轮询
跟据配置的权重的大小而分发给不同服务器不同数量的请求. 如果不设置, 则默认为1. 下面服务器的请求顺序为: ABBABBABBABBABB….
upstream mysvr {
server 127.0.0.1:7878 weight=1;
server 192.168.10.121:3333 weight=2;
}
4、ip_hash:nginx会让相同的客户端ip请求相同的服务器。
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333;
ip_hash;
}
关于nginx负载均衡配置的几个状态参数讲解
down // 表示当前的server暂时不参与负载均衡。
backup // 预留的备份机器. 当其他所有的非backup机器出现故障或者忙的时候, 才会请求backup机器, 因此这台机器的压力最轻
max_fails // 允许请求失败的次数, 默认为1. 当超过最大次数时, 返回proxy_next_upstream 模块定义的错误
fail_timeout // 在经历了max_fails次失败后, 暂停服务的时间. max_fails可以和fail_timeout一起使用
// 示例
upstream mysvr {
server 127.0.0.1:7878 weight=2 max_fails=2 fail_timeout=2;
server 192.168.10.121:3333 weight=1 max_fails=2 fail_timeout=1;
}
nginx配置规则初步了解
location / {
root html; //网页发布目录(nginx的主目录的相对路径, 也可以使用绝对路径)
index index.html index.htm; //网页发布的默认文件
}
nginx 工作原理:
nginx由nginx内核和模块组成, 其中内核的设计非常微小和简洁, 完成的工作也非常简单, 仅仅通过查找配置文件将客户端的请求映射到一个location block, 而location是nginx配置中的一个指令, 用于访问url匹配, 而这个location中所配置的每个指令将会启动不同的模块去完成相应的工作.
统一资源定位器(url): http://60.191.222.70, url可以用来标识一个资源, 而且访问或者获取改资源.
默认nginx.conf配置文件中至少存在一个location / 即表示客户端浏览器请求的url为: 域名 + /
nginx location规则演示案例
location = / {
[ configuration L1 ]
location = / = https://60.191.222.70/
}
正则匹配例子
location ~* \.(html|txt|gif|jpg|jpeg)$ {
.......
.......
}
等号精确匹配, 优先级更高
location = / {
echo 'dingfang1';
}
location / {
echo 'dingfang2';
}
正则匹配优先级低
location ~* \.(....|...|...|..|..)$ {
echo '....';
}
location 匹配的URL方式如下
= // 字面精确匹配
^~ // 最大前缀匹配
/ // 不带任何前缀匹配根
~ // 大小写相关的正则匹配
~* // 大小写无关的正则匹配
!~ // 区分大小写的非正则匹配
!~* // 不区分大小写的非正则匹配
nginx进程管理
nginx常用命令
cmd
nginx -s stop // 快速关闭
kill -TERM 主进程号 // 快速关闭
kill -INT 主进程号 // 快速关闭
nginx -s reload // 重新加载配置文件
kill -HUP 主进程号 // 重新加载配置文件
nginx -t // 测试配置文件, 检查配置文件语法是否正确, 然后试图打开文件涉及的配置
nginx -v // 查看nginx版本信息
nginx -V // 查看nginx版本信息, 编译版本, 和配置参数
nginx -s reopen // 重启日志文件,备份日志文件时常用
kill -USR1 主进程号 // 重启日志文件,备份日志文件时常用
nginx的平滑升级
nginx平滑升级
如果你需要升级或者添加, 删除服务器模块时, 可以通过nginx的平滑升级, 在不停止服务的情况下升级nginx
- 用新的nginx可执行程序替换旧的可执行程序, 即下载新的nginx, 重新编译到旧版本的安装路径中(重新编译之前可以备份旧的可执行文件)
- 给nginx主进程号发送USR2信号
kill -USR2 旧主进程号
给nginx发送USR2信号后, nginx会将logs/nginx.pid文件重命名为nginx.pid.oldbin, 然后用新的可执行文件启动一个新的nginx主进程和对应的工作进程, 并新建一个新的nginx.pid保存新的主进程号
这时, nginx的新的实例和旧的实例同时工作, 共同处理请求连接. 接下来要关闭旧的实例进程.
- 给旧的主进程发送WINCH信号
kill -WINCH 旧主进程号
旧的主进程号收到WINCH信号后, 将旧进程号管理的旧的工作进程优雅的关闭. 即一段时间后旧的工作进程全部关闭, 只有新的工作进程在处理请求连接. 这时, 依然可以恢复到旧的进程服务, 因为旧的进程的监听socket还未停止.
4. 给旧的主进程发送QUIT信号, 使其关闭
kill -QUIT 旧主进程号
给旧的主进程发送QUIT信号后, 旧的主进程退出, 并移除logs/nginx.pid.oldbin文件, nginx的升级完成
中途停止升级, 回滚到旧的nginx
在上面的步骤(3)时, 如果想回到旧的nginx不再升级 可执行如下操作
- 给旧的主进程号发送HUP命令
此时nginx不重新读取配置文件的情况下重新启动旧主进程的工作进程.
kill -HUP 旧主进程号
- 优雅的关闭新的主进程
kill -QUIT 新主进程号
注: 如果由于某种原因, 无法关闭新主进程的工作进程, 直接给进程号发送KILL信号
// nginx的进程分为主进程和工作进程,关于nginx的信号,主进程支持以下信号
TERM, INT // 快速关闭
QUIT // 优雅的关闭
KILL // 关闭一个顽固进程
HUP // 改变配置, 使用新配置开启新的工作进程, 优雅的关闭旧的进程
USR1 // 重新开启日志文件
USR2 // 平滑升级nginx
WINCH // 优雅的关闭工作进程
// 单个工作进程也可以通过信号控制, 但它不是必须的. 单个工作进程支持的信号有
TERM, INT // 快速关闭
QUIT // 优雅的关闭
USR1 // 重新开启日志文件
WINCH // 异常终止调试(需要启动debug_points)
反向代理
通用配置
# location /xxx {
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 20m;
proxy_pass http://localhost:4000;
}
下面介绍的几种情况配置, 实际使用时需要添加上通用配置项中未包含的内容
直接以根目录代理
location / {
proxy_pass http://localhost:4000;
}
效果
请求nginx uri: http://uri:post/test_api/xxx/xx
nginx替换后uri: http://uri:post/test_api/xxx/xx
二级路径代理
带有子路径代理有三种情况
情况一
配置
location /test_api {
proxy_pass http://localhost:4000;
}
# 或
location /test_api/ {
proxy_pass http://localhost:4000;
}
效果
请求nginx uri: http://uri:post/test_api/xxx/xx
nginx替换后uri: http://uri:post/test_api/xxx/xx
情况二
配置
location /test_api {
proxy_pass http://localhost:4000/;
}
效果
请求nginx uri: http://uri:post/test_api/xxx/xx
nginx替换后uri: http://uri:post//xxx/xx
注意这里nginx替换后, 如果请求带有多级路径的话, 端口后会包含两个斜杠(
/
)
情况三
配置
location /test_api/ {
proxy_pass http://localhost:4000/;
}
效果
请求nginx uri: http://uri:post/test_api/xxx/xx
nginx替换后uri: http://uri:post/xxx/xx
与情况二的区别就是不会包含两个斜杠(
/
)
配置示例
default
ssl.conf
#################################################
#ssl#
listen 443 ssl http2;
listen [::]:443 ssl http2;
# ssl_certificate "/etc/nginx/cert/4733544_www.changdingfang.com.pem";
# ssl_certificate_key "/etc/nginx/cert/4733544_www.changdingfang.com.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
##
#################################################
rtmp
#rtmp server
#rtmp {
# server{
# listen 1935; #服务端口
# chunk_size 4000; #传输块的大小
#
# #流应用
# application live
# {
# live on;
# record off; #关闭录制
# allow play all; #允许任何人发起请求
# }
# }
#}
error
error_page 404 /404.html;
location = /40x.html {
root /usr/share/nginx/html;
index 40x.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
conf.d
nginx.conf
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
#user nginx;
#worker_processes auto;
#worker_processes 2;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
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 /var/log/nginx/access.log main;
sendfile on; #开启高效文件传输模式, sendfile指令指定nginx是否调用sendfile函数
#来输出文件, 对于普通应用设为on, 如果用来进行下载等应用磁盘IO重负
#载应用, 可设置为off, 以平衡磁盘与网络I/O处理速度, 降低系统的负载,
#注意: 如果图片显示不正常, 把这个改为off
#tcp_nopush on; #防止网络阻塞
#tcp_nodelay on; #防止网络阻塞
keepalive_timeout 65; #长连接超时时间, 单位秒
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream; #默认文件类型
include /etc/nginx/conf.d/*.conf;
}
default
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
# location / {
# try_files $uri $uri/ =404;
# }
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 20m;
proxy_pass http://localhost:4000;
}
}
custom
server {
#################################################
#ssl#
ssl_certificate "/etc/nginx/cert/changdingfang.com.pem";
ssl_certificate_key "/etc/nginx/cert/changdingfang.com.key";
##
#################################################
listen 80;
listen [::]:80;
server_name changdingfang.com www.changdingfang.com;
root /usr/share/nginx/html;
include /etc/nginx/default.d/*.conf;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 20m;
proxy_pass http://localhost:4000;
}
location /grafana/ {
proxy_pass http://changdingfang.com:3000/;
}
location /dfsrr/ {
proxy_pass http://localhost:4388/;
}
######################################################################
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 245292011@qq.com