Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新。性能是 Nginx 最重要的考量,其占用内存少、并发能力强、能支持高达 5w 个并发连接数,最重要的是, Nginx 是免费的并可以商业化,配置使用也比较简单。
Nginx特点:
更多内容查看这篇:《Nginx 离线安装与介绍》
nginx.conf 配置文件的语法规则:
指令
与指令块
构成;;
分号结尾,指令与参数间以空格符号分隔;{}
大括号将多条指令组织在一起;include
语句允许组合多个配置文件以提升可维护性;#
符号添加注释,提高可读性;$
符号使用变量;Nginx 的典型配置示例:
main 全局配置,对全局生效;
events 配置影响 Nginx 服务器与用户的网络连接;
http 配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置;
server 配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块;
location 用于配置匹配的 uri ;
upstream 配置后端服务器具体地址,负载均衡配置不可或缺的部分;
#1. main段配置信息
user nginx; #运行用户,默认即是nginx,可以不进行设置
worker_processes auto; #Nginx 进程数,一般设置为和 CPU 核数一样
error_log /var/log/nginx/error.log warn; #Nginx 的错误日志存放目录
pid /var/run/nginx.pid; #Nginx 服务启动时的 pid 存放位置
#2. events段配置信息
events {
use epoll; #使用epoll的I/O模型(缺省会自动选择一个最适合你操作系统的)
worker_connections 1024; #每个进程允许最大并发数
}
#3. http段配置信息
#配置使用最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里设置
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; #Nginx访问日志存放位置
sendfile on; #开启高效传输模式
tcp_nopush on; #减少网络报文段的数量
tcp_nodelay on;
keepalive_timeout 65; #保持连接的时间,也叫超时时间,单位秒
types_hash_max_size 2048;
include /etc/nginx/mime.types; #文件扩展名与类型映射表
default_type application/octet-stream; #默认文件类型
#4. server段配置信息
server {
listen 80; #配置监听的端口
server_name localhost; #配置的域名
#5. location段配置信息
location / {
root /usr/share/nginx/HTML; #网站根目录
index index.html index.htm; #默认首页文件
deny 172.168.22.11; #禁止访问的ip地址,可以为all
allow 172.168.33.44; #允许访问的ip地址,可以为all
}
error_page 500 502 503 504 /50x.html; #默认50x对应的访问页面
error_page 400 404 error.html; #同上
}
#加载子配置项
include /etc/nginx/conf.d/*.conf;
}
nginx 常用的内置全局变量,你可以在配置中随意使用,点此查看效果:内置变量实例演示
变量 | 说明 |
---|---|
$args | 请求中的参数,例: baidu.com/?a=1&b=1 中的a和b |
$content_length | HTTP 请求信息里的"Content-Length" |
$content_type | HTTP 请求信息里的"Content-Type" |
$document_root | nginx 虚拟主机配置文件中的 root 参数对应的值 |
$document_uri | 当前请求中不包含指令的 URI |
$host | 主机头,也就是域名 |
$http_user_agent | 客户端的详细信息,也就是浏览器的标识 |
$http_cookie | 客户端的 cookie 信息 |
$limit_rate | 如果 nginx服务器使用limit_rate 配置了显示网络速率,则会显示,如果没有设置,则显示0 |
$remote_addr | 客户端的公网ip |
$remote_user | 如果 nginx有配置认证,该变量代表客户端认证的用户名 |
$request_body_file | 做反向代理时发给后端服务器的本地资源的名称 |
$request_method | 请求资源的方式,GET /PUT /DELETE等 |
$request_filename | 当前请求的资源文件的路径名称 |
$request_uri | 请求的链接,包括$document_uri 和$args |
$scheme | 请求的协议,如ftp, http, https |
$server_addr | 服务器IP地址 |
$server_name | 服务器的主机名 |
$server_port | 服务器的端口号 |
#1. user: 指定运行 Nginx 的 woker 子进程的属主和属组,其中组可以不指定。
#语法:user USERNAME [GROUP]
user nginx lion; #用户是nginx; 组是lion
#2. pid: 指定运行 Nginx master 主进程的 pid 文件存放路径。
pid /opt/nginx/logs/nginx.pid; #master主进程的的pid存放在nginx.pid的文件
#3. worker_rlimit_nofile_number: 指定worker子进程可以打开的最大文件句柄数。
worker_rlimit_nofile 20480; #可以理解成每个worker子进程的最大连接数量。
#4. worker_rlimit_core: 指定 worker 子进程异常终止后的 core 文件,用于记录分析问题。
worker_rlimit_core 50M; #存放大小限制
working_directory /opt/nginx/tmp; #存放目录
#5. worker_processes_number:指定 Nginx 启动的 worker 子进程数量。
worker_processes 4; #指定具体子进程数量
worker_processes auto; #与当前cpu物理核心数一致
#6. worker_cpu_affinity:将每个 worker 子进程与我们的 cpu 物理核心绑定。
worker_cpu_affinity 0001 0010 0100 1000; #4个物理核心,4个worker子进程
#7. worker_priority: 指定 worker 子进程的 nice 值,以调整运行 Nginx 的优先级,通常设定为负值,以优先调用 Nginx 。
worker_priority -10; #120-10=110,110就是最终的优先级
#Linux 默认进程的优先级值是120,值越小越优先; nice 值范围为 -20 到 +19 。
#备注:应用的默认优先级值是120加上 nice 值等于它最终的值,这个值越小,优先级越高。
#8. worker_shutdown_timeout: 指定 worker 子进程优雅退出时的超时时间。
worker_shutdown_timeout 5s;
#9. timer_resolution: worker 子进程内部使用的计时器精度,调整时间间隔越大,系统调用越少,有利于性能提升;反之,系统调用越多,性能下降。
timer_resolution 100ms;
#在 Linux 系统中,用户需要获取计时器时需要向操作系统内核发送请求,有请求就必然会有开销,因此这个间隔越大开销就越小。
#10. daemon: 指定 Nginx 的运行方式,前台还是后台,前台用于调试,后台用于生产。
daemon off; #默认是on,后台运行模式
worker_cpu_affinity:将每个 worker 子进程与特定 CPU 物理核心绑定,优势在于,避免同一个 worker 子进程在不同的 CPU 核心上切换,缓存失效,降低性能。但其并不能真正的避免进程切换。
#1. use:Nginx 使用何种事件驱动模型。
use method; #不推荐配置它,让nginx自己选择
#method 可选值为:select、poll、kqueue、epoll、/dev/poll、eventport
#2. worker_connections:worker 子进程能够处理的最大并发连接数。
worker_connections 1024; #每个子进程的最大连接数为1024
#3. accept_mutex:是否打开负载均衡互斥锁。
accept_mutex on; #默认是off关闭的,这里推荐打开
配置 | 位置 | 说明 |
---|---|---|
worker_processes 8 | 开始 | 工作进程, 通常等于CPU数最或者2倍于CPU |
include filename | 任意 | 用于引入其他文件 |
worker_connections | events | 最大连接数 |
keepalive_timeout | http | 连接超时时间,默认为75s |
gzip on | http | 开启 gzip 压缩 |
client_header_buffer_size | http | 设定请求缓冲 |
client_max_body_size | http | 上传文件的大小限制,默认 1m |
keepalive_requests | server | 单连接请求上限次数 |
listen 80 | server | 监听 80 端口 |
server_name | server | 监听地址 |
error_page | server | 定义错误提示界面 |
set | server | 定义变量 |
proxy_pass | location | 代理转发 |
rewrite | location | 重定向 |
return | location | 停止处理请求 |
指定虚拟主机域名
#语法:server_name <name_1> [<name_2> ...]
server_name www.nginx.com;
域名匹配的四种写法:
精确匹配: server_name www.nginx.com
左侧通配: server_name *.nginx.com
右侧统配: server_name www.nginx.*
正则匹配: server_name ~^www.nginx.*$
匹配优先级:精确匹配 > 左侧通配符匹配 > 右侧通配符匹配 > 正则表达式匹配
点此查看:server_name实例演示
#配置 URL路径
location [ = | ~ | ~* | ^~ ] uri { ... }
匹配规则(点此查看:location实例演示):
=
精确匹配;
~
正则匹配,区分大小写;
~*
正则匹配,不区分大小写;
^~
匹配到即停止搜索;
匹配优先级: =
> ^~
> ~
> ~*
> 无符号
location 的末尾斜线 /
#当访问 www.nginx-test.com/test 时,location 中的是否有末尾反斜线,结果如下:
location /test/ { ... }
#末尾带 / 时,Nginx 只会找 test/index.html 文件。
location /test { ... }
#末尾不带 / 时,Nginx 会先找 test/index.html 文件,没有再找 test 文件。
##即:先找是否有 test 目录,有则找 test 目录下的 index.html ;没有则会找是否有 test 文件。
root 与 alias 都可以指定静态资源目录位置,两者选其一即可
寻找资源时:root 会将定义路径
与URI
叠加,alias 则只取定义路径
当用户访问 http://www.test.com/image/1.png 时,实际在服务器找的路径是 /opt/nginx/static/image/1.png
root:指定静态资源目录位置,可以写在 http、server、location 等配置中。
#语法:root path
location /image {
root /opt/nginx/static;
}
alias:指定静态资源目录位置,只能写在 location 中,且资源路径以 /
结尾。
#语法:root path/
location /image {
alias /opt/nginx/static/image/;
}
用于配置代理服务器,如:正向代理,反向代理(点击即可查看演示)
#上下文:location、if、limit_except
#语法:proxy_pass URL;
proxy_pass http://127.0.0.1:8081
proxy_pass http://127.0.0.1:8081/proxy
URL 参数原则:
在配置代理时,proxy_pass 有末尾 带和 不带 / 两种用法,它们的区别可大了:proxy_pass实例演示
用于定义上游服务器(指的就是后台提供的应用服务器)的相关信息。
#上下文:http
##语法
#upstream name {
# server address [parameters] #定义上游服务器地址。
#}
##配置示例
upstream back_end_server {
#上游服务器 权重 最大连接数 判定失败的超时时间 连接失败数
server 127.0.0.1:8081 weight=3 max_conns=1000 fail_timeout=10s max_fails=2;
keepalive 32;
keepalive_requests 50;
keepalive_timeout 30s;
}
在 upstream 内可使用的指令:
zone
#定义共享内存,用于跨 worker 子进程;keepalive <connections>
#对上游服务启用长连接,限制每个 worker 子进程与上游服务器空闲长连接的最大数量。keepalive_requests <number>
#一个长连接最多请求 HTTP 的个数(默认100);:单个长连接可以处理的最多 HTTP 请求个数。keepalive_timeout <time>
#空闲情形下,一个长连接的超时时长;空闲长连接的最长保持时间(默认60s)。hash
#哈希负载均衡算法;ip_hash
#客户端 ip 绑定策略:依据 IP 进行哈希计算,使来自同一个 ip 的请求永远只分配一台服务器。least_conn
#最少连接数算法:将请求优先分配给压力较小的服务器。least_time
#最短响应时间算法:优先分配给响应时间最短的服务器。random
#随机负载均衡算法,random 还支持两种可选的负载均衡模式如下:
random two
:从后端服务器列表中,随机选择两个服务器,然后根据配置的权重(weight)选择其中一个。random two least_conn
:从后端服务器列表中,随机选择两个服务器,然后选择其中连接数较少的服务器。(结合了随机性和最少连接数的优点)server <address> [parameters]
#定义上游服务器地址,parameters 可选值:
weight=<number>
#权重值,默认为1;max_conns=<number>
#上游服务器的最大并发连接数;fail_timeout=<time>
#服务器不可用的判定时间;max_fails=<numer>
#服务器不可用的检查次数;backup
#备份服务器,仅当其他服务器都不可用时才会启用;down
#标记服务器长期不可用,离线维护;点此查看:负载均衡演示
停止处理请求,直接返回响应码或重定向到其他 URL ;执行 return 指令后, location 中后续指令将不会被执行。
#1. user: 指定运行 Nginx 的 woker 子进程的属主和属组,其中组可以不指定。
#语法:user USERNAME [GROUP]
user nginx lion; #用户是nginx; 组是lion
#2. pid: 指定运行 Nginx master 主进程的 pid 文件存放路径。
pid /opt/nginx/logs/nginx.pid; #master主进程的的pid存放在nginx.pid的文件
#3. worker_rlimit_nofile_number: 指定worker子进程可以打开的最大文件句柄数。
worker_rlimit_nofile 20480; #可以理解成每个worker子进程的最大连接数量。
#4. worker_rlimit_core: 指定 worker 子进程异常终止后的 core 文件,用于记录分析问题。
worker_rlimit_core 50M; #存放大小限制
working_directory /opt/nginx/tmp; #存放目录
#5. worker_processes_number:指定 Nginx 启动的 worker 子进程数量。
worker_processes 4; #指定具体子进程数量
worker_processes auto; #与当前cpu物理核心数一致
#6. worker_cpu_affinity:将每个 worker 子进程与我们的 cpu 物理核心绑定。
worker_cpu_affinity 0001 0010 0100 1000; #4个物理核心,4个worker子进程
#7. worker_priority: 指定 worker 子进程的 nice 值,以调整运行 Nginx 的优先级,通常设定为负值,以优先调用 Nginx 。
worker_priority -10; #120-10=110,110就是最终的优先级
#Linux 默认进程的优先级值是120,值越小越优先; nice 值范围为 -20 到 +19 。
#备注:应用的默认优先级值是120加上 nice 值等于它最终的值,这个值越小,优先级越高。
#8. worker_shutdown_timeout: 指定 worker 子进程优雅退出时的超时时间。
worker_shutdown_timeout 5s;
#9. timer_resolution: worker 子进程内部使用的计时器精度,调整时间间隔越大,系统调用越少,有利于性能提升;反之,系统调用越多,性能下降。
timer_resolution 100ms;
#在 Linux 系统中,用户需要获取计时器时需要向操作系统内核发送请求,有请求就必然会有开销,因此这个间隔越大开销就越小。
#10. daemon: 指定 Nginx 的运行方式,前台还是后台,前台用于调试,后台用于生产。
daemon off; #默认是on,后台运行模式
0
根据指定正则表达式匹配规则,重写 URL 。
#1. user: 指定运行 Nginx 的 woker 子进程的属主和属组,其中组可以不指定。
#语法:user USERNAME [GROUP]
user nginx lion; #用户是nginx; 组是lion
#2. pid: 指定运行 Nginx master 主进程的 pid 文件存放路径。
pid /opt/nginx/logs/nginx.pid; #master主进程的的pid存放在nginx.pid的文件
#3. worker_rlimit_nofile_number: 指定worker子进程可以打开的最大文件句柄数。
worker_rlimit_nofile 20480; #可以理解成每个worker子进程的最大连接数量。
#4. worker_rlimit_core: 指定 worker 子进程异常终止后的 core 文件,用于记录分析问题。
worker_rlimit_core 50M; #存放大小限制
working_directory /opt/nginx/tmp; #存放目录
#5. worker_processes_number:指定 Nginx 启动的 worker 子进程数量。
worker_processes 4; #指定具体子进程数量
worker_processes auto; #与当前cpu物理核心数一致
#6. worker_cpu_affinity:将每个 worker 子进程与我们的 cpu 物理核心绑定。
worker_cpu_affinity 0001 0010 0100 1000; #4个物理核心,4个worker子进程
#7. worker_priority: 指定 worker 子进程的 nice 值,以调整运行 Nginx 的优先级,通常设定为负值,以优先调用 Nginx 。
worker_priority -10; #120-10=110,110就是最终的优先级
#Linux 默认进程的优先级值是120,值越小越优先; nice 值范围为 -20 到 +19 。
#备注:应用的默认优先级值是120加上 nice 值等于它最终的值,这个值越小,优先级越高。
#8. worker_shutdown_timeout: 指定 worker 子进程优雅退出时的超时时间。
worker_shutdown_timeout 5s;
#9. timer_resolution: worker 子进程内部使用的计时器精度,调整时间间隔越大,系统调用越少,有利于性能提升;反之,系统调用越多,性能下降。
timer_resolution 100ms;
#在 Linux 系统中,用户需要获取计时器时需要向操作系统内核发送请求,有请求就必然会有开销,因此这个间隔越大开销就越小。
#10. daemon: 指定 Nginx 的运行方式,前台还是后台,前台用于调试,后台用于生产。
daemon off; #默认是on,后台运行模式
1
flag
可选值的含义:
last
重写后的 URL 发起新请求,再次进入 server 段,重试 location 的中的匹配;break
直接使用重写后的 URL ,不再匹配其它 location 中语句;redirect
返回 302 临时重定向;permanent
返回 301 永久重定向;点此查看:rewrite实例演示
#1. user: 指定运行 Nginx 的 woker 子进程的属主和属组,其中组可以不指定。
#语法:user USERNAME [GROUP]
user nginx lion; #用户是nginx; 组是lion
#2. pid: 指定运行 Nginx master 主进程的 pid 文件存放路径。
pid /opt/nginx/logs/nginx.pid; #master主进程的的pid存放在nginx.pid的文件
#3. worker_rlimit_nofile_number: 指定worker子进程可以打开的最大文件句柄数。
worker_rlimit_nofile 20480; #可以理解成每个worker子进程的最大连接数量。
#4. worker_rlimit_core: 指定 worker 子进程异常终止后的 core 文件,用于记录分析问题。
worker_rlimit_core 50M; #存放大小限制
working_directory /opt/nginx/tmp; #存放目录
#5. worker_processes_number:指定 Nginx 启动的 worker 子进程数量。
worker_processes 4; #指定具体子进程数量
worker_processes auto; #与当前cpu物理核心数一致
#6. worker_cpu_affinity:将每个 worker 子进程与我们的 cpu 物理核心绑定。
worker_cpu_affinity 0001 0010 0100 1000; #4个物理核心,4个worker子进程
#7. worker_priority: 指定 worker 子进程的 nice 值,以调整运行 Nginx 的优先级,通常设定为负值,以优先调用 Nginx 。
worker_priority -10; #120-10=110,110就是最终的优先级
#Linux 默认进程的优先级值是120,值越小越优先; nice 值范围为 -20 到 +19 。
#备注:应用的默认优先级值是120加上 nice 值等于它最终的值,这个值越小,优先级越高。
#8. worker_shutdown_timeout: 指定 worker 子进程优雅退出时的超时时间。
worker_shutdown_timeout 5s;
#9. timer_resolution: worker 子进程内部使用的计时器精度,调整时间间隔越大,系统调用越少,有利于性能提升;反之,系统调用越多,性能下降。
timer_resolution 100ms;
#在 Linux 系统中,用户需要获取计时器时需要向操作系统内核发送请求,有请求就必然会有开销,因此这个间隔越大开销就越小。
#10. daemon: 指定 Nginx 的运行方式,前台还是后台,前台用于调试,后台用于生产。
daemon off; #默认是on,后台运行模式
2
condition 判断条件:
$variable
#仅为变量时,值为空或以0开头,字符串都会被当做 false 处理;=
!=
#相等或不等;~
#正则匹配;~*
#正则匹配,不区分大小写;-f
#检测 文件 存在;-d
#检测 目录 存在;-e
#检测 文件、目录、符号链接 等存在;-x
#检测文件可以执行;!
#取反,非;如 ! ~
非正则匹配;或 ! -f
文件不存在用户请求以 / 结尾时,列出目录结构,可以用于快速搭建静态资源
下载网站。
autoindex-nginx.conf 配置信息:
#1. user: 指定运行 Nginx 的 woker 子进程的属主和属组,其中组可以不指定。
#语法:user USERNAME [GROUP]
user nginx lion; #用户是nginx; 组是lion
#2. pid: 指定运行 Nginx master 主进程的 pid 文件存放路径。
pid /opt/nginx/logs/nginx.pid; #master主进程的的pid存放在nginx.pid的文件
#3. worker_rlimit_nofile_number: 指定worker子进程可以打开的最大文件句柄数。
worker_rlimit_nofile 20480; #可以理解成每个worker子进程的最大连接数量。
#4. worker_rlimit_core: 指定 worker 子进程异常终止后的 core 文件,用于记录分析问题。
worker_rlimit_core 50M; #存放大小限制
working_directory /opt/nginx/tmp; #存放目录
#5. worker_processes_number:指定 Nginx 启动的 worker 子进程数量。
worker_processes 4; #指定具体子进程数量
worker_processes auto; #与当前cpu物理核心数一致
#6. worker_cpu_affinity:将每个 worker 子进程与我们的 cpu 物理核心绑定。
worker_cpu_affinity 0001 0010 0100 1000; #4个物理核心,4个worker子进程
#7. worker_priority: 指定 worker 子进程的 nice 值,以调整运行 Nginx 的优先级,通常设定为负值,以优先调用 Nginx 。
worker_priority -10; #120-10=110,110就是最终的优先级
#Linux 默认进程的优先级值是120,值越小越优先; nice 值范围为 -20 到 +19 。
#备注:应用的默认优先级值是120加上 nice 值等于它最终的值,这个值越小,优先级越高。
#8. worker_shutdown_timeout: 指定 worker 子进程优雅退出时的超时时间。
worker_shutdown_timeout 5s;
#9. timer_resolution: worker 子进程内部使用的计时器精度,调整时间间隔越大,系统调用越少,有利于性能提升;反之,系统调用越多,性能下降。
timer_resolution 100ms;
#在 Linux 系统中,用户需要获取计时器时需要向操作系统内核发送请求,有请求就必然会有开销,因此这个间隔越大开销就越小。
#10. daemon: 指定 Nginx 的运行方式,前台还是后台,前台用于调试,后台用于生产。
daemon off; #默认是on,后台运行模式
3
在学习如何配置 HTTPS 之前,我们先来简单回顾下 HTTPS 的工作流程是怎么样的?它是如何进行加密保证安全的?
这就是 HTTPS 的基本运作原理,使用对称加密和非对称机密配合使用,保证传输内容的安全性。
有兴趣的可点此查看:《什么是 SSL、TLS 和 HTTPS?》
下载证书的压缩文件,里面有个 Nginx 文件夹,把 xxx.crt 和 xxx.key 文件拷贝到服务器目录,再进行如下配置:
#1. user: 指定运行 Nginx 的 woker 子进程的属主和属组,其中组可以不指定。
#语法:user USERNAME [GROUP]
user nginx lion; #用户是nginx; 组是lion
#2. pid: 指定运行 Nginx master 主进程的 pid 文件存放路径。
pid /opt/nginx/logs/nginx.pid; #master主进程的的pid存放在nginx.pid的文件
#3. worker_rlimit_nofile_number: 指定worker子进程可以打开的最大文件句柄数。
worker_rlimit_nofile 20480; #可以理解成每个worker子进程的最大连接数量。
#4. worker_rlimit_core: 指定 worker 子进程异常终止后的 core 文件,用于记录分析问题。
worker_rlimit_core 50M; #存放大小限制
working_directory /opt/nginx/tmp; #存放目录
#5. worker_processes_number:指定 Nginx 启动的 worker 子进程数量。
worker_processes 4; #指定具体子进程数量
worker_processes auto; #与当前cpu物理核心数一致
#6. worker_cpu_affinity:将每个 worker 子进程与我们的 cpu 物理核心绑定。
worker_cpu_affinity 0001 0010 0100 1000; #4个物理核心,4个worker子进程
#7. worker_priority: 指定 worker 子进程的 nice 值,以调整运行 Nginx 的优先级,通常设定为负值,以优先调用 Nginx 。
worker_priority -10; #120-10=110,110就是最终的优先级
#Linux 默认进程的优先级值是120,值越小越优先; nice 值范围为 -20 到 +19 。
#备注:应用的默认优先级值是120加上 nice 值等于它最终的值,这个值越小,优先级越高。
#8. worker_shutdown_timeout: 指定 worker 子进程优雅退出时的超时时间。
worker_shutdown_timeout 5s;
#9. timer_resolution: worker 子进程内部使用的计时器精度,调整时间间隔越大,系统调用越少,有利于性能提升;反之,系统调用越多,性能下降。
timer_resolution 100ms;
#在 Linux 系统中,用户需要获取计时器时需要向操作系统内核发送请求,有请求就必然会有开销,因此这个间隔越大开销就越小。
#10. daemon: 指定 Nginx 的运行方式,前台还是后台,前台用于调试,后台用于生产。
daemon off; #默认是on,后台运行模式
4
注意:
CORS(Cross-Origin Resource Sharing,跨源资源共享)是一种浏览器机制,允许网页从不同的域(源)请求资源。它通过使用额外的 HTTP 头来告诉浏览器,允许某个源(协议 + 域名 + 端口)访问资源,即使这些资源来自不同的源。
同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。
这是一个用于隔离潜在恶意文件的重要安全机制。通常不允许不同源间的读操作。
如果两个页面的协议
,域名
和端口
都相同,则两个页面具有相同的源。
与 URL http://store.company.com/dir/page.html 的源进行对比的示例:
不同源会有如下限制:
例如:
现在我在 fe.server.com 对 dev.server.com 发起请求一定会出现跨域。
如下面的配置:
#1. user: 指定运行 Nginx 的 woker 子进程的属主和属组,其中组可以不指定。
#语法:user USERNAME [GROUP]
user nginx lion; #用户是nginx; 组是lion
#2. pid: 指定运行 Nginx master 主进程的 pid 文件存放路径。
pid /opt/nginx/logs/nginx.pid; #master主进程的的pid存放在nginx.pid的文件
#3. worker_rlimit_nofile_number: 指定worker子进程可以打开的最大文件句柄数。
worker_rlimit_nofile 20480; #可以理解成每个worker子进程的最大连接数量。
#4. worker_rlimit_core: 指定 worker 子进程异常终止后的 core 文件,用于记录分析问题。
worker_rlimit_core 50M; #存放大小限制
working_directory /opt/nginx/tmp; #存放目录
#5. worker_processes_number:指定 Nginx 启动的 worker 子进程数量。
worker_processes 4; #指定具体子进程数量
worker_processes auto; #与当前cpu物理核心数一致
#6. worker_cpu_affinity:将每个 worker 子进程与我们的 cpu 物理核心绑定。
worker_cpu_affinity 0001 0010 0100 1000; #4个物理核心,4个worker子进程
#7. worker_priority: 指定 worker 子进程的 nice 值,以调整运行 Nginx 的优先级,通常设定为负值,以优先调用 Nginx 。
worker_priority -10; #120-10=110,110就是最终的优先级
#Linux 默认进程的优先级值是120,值越小越优先; nice 值范围为 -20 到 +19 。
#备注:应用的默认优先级值是120加上 nice 值等于它最终的值,这个值越小,优先级越高。
#8. worker_shutdown_timeout: 指定 worker 子进程优雅退出时的超时时间。
worker_shutdown_timeout 5s;
#9. timer_resolution: worker 子进程内部使用的计时器精度,调整时间间隔越大,系统调用越少,有利于性能提升;反之,系统调用越多,性能下降。
timer_resolution 100ms;
#在 Linux 系统中,用户需要获取计时器时需要向操作系统内核发送请求,有请求就必然会有开销,因此这个间隔越大开销就越小。
#10. daemon: 指定 Nginx 的运行方式,前台还是后台,前台用于调试,后台用于生产。
daemon off; #默认是on,后台运行模式
5
这样可以完美绕过浏览器的同源策略:
GZIP 是规定的三种标准 HTTP 压缩格式之一。目前绝大多数的网站都在使用 GZIP 传输 HTML、CSS、JavaScript 等资源文件。
对于文本文件, GZiP 的效果非常明显,开启后传输所需流量大约会降至 1/4~1/3 。
启用 gzip 同时需要客户端
和服务端
的支持,然而并不是每个浏览器都支持 gzip 的。
可以通过请求头中的 Accept-Encoding 来标识对压缩的支持,如图:
如果客户端支持 gzip 的解析,那么只要服务端能够返回 gzip 的文件就可以启用 gzip 了,
可以通过 Nginx 的配置来让服务端支持 gzip 。下面的 respone 中 content-encoding:gzip ,指服务端开启了 gzip 的压缩方式。
#1. user: 指定运行 Nginx 的 woker 子进程的属主和属组,其中组可以不指定。
#语法:user USERNAME [GROUP]
user nginx lion; #用户是nginx; 组是lion
#2. pid: 指定运行 Nginx master 主进程的 pid 文件存放路径。
pid /opt/nginx/logs/nginx.pid; #master主进程的的pid存放在nginx.pid的文件
#3. worker_rlimit_nofile_number: 指定worker子进程可以打开的最大文件句柄数。
worker_rlimit_nofile 20480; #可以理解成每个worker子进程的最大连接数量。
#4. worker_rlimit_core: 指定 worker 子进程异常终止后的 core 文件,用于记录分析问题。
worker_rlimit_core 50M; #存放大小限制
working_directory /opt/nginx/tmp; #存放目录
#5. worker_processes_number:指定 Nginx 启动的 worker 子进程数量。
worker_processes 4; #指定具体子进程数量
worker_processes auto; #与当前cpu物理核心数一致
#6. worker_cpu_affinity:将每个 worker 子进程与我们的 cpu 物理核心绑定。
worker_cpu_affinity 0001 0010 0100 1000; #4个物理核心,4个worker子进程
#7. worker_priority: 指定 worker 子进程的 nice 值,以调整运行 Nginx 的优先级,通常设定为负值,以优先调用 Nginx 。
worker_priority -10; #120-10=110,110就是最终的优先级
#Linux 默认进程的优先级值是120,值越小越优先; nice 值范围为 -20 到 +19 。
#备注:应用的默认优先级值是120加上 nice 值等于它最终的值,这个值越小,优先级越高。
#8. worker_shutdown_timeout: 指定 worker 子进程优雅退出时的超时时间。
worker_shutdown_timeout 5s;
#9. timer_resolution: worker 子进程内部使用的计时器精度,调整时间间隔越大,系统调用越少,有利于性能提升;反之,系统调用越多,性能下降。
timer_resolution 100ms;
#在 Linux 系统中,用户需要获取计时器时需要向操作系统内核发送请求,有请求就必然会有开销,因此这个间隔越大开销就越小。
#10. daemon: 指定 Nginx 的运行方式,前台还是后台,前台用于调试,后台用于生产。
daemon off; #默认是on,后台运行模式
6
Nginx 利用 deny 和 allow 指令来实现黑 /白名单的配置,利用黑白名单进行安全配置。
#1. user: 指定运行 Nginx 的 woker 子进程的属主和属组,其中组可以不指定。
#语法:user USERNAME [GROUP]
user nginx lion; #用户是nginx; 组是lion
#2. pid: 指定运行 Nginx master 主进程的 pid 文件存放路径。
pid /opt/nginx/logs/nginx.pid; #master主进程的的pid存放在nginx.pid的文件
#3. worker_rlimit_nofile_number: 指定worker子进程可以打开的最大文件句柄数。
worker_rlimit_nofile 20480; #可以理解成每个worker子进程的最大连接数量。
#4. worker_rlimit_core: 指定 worker 子进程异常终止后的 core 文件,用于记录分析问题。
worker_rlimit_core 50M; #存放大小限制
working_directory /opt/nginx/tmp; #存放目录
#5. worker_processes_number:指定 Nginx 启动的 worker 子进程数量。
worker_processes 4; #指定具体子进程数量
worker_processes auto; #与当前cpu物理核心数一致
#6. worker_cpu_affinity:将每个 worker 子进程与我们的 cpu 物理核心绑定。
worker_cpu_affinity 0001 0010 0100 1000; #4个物理核心,4个worker子进程
#7. worker_priority: 指定 worker 子进程的 nice 值,以调整运行 Nginx 的优先级,通常设定为负值,以优先调用 Nginx 。
worker_priority -10; #120-10=110,110就是最终的优先级
#Linux 默认进程的优先级值是120,值越小越优先; nice 值范围为 -20 到 +19 。
#备注:应用的默认优先级值是120加上 nice 值等于它最终的值,这个值越小,优先级越高。
#8. worker_shutdown_timeout: 指定 worker 子进程优雅退出时的超时时间。
worker_shutdown_timeout 5s;
#9. timer_resolution: worker 子进程内部使用的计时器精度,调整时间间隔越大,系统调用越少,有利于性能提升;反之,系统调用越多,性能下降。
timer_resolution 100ms;
#在 Linux 系统中,用户需要获取计时器时需要向操作系统内核发送请求,有请求就必然会有开销,因此这个间隔越大开销就越小。
#10. daemon: 指定 Nginx 的运行方式,前台还是后台,前台用于调试,后台用于生产。
daemon off; #默认是on,后台运行模式
7
参数说明:
例子:
黑名单: 配置禁止的ip访问,允许其他所有的地址访问。
#1. user: 指定运行 Nginx 的 woker 子进程的属主和属组,其中组可以不指定。
#语法:user USERNAME [GROUP]
user nginx lion; #用户是nginx; 组是lion
#2. pid: 指定运行 Nginx master 主进程的 pid 文件存放路径。
pid /opt/nginx/logs/nginx.pid; #master主进程的的pid存放在nginx.pid的文件
#3. worker_rlimit_nofile_number: 指定worker子进程可以打开的最大文件句柄数。
worker_rlimit_nofile 20480; #可以理解成每个worker子进程的最大连接数量。
#4. worker_rlimit_core: 指定 worker 子进程异常终止后的 core 文件,用于记录分析问题。
worker_rlimit_core 50M; #存放大小限制
working_directory /opt/nginx/tmp; #存放目录
#5. worker_processes_number:指定 Nginx 启动的 worker 子进程数量。
worker_processes 4; #指定具体子进程数量
worker_processes auto; #与当前cpu物理核心数一致
#6. worker_cpu_affinity:将每个 worker 子进程与我们的 cpu 物理核心绑定。
worker_cpu_affinity 0001 0010 0100 1000; #4个物理核心,4个worker子进程
#7. worker_priority: 指定 worker 子进程的 nice 值,以调整运行 Nginx 的优先级,通常设定为负值,以优先调用 Nginx 。
worker_priority -10; #120-10=110,110就是最终的优先级
#Linux 默认进程的优先级值是120,值越小越优先; nice 值范围为 -20 到 +19 。
#备注:应用的默认优先级值是120加上 nice 值等于它最终的值,这个值越小,优先级越高。
#8. worker_shutdown_timeout: 指定 worker 子进程优雅退出时的超时时间。
worker_shutdown_timeout 5s;
#9. timer_resolution: worker 子进程内部使用的计时器精度,调整时间间隔越大,系统调用越少,有利于性能提升;反之,系统调用越多,性能下降。
timer_resolution 100ms;
#在 Linux 系统中,用户需要获取计时器时需要向操作系统内核发送请求,有请求就必然会有开销,因此这个间隔越大开销就越小。
#10. daemon: 指定 Nginx 的运行方式,前台还是后台,前台用于调试,后台用于生产。
daemon off; #默认是on,后台运行模式
8
在这个配置下,234、235和236的ip访问不了服务器,会显示403 Forbidden,而其他ip都可以访问。
白名单: 配置允许的ip访问,禁止其他所有的地址访问。
#1. user: 指定运行 Nginx 的 woker 子进程的属主和属组,其中组可以不指定。
#语法:user USERNAME [GROUP]
user nginx lion; #用户是nginx; 组是lion
#2. pid: 指定运行 Nginx master 主进程的 pid 文件存放路径。
pid /opt/nginx/logs/nginx.pid; #master主进程的的pid存放在nginx.pid的文件
#3. worker_rlimit_nofile_number: 指定worker子进程可以打开的最大文件句柄数。
worker_rlimit_nofile 20480; #可以理解成每个worker子进程的最大连接数量。
#4. worker_rlimit_core: 指定 worker 子进程异常终止后的 core 文件,用于记录分析问题。
worker_rlimit_core 50M; #存放大小限制
working_directory /opt/nginx/tmp; #存放目录
#5. worker_processes_number:指定 Nginx 启动的 worker 子进程数量。
worker_processes 4; #指定具体子进程数量
worker_processes auto; #与当前cpu物理核心数一致
#6. worker_cpu_affinity:将每个 worker 子进程与我们的 cpu 物理核心绑定。
worker_cpu_affinity 0001 0010 0100 1000; #4个物理核心,4个worker子进程
#7. worker_priority: 指定 worker 子进程的 nice 值,以调整运行 Nginx 的优先级,通常设定为负值,以优先调用 Nginx 。
worker_priority -10; #120-10=110,110就是最终的优先级
#Linux 默认进程的优先级值是120,值越小越优先; nice 值范围为 -20 到 +19 。
#备注:应用的默认优先级值是120加上 nice 值等于它最终的值,这个值越小,优先级越高。
#8. worker_shutdown_timeout: 指定 worker 子进程优雅退出时的超时时间。
worker_shutdown_timeout 5s;
#9. timer_resolution: worker 子进程内部使用的计时器精度,调整时间间隔越大,系统调用越少,有利于性能提升;反之,系统调用越多,性能下降。
timer_resolution 100ms;
#在 Linux 系统中,用户需要获取计时器时需要向操作系统内核发送请求,有请求就必然会有开销,因此这个间隔越大开销就越小。
#10. daemon: 指定 Nginx 的运行方式,前台还是后台,前台用于调试,后台用于生产。
daemon off; #默认是on,后台运行模式
9
在这个配置下,234、235和236的ip可以访问服务器,而其他所有ip都不允许访问,显示403 Forbidden。
配置禁止访问文件或文件夹
#1. use:Nginx 使用何种事件驱动模型。
use method; #不推荐配置它,让nginx自己选择
#method 可选值为:select、poll、kqueue、epoll、/dev/poll、eventport
#2. worker_connections:worker 子进程能够处理的最大并发连接数。
worker_connections 1024; #每个子进程的最大连接数为1024
#3. accept_mutex:是否打开负载均衡互斥锁。
accept_mutex on; #默认是off关闭的,这里推荐打开
0
也可以把 deny all 改换成 return 404,这样将返回 404 而不是 403 Forbidden,更有“欺骗性”。
缓存可以非常有效的提升性能,因此不论是客户端(浏览器),还是代理服务器( Nginx ),乃至上游服务器都多少会涉及到缓存。可见缓存在每个环节都是非常重要的。
存储一些之前被访问过、而且可能将要被再次访问的资源,使用户可以直接从代理服务器获得,从而减少上游服务器的压力,加快整个访问速度。
下面让我们来学习 Nginx 中如何设置缓存策略。
#1. use:Nginx 使用何种事件驱动模型。
use method; #不推荐配置它,让nginx自己选择
#method 可选值为:select、poll、kqueue、epoll、/dev/poll、eventport
#2. worker_connections:worker 子进程能够处理的最大并发连接数。
worker_connections 1024; #每个子进程的最大连接数为1024
#3. accept_mutex:是否打开负载均衡互斥锁。
accept_mutex on; #默认是off关闭的,这里推荐打开
1
参数含义:
#1. use:Nginx 使用何种事件驱动模型。
use method; #不推荐配置它,让nginx自己选择
#method 可选值为:select、poll、kqueue、epoll、/dev/poll、eventport
#2. worker_connections:worker 子进程能够处理的最大并发连接数。
worker_connections 1024; #每个子进程的最大连接数为1024
#3. accept_mutex:是否打开负载均衡互斥锁。
accept_mutex on; #默认是off关闭的,这里推荐打开
2
#1. use:Nginx 使用何种事件驱动模型。
use method; #不推荐配置它,让nginx自己选择
#method 可选值为:select、poll、kqueue、epoll、/dev/poll、eventport
#2. worker_connections:worker 子进程能够处理的最大并发连接数。
worker_connections 1024; #每个子进程的最大连接数为1024
#3. accept_mutex:是否打开负载均衡互斥锁。
accept_mutex on; #默认是off关闭的,这里推荐打开
3
upstream_cache_status
变量,设置在响应头信息中,在调试中非常有用,它存储了缓存是否命中的信息,如下:
MISS
: #未命中缓存HIT:
: #命中缓存EXPIRED
: #缓存过期STALE
: #命中了陈旧缓存REVALIDDATED
: #Nginx验证陈旧缓存依然有效UPDATING
: #内容陈旧,但正在更新BYPASS
: #响应从原始服务器获取上游服务器:121.42.11.34 ,配置如下:
#1. use:Nginx 使用何种事件驱动模型。
use method; #不推荐配置它,让nginx自己选择
#method 可选值为:select、poll、kqueue、epoll、/dev/poll、eventport
#2. worker_connections:worker 子进程能够处理的最大并发连接数。
worker_connections 1024; #每个子进程的最大连接数为1024
#3. accept_mutex:是否打开负载均衡互斥锁。
accept_mutex on; #默认是off关闭的,这里推荐打开
4
代理服务器:121.5.180.193 ,配置如下:
#1. use:Nginx 使用何种事件驱动模型。
use method; #不推荐配置它,让nginx自己选择
#method 可选值为:select、poll、kqueue、epoll、/dev/poll、eventport
#2. worker_connections:worker 子进程能够处理的最大并发连接数。
worker_connections 1024; #每个子进程的最大连接数为1024
#3. accept_mutex:是否打开负载均衡互斥锁。
accept_mutex on; #默认是off关闭的,这里推荐打开
5
缓存就是这样配置,我们可以在 /etc/nginx/cache_temp 路径下找到相应的缓存文件。
对于一些实时性要求非常高的页面或数据来说,就不应该去设置缓存,下面来看看如何配置不缓存的内容。
添加过滤条件,过滤请求不缓存:
#1. use:Nginx 使用何种事件驱动模型。
use method; #不推荐配置它,让nginx自己选择
#method 可选值为:select、poll、kqueue、epoll、/dev/poll、eventport
#2. worker_connections:worker 子进程能够处理的最大并发连接数。
worker_connections 1024; #每个子进程的最大连接数为1024
#3. accept_mutex:是否打开负载均衡互斥锁。
accept_mutex on; #默认是off关闭的,这里推荐打开
6
#1. use:Nginx 使用何种事件驱动模型。
use method; #不推荐配置它,让nginx自己选择
#method 可选值为:select、poll、kqueue、epoll、/dev/poll、eventport
#2. worker_connections:worker 子进程能够处理的最大并发连接数。
worker_connections 1024; #每个子进程的最大连接数为1024
#3. accept_mutex:是否打开负载均衡互斥锁。
accept_mutex on; #默认是off关闭的,这里推荐打开
7
按照这个配置我们来分析:
配置负载均衡主要是要使用 upstream 指令。
我们把 121.42.11.34 服务器作为上游服务器,做如下配置:
#1. use:Nginx 使用何种事件驱动模型。
use method; #不推荐配置它,让nginx自己选择
#method 可选值为:select、poll、kqueue、epoll、/dev/poll、eventport
#2. worker_connections:worker 子进程能够处理的最大并发连接数。
worker_connections 1024; #每个子进程的最大连接数为1024
#3. accept_mutex:是否打开负载均衡互斥锁。
accept_mutex on; #默认是off关闭的,这里推荐打开
8
把 121.5.180.193 服务器作为代理服务器,做如下配置:
#1. use:Nginx 使用何种事件驱动模型。
use method; #不推荐配置它,让nginx自己选择
#method 可选值为:select、poll、kqueue、epoll、/dev/poll、eventport
#2. worker_connections:worker 子进程能够处理的最大并发连接数。
worker_connections 1024; #每个子进程的最大连接数为1024
#3. accept_mutex:是否打开负载均衡互斥锁。
accept_mutex on; #默认是off关闭的,这里推荐打开
9
配置完成后重启 Nginx 服务器。并且在需要访问的客户端配置好 ip 和域名的映射关系。
在客户端机器执行 curl http://balance.lion.club/balance/ 命令:
如图所示:负载均衡的配置已经生效了,通过简单的"轮询策略"进行上游服务器分发,每次给我们分发的上游服务器都不一样。
接下来,我们再来了解下 Nginx 的其它分发策略:hash、ip_hash 和 least_conn最少连接数算法。
#语法:server_name <name_1> [<name_2> ...]
server_name www.nginx.com;
0
配置本地 hosts
#语法:server_name <name_1> [<name_2> ...]
server_name www.nginx.com;
1
用户请求URL:/bbs/abc/test.html
不带 / 的用法:
#语法:server_name <name_1> [<name_2> ...]
server_name www.nginx.com;
2
分析:与 alias 相似
带 / 的用法:
#语法:server_name <name_1> [<name_2> ...]
server_name www.nginx.com;
3
分析:与 root 相似,没有拼接上 location
如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
Nginx正向代理涉及到的指令较少,只是对用户的访问进行一个转发,不做其他处理。配置如下:
#语法:server_name <name_1> [<name_2> ...]
server_name www.nginx.com;
4
其中:
如:http://nginx.org/download/nginx-1.6.3.tar.gz,则 $http_host=nginx.org
,$request_uri=/download/nginx-1.6.3.tar.gz
为了演示更加接近实际,准备了两台云服务器,分别是:121.42.11.34 与 121.5.180.193
我们把 121.42.11.34 服务器作为上游服务器,做如下配置:
#语法:server_name <name_1> [<name_2> ...]
server_name www.nginx.com;
5
把 121.5.180.193 服务器作为代理服务器,做如下配置:
#语法:server_name <name_1> [<name_2> ...]
server_name www.nginx.com;
6
分析:
#语法:server_name <name_1> [<name_2> ...]
server_name www.nginx.com;
7
因为虚拟域名进行测试,因此需要配置本地 DNS 解析,如果使用阿里云上购买的域名,则需要在阿里云上设置好域名解析。
#语法:server_name <name_1> [<name_2> ...]
server_name www.nginx.com;
8
配置 nginx.conf 的 server 配置
#语法:server_name <name_1> [<name_2> ...]
server_name www.nginx.com;
9
访问分析
#配置 URL路径
location [ = | ~ | ~* | ^~ ] uri { ... }
0
当我们访问 http://var.lion-test.club:8081/test?pid=121414&cid=sadasd 时,由于 Nginx 中写了 return 方法,因此 chrome 浏览器会默认为我们下载一个文件,下面展示的就是下载的文件内容:
#配置 URL路径
location [ = | ~ | ~* | ^~ ] uri { ... }
1
Via