2019-?-?
Nginx
官页 for windowns 当初我要是这么学习Nginx就好了
Nginx 是一个高性能 (一般服务器大约并发5万) 的 Web 和反向代理服务器, 它具有有很多非常优越的特性:
作为 Web 服务器: 相比 Apache, Nginx 使用更少的资源, 支持更多的并发连接, 体现更高的效率, 这点使 Nginx 尤其受到虚拟主机提供商的欢迎; 能够支持高达 50,000 个并发连接数的响应, 感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.
作为负载均衡服务器: Nginx 既可以在内部直接支持 Rails 和 PHP, 也可以支持作为 HTTP代理服务器 对外进行服务; Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多;
作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器), Last.fm 描述了成功并且美妙的使用经验;
Nginx 安装非常的简单, 配置文件 非常简洁(还能够支持perl语法), Bugs非常少的服务器: Nginx 启动特别容易, 并且几乎可以做到 7 x 24不间断运行, 即使运行数个月也不需要重新启动; 你还能够在 不间断服务的情况下进行软件版本的升级;
Nginx 特点如下:
- 反向代理,负载均衡器
- 高可靠性、单 Master 多 Worker 模式
- 高可扩展性、高度模块化
- 非阻塞
- 事件驱动
- 低内存消耗
- 热部署
安装
for windowns
启动命令 start nginx
停止命令 nginx -s stop 直接退出 nigix -s quit 保存并退出
重新加载配置文件 nginx -s reload
验证启动参数 nginx -t –with-stream
源码编译安装
编译
-
生成 Makefile
./configure -
编译
make && make install
OK
输出内容
最后看命令的输出提示:
配置文件被复制到
/usr/local/nginx/conf//cp conf/fastcgi_params ‘/usr/local/nginx/conf 二进制被复制到/usr/local/nginx/sbin/nginx//cp objs/nginx ‘/usr/local/nginx/sbin/nginx’
创建执行文件连接
手动创建软连接环境
ln /usr/local/nginx/sbin/nginx /usr/bin/nginx
添加rtmp模块编译
./configure --add-module=/root/Downloads/nginx-rtmp-module-master
踩坑
**编译安装总是日志文件路径不对? ** [alert] could not open error log file: open() "/usr/local/nginx/logs/error.log
总是配置不对, 可以-p 指定相对整体路径
for run ./nginx -p /opt/nginx-1.18.0-rtmp-comp/
for test ./nginx -p /opt/nginx-1.18.0-rtmp-comp/ -t
依赖库安装
PCRE
You can either disable the module by using —without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
//安装 PCRE 库
yum install pcre pcre-devel -y
yum -y install zlib-devel.x86_64
SSL
yum -y install openssl openssl-devel
nginx 进程管理
参考文档 Controlling NGINX Processes at Runtime
Controlling NGINX
To reload your configuration, you can stop or restart NGINX, or send signals to the master process.
A signal can be sent by running the nginx command (invoking the NGINX executable) with the -s argument.
nginx -s <SIGNAL>
where <SIGNAL> can be one of the following:
quit – Shut down gracefully
reload – Reload the configuration file
reopen – Reopen log files
stop – Shut down immediately (fast shutdown)
日志归档
从nginx 0.7.6版本开始 access_log的路径配置可以包含变量, 我们可以利用这个特性来实现日志分割; 例如, 我们想按天来分割日志, 那么我们可以这样配置:
access_log logs/access-$logdate.log main;
TCP 代理
配置文件
注意 跟http块 同级
stream { #
upstream cloudsocket {# cloudsocket 是自定义名字
hash $remote_addr consistent;
server 192.168.10.72:83 weight=5 max_fails=3 fail_timeout=30s; #转发到目标地址,fail_timeout 一些参数, 连接超时时间..
# server 192.168.10.72:83 weight=5 max_fails=3 fail_timeout=30s; #可以配置多个转发
}
server {
listen 3333;#虚拟服务的监听端口, 这样访问本机 3333 端口的tcp会被转发到 192.168.10.72:83
proxy_connect_timeout 10s;
proxy_pass cloudsocket;#这个必须与 upstream cloudsocket 名字相同
}
}
各配置块
它默认在./conf/nginx.conf
1. 全局块
该部分配置主要影响Nginx全局, 通常包括下面几个部分:
配置运行Nginx服务器用户(组) worker process数 Nginx进程PID存放路径 错误日志的存放路径 配置文件的引入
2. events块
该部分配置主要影响Nginx服务器与用户的网络连接, 主要包括:
设置网络连接的序列化 是否允许同时接收多个网络连接 事件驱动模型的选择 最大连接数的配置
3. http块
定义MIMI-Type 自定义服务日志 允许sendfile方式传输文件 连接超时时间 单连接请求数上限
http {
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
server {
listen 8081;
server_name 127.0.0.1;
location / {
root f:/nginx_proxy;
}
....alias 和 root
This directive assigns a path to be used for the indicated location. Note that it may look similar to the root directive,
but the document root doesn’t change, just the file system path used for the request.但文档 root 目录不会更改, 仅更改用于请求的文件系统路径;
可以配置的位置 [root] 语法: root path 默认值: root html 配置段: http, server, location, if
[alias] 语法: alias path 配置段: location
- root 实例 保留 location 路径
location ^~ /t/ {
root /www/root/html/;
}
如果一个请求的URI是/t/a.html时, web服务器将会返回服务器上的/www/root/html/t/a.html的文件;
- alias实例 丢弃 location 路径
location ^~ /t/ {
alias /www/root/html/new_t/;
}
如果一个请求的URI是/t/a.html时, web服务器将会返回服务器上的/www/root/html/new_t/a.html的文件; 注意这里是new_t, 因为alias会把location后面配置的路径丢弃掉, 把当前匹配到的目录指向到指定的目录;
还有一个重要的区别是alias后面必须要用”/“结束, 否则会找不到文件
root的处理结果是: root 路径 + location 路径+ 资源名; 例如server块的root配置就好理解了,location也会参与资源路径中
alias 的处理结果是: alias 路径 + 资源名 (丢掉location)
proxy_pass 末尾的斜杠(/) 问题
测试地址: http://127.0.0.1/aaa/bbb.html
- 配置 proxy_pass 时 url后面加上
/
相当于是绝对路径,则 Nginx 不会把 location 中匹配的路径部分加入代理 uri location 的路径会被丢弃 全代理
location ^~ /aaa/ {
proxy_pass http://192.168.2.130:8848/service/;
}代理后实际访问地址: http://192.168.2.130:8848/service/bbb.html
如果客户端请求的是 /example/foo,NGINX会将请求发送到 http://backend-server/foo
- 如果配置 proxy_pass 时,后面没有
/Nginx 则会把匹配的路径部分加入代理 uri, location 的路径会被追加到后面
location ^~ /aaa/ {
proxy_pass http://192.168.2.130:8848/service;
}代理后实际访问地址: http://192.168.2.130:8848/service/aaa/bbb.html
缩略图模块 http_image_filter_module
# 匹配全站所有的结尾图片
location ~* \.(jpg|gif|png)$ {
image_filter resize 500 500;
}
# 匹配某个目录所有图片
location ~* /images/.*\.(jpg|gif|png)$ {
root /var/www/reimages;
image_filter resize 50 50;
}
# 访问 http://8.218.177.105/images/1.jpg ; 指向文件是: /var/www/reimages/images/1.jpg
# 根据url 参数
location ~* /images/(.+)_(\d+)x(\d+)\.(jpg|gif|png)$ {
# root /var/www;
alias /var/www;
set $width $2;
set $height $3;
image_filter_buffer 5M;
image_filter resize $width $height;
# 毫秒 一天
add_header Cache-Control "public, max-age=86400000";
if ($height = "0") {
rewrite /images/(.+)_(\d+)x(\d+)\.(jpg|gif|png)$ /images/$1.$4 last;
}
if ($width = "0") {
rewrite /images/(.+)_(\d+)x(\d+)\.(jpg|gif|png)$ /images/$1.$4 last;
}
try_files /images/$1.$4 /images/404.jpg;
}
# 最后兜底 不缩放的
location ~* /images {
root /var/www/;
}
# 访问 http://8.218.177.105/images/1_100x100.jpg # 指向文件是: /var/www/images/1.jpg
请求体大小限制
location /xxx {
client_max_body_size 600M;
client_body_buffer_size 600M;
uwsgi_send_timeout 1800;
uwsgi_connect_timeout 1800;
uwsgi_read_timeout 1800;
proxy_read_timeout 1800;
proxy_connect_timeout 1800;
proxy_send_timeout 1800;
proxy_pass http://ip:port/xxxx;
}转发参数 $args
location /XX/XX {
set $args "$args&a1=xxx&a2=xxx";
proxy_pass http://ip:port/xxxx;
}
# 高德 Web服务API 代理
location /_AMapService/ {
set $args "$args&jscode=d00957714b68cff7f4b9d935f02c02e5"; # 附带上 key
proxy_pass https://restapi.amap.com/;
}set args”;
启用 gzip 压缩
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
# 全部 无缓存
add_header Cache-Control no-cache;
# 开启gzip
gzip on;
# 启用gzip压缩的最小文件, 小于设置值的文件将不会压缩
gzip_min_length 1k;
# gzip 压缩级别, 1-9, 数字越大压缩的越好, 也越占用CPU时间
gzip_comp_level 1;
# 进行压缩的文件类型; javascript有多种形式; 其中的值可以在 mime.types 文件中找到;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/vnd.ms-fontobject font/ttf font/opentype font/x-woff image/svg+xml;
# 是否在http header中添加Vary: Accept-Encoding, 建议开启
gzip_vary on;
# 设置压缩所需要的缓冲区大小
gzip_buffers 32 4k;
# 设置gzip压缩针对的HTTP协议版本
gzip_http_version 1.0;转发带 ’_’ 请求头
默认的情况下会忽略掉带下划线的请求头;
要解决这个需要配置 ignore_invalid_headers off;
或者 underscores_in_headers on
配置信息加到http块中去了
http {
...
underscores_in_headers on;
ignore_invalid_headers off;
server {
...
location /service/{
#port_in_redirect off;
underscores_in_headers on;
proxy_pass http://192.168.10.118:8012/;
}
}Web Socket 代理
增加如下两条即可
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";# v2 后台
location /api/ {
proxy_set_header Host $host:$server_port;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 3600s;
proxy_send_timeout 12s;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 173 服务器
# proxy_pass http://192.168.40.173:8804/;
# 本地
proxy_pass http://127.0.0.1:8844/;
}负载均衡
http {
server {
listen 6001;
server_name localhost;
...
location /nytfy/service/ {
proxy_pass http://address/;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
proxy_redirect off;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 100m;
send_timeout 300s;
uwsgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;
}
}
upstream address {
server 127.0.0.1:3265;
server 127.0.0.1:3266;
server 127.0.0.1:3267;
}
}负载均衡的几种常用方式
1. 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器, 如果后端服务器down掉, 能自动剔除;
upstream backserver {
server 192.168.0.14 weight=3;
server 192.168.0.15 weight=7;
}2. ip的hash
每个请求按访问ip的hash结果分配, 这样每个访客固定访问一个后端服务器
upstream backserver {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}3. fair 响应时间
按后端服务器的响应时间来分配请求, 响应时间短的优先分配;
upstream backserver {
server server1;
server server2;
fair;
}4. url 的has
访问url的hash结果来分配请求, 使每个url定向到同一个后端服务器, 后端服务器为缓存时比较有效;
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
4. server块
配置网络监听 基于名称的虚拟主机配置 基于IP的虚拟主机配置
http {
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
server {
listen 8081;
server_name 127.0.0.1;
server_tokens off; #nginx 错误页面 不打印 相关版本信息
location / {
root f:/nginx_proxy;
}
.....5. location块
location配置 请求根目录配置 更改location的URI 网站默认首页配置

优先级 & 语法
语法:
location
syntax: location [=|~|~*|^~|@] /uri/ { … }
default: no
context: server(http://nginx.org/en/docs/http/ngx_http_core_module.html)
| 参数 | 解释 |
|---|---|
空 | location 后没有参数直接跟着 标准 URI,表示前缀匹配,代表跟请求中的 URI 从头开始匹配。 |
= | 用于标准 URI 前,要求请求字符串与其精准匹配,成功则立即处理,nginx停止搜索其他匹配。 |
^~ | 用于标准 URI 前,并要求一旦匹配到就会立即处理,不再去匹配其他的那些个正则 URI,一般用来匹配目录 |
~ | 用于正则 URI 前,表示 URI 包含正则表达式, 区分大小写 |
~* | 用于正则 URI 前, 表示 URI 包含正则表达式, 不区分大小写 |
@ | @ 定义一个命名的 location,@ 定义的locaiton名字一般用在内部定向,例如error_page, try_files命令中。它的功能类似于编程中的goto。 |
- 先精准匹配
=,精准匹配成功则会立即停止其他类型匹配; - 没有精准匹配成功时,进行前缀匹配。先查找带有
^~的前缀匹配,带有^~的前缀匹配成功则立即停止其他类型匹配,普通前缀匹配(不带参数^~)成功则会暂存,继续查找正则匹配; =和^~均未匹配成功前提下,查找正则匹配~和~*。当同时有多个正则匹配时,按其在配置文件中出现的先后顺序优先匹配,命中则立即停止其他类型匹配;- 所有正则匹配均未成功时,返回步骤 2 中暂存的普通前缀匹配(不带参数
^~)结果
(序号越小优先级越高):
1. location = # 精准匹配
2. location ^~ # 带参前缀匹配
3. location ~ # 正则匹配(区分大小写)
4. location ~* # 正则匹配(不区分大小写)
5. location /a # 普通前缀匹配,优先级低于带参数前缀匹配。
6. location / # 任何没有匹配成功的,都会匹配这里处理请求参数
请求 URI 中问号后面的参数是不能在 location 中匹配到的,这些参数存储在 $query_string 变量中,可以用 if 来判断。
例如,对于参数中带有单引号 ’ 进行匹配然后重定向到错误页面。
/plus/list.php?tid=19&mid=1124‘
if ( $query_string ~* “.*[;’<>].*” ){
return 404;
}转发Host
默认情况下反向代理是不会转发请求中的Host头部, 如果需要转发, 则需要配置
location /test {
proxy_set_header Host $host:$server_port;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://xxxxxxx/test;
}请求体
location /service/{
#port_in_redirect off;
underscores_in_headers on;
proxy_pass http://192.168.10.118:8012/;
client_max_body_size 50m; //请求体大小限制, 默认1m
proxy_connect_timeout 60s;
}其他参数
client_max_body_size
限制请求体的大小, 若超过所设定的大小, 返回413错误;
client_header_timeout
读取请求头的超时时间, 若超过所设定的大小, 返回408错误;
client_body_timeout
读取请求实体的超时时间, 若超过所设定的大小, 返回413错误;
proxy_connect_timeout
http请求无法立即被容器(tomcat, netty等)处理, 被放在nginx的待处理池中等待被处理; 此参数为等待的最长时间, 默认为60秒, 官方推荐最长不要超过75秒;
proxy_read_timeout
http请求被容器(tomcat, netty等)处理后, nginx会等待处理结果, 也就是容器返回的response; 此参数即为服务器响应时间, 默认60秒;
proxy_send_timeout
http请求被服务器处理完后, 把数据传返回给Nginx的用时, 默认60秒;
跨域处理
https://mp.weixin.qq.com/s/VzWlJ8laLn8AI-JoiDepug
主要4个响应头
Access-Control-Allow-Origin用于设置允许跨域请求源地址 (预检请求和正式请求在跨域时候都会验证)Access-Control-Allow-Headers跨域允许携带的特殊头信息字段 (只在预检请求验证)Access-Control-Allow-Methods跨域允许的请求方法或者说HTTP动词 (只在预检请求验证)Access-Control-Allow-Credentials是否允许跨域使用cookies,如果要跨域使用cookies,可以添加上此请求响应头,值设为true(设置或者不设置,都不会影响请求发送,只会影响在跨域时候是否要携带cookies,但是如果设置,预检请求和正式请求都需要设置)。不过不建议跨域使用(项目中用到过,不过不稳定,有些浏览器带不过去),除非必要,因为有很多方案可以代替。
完整配置
Nginx add_header 只对200,201, 204,206,301,302,303,304,307 这些状态码生效, 如果想要每次响应信息都携带头字段信息, 需要在最后添加always
server {
listen 80;
server_name localhost;
location / {
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Origin 'http://localhost:8080';
add_header Access-Control-Allow-Headers '*';
add_header Access-Control-Allow-Methods '*';
add_header Access-Control-Allow-Credentials 'true';
return 204;
}
if ($request_method != 'OPTIONS') {
add_header Access-Control-Allow-Origin 'http://localhost:8080' always;
add_header Access-Control-Allow-Credentials 'true';
}
proxy_pass http://localhost:59200;
}
}隐藏后端的跨域头
server {
listen 8082;
location /api/ {
# 隐藏后端的跨域头
proxy_hide_header 'Access-Control-Allow-Origin';
proxy_hide_header 'Access-Control-Allow-Methods';
proxy_hide_header 'Access-Control-Allow-Headers';
proxy_hide_header 'Access-Control-Expose-Headers';
proxy_hide_header 'Access-Control-Allow-Credentials';
proxy_hide_header 'Access-Control-Max-Age';
# 由Nginx统一设置CORS头
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization,istoken' always;
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;
# 处理OPTIONS请求
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization,istoken' always;
add_header 'Access-Control-Max-Age' 172800 always;
add_header 'Content-Length' 0;
add_header 'Content-Type' 'text/plain; charset=utf-8';
return 204;
}
proxy_pass http://127.0.0.1:8080/ncws-api/;
proxy_set_header Host $host:$server_port;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
}
}重定向
location / {
root html;
index index.html index.htm;
rewrite / http://example.com;
}try_files
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ .*\.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
}当用户请求 http://localhost/example 时, 这里的 root/example 的文件, 就直接把这个文件的内容发送给用户;
显然, 目录中没有叫 example 的文件; 然后就看 root/example/ 的目录;
又找不到就会 fall back 到try_files 的最后一个选项 /index.php, 发起一个内部 “子请求”, 也就是相当于 nginx 发起一个 HTTP 请求到 http://localhost/index.php
location URI结尾带不带 /
关于 URI 尾部的 / 有三点也需要说明一下。第一点与 location 配置有关,其他两点无关。
- location 中的字符有没有
/都没有影响。也就是说/user/和/user是一样的。 - 如果 URI 结构是
https://domain.com/的形式,尾部有没有/都不会造成重定向。因为浏览器在发起请求的时候,默认加上了/。虽然很多浏览器在地址栏里也不会显示/。这一点,可以访问baidu验证一下。 - 如果 URI 的结构是
https://domain.com/some-dir/。尾部如果缺少/将导致重定向。因为根据约定,URL 尾部的/表示目录,没有/表示文件。所以访问/some-dir/时,服务器会自动去该目录下找对应的默认文件。如果访问/some-dir的话,服务器会先去找some-dir文件,找不到的话会将some-dir当成目录,重定向到/some-dir/,去该目录下找默认文件。可以去测试一下你的网站是不是这样的。
SSL 证书配置
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/your-domain.crt; # PEM 格式的证书路径
#ssl_certificate /etc/nginx/cert/psvmc.pem;
ssl_certificate_key /path/to/private-key.key; # PEM 格式的密钥路径
}流媒体流服务器
ffmpeg rtsp 切片 hls
ffmpeg -i rtsp://admin:abc123.com@192.168.26.46:554/h264/ch1/main/av_stream -fflags flush_packets -max_delay 1 -an -flags -global_header -hls_time 1 -hls_list_size 3 -hls_wrap 3 -vcodec copy -y F:\Work/project/spring_boot_sl/target/classes/static/stream/channel101.m3u8
直接部署web hls 指向这个切片文件channel101.m3u8, 即可播放
(https://blog.csdn.net/u012492535/article/details/79220398)
ffmpeg rtsp 转 rtmp
-re 参数强制切片速度相同 1.0x
ffmpeg -i rtsp://admin:abc123.com@192.168.26.46:554/h264/ch1/main/av_stream -fflags flush_packets -max_delay 1 -an -flags -global_header -hls_time 1 -hls_list_size 3 -hls_wrap 3 -vcodec copy -acodec copy -f flv rtmp://127.0.0.1:1935/live/
-
踩坑指南 公网通讯时, 接受不到海康的UDP包, 使用
-rtsp_transport tcp参数, 可以强制FFmpeg 用TCP接受RTP包ffmpeg -rtsp_transport tcp -i rtsp://admin:abc123.com@192.168.26.46:554/h264/ch1/main/av_stream -fflags flush_packets -max_delay 1 -an -flags -global_header -hls_time 1 -hls_list_size 3 -hls_wrap 3 -vcodec copy -acodec copy -f flv rtmp://127.0.0.1:1935/live/ -
最终优化参数
F:/test/ffmpeg-20190120-62f8d27-win64-static/bin/ffmpeg -rtsp_transport tcp -stimeout 1500000 -re -i rtsp://admin:abc123COM@112.91.85.154:503/h264/ch0/main/av_stream --fflags flush_packets -max_delay 100000 -an -flags -global_header -hls_time 3 -hls_list_size 5 -hls_wrap 5 -segment_list_flags +live -vcodec copy -y F:/Work/project/rtmp_auth/target/classes/static/stream/0/index.m3u8
Nginx Gryphon for windowns
Nginx 官方稳定版不带rtmp模块, 所以需要下载Gryphon版nginx 1.7.11.3 Gryphon.zip 或者自己编译
(http://nginx-win.ecsds.eu/download/)
rtmp{
server{#声明一个 RTMP 实例
listen 1935;
application live{#live 给 NGINX 添加一个监听端口以接收 RTMP 连接;
live on;
record off;
# 一些高级配置 (未测试)
exec command arg* #定义每个流发布时要执行的带有参数的外部命令; 发布结束时进程终止; 见下:
}
application hls{
live on;
hls on;
hls_path nginx-rtmp-module/hls;
hls_cleanup off;
}
}
}推流地址和拉流地址 都是rtmp://127.0.0.1:1935/live/
http://www.voidcn.com/article/p-algtvqho-bqt.html
另外权限参考 (http://www.voidcn.com/article/p-algtvqho-bqt.html) 每当有一个播放或推流请求时, nginx-rtmp-module都会向你指定的地址发送一个http请求, 并带上一些参数, 如请求类型(connect, play, publish等), 请求地址, url(会带上rtmp的参数); 针对服务器返回的值, nginx-rtmp-module 会采用不同的行为; 2xx会正常放行, 3xx会从另一个地址拖流, 其他返回值则使这个请求被中断; 接下来就完全由的你想象来决定 你的rtmp服务器有什么样的访问控制了;
官方github rtmp模块文档 https://github.com/arut/nginx-rtmp-module/wiki/Directives#application+
exec command arg 定义每个流发布时要执行的带有参数的外部命令; 发布结束时进程终止, 第一个参数应该是二进制可执行文件的完整路径; 关于这个进程将会做些什么事没有任何假定; 这一特点在使用 ffmpeg 进行流转换时是很有用的; FFmpeg 被假定作为客户端连接到 nginx-rtmp 然后作为发布者输出转换流到 nginx-rtmp;
类似于 {var} 形式的替换可以在命令行使用
- $name - 流的名字;
- $app - 应用名;
- $addr - 客户端地址;
- $flashver - 客户端 flash 版本;
- $swfurl - 客户端 swf url;
- $tcurl - 客户端 tc url;
- $pageurl - 客户端页面 url; 可以在 exec 指令中定义 Shell 格式的转向符用于写输出和接收输入; 支持如下
- 截断输出 >file;
- 附加输出 >>file;
- 重定向描述符类似于 1>&2;
- 输入 file; 以下 ffmpeg 调用将输入流转码为 HLS-ready 流(H264/AAC); 运行这个示例, FFmpeg 须编译为支持 libx264 & libfaac;
application src {
live on;
exec ffmpeg -i rtmp://localhost/src/$name -vcodec libx264 -vprofile baseline -g 10 -s 300x200 -acodec libfaac -ar 44100 -ac 1 -f flv rtmp://localhost/hls/$name 2>>/var/log/ffmpeg-$name.log;
}https://blog.csdn.net/yelin042/article/details/78431202?locationNum=2&fps=1 nginx.exe -c conf\nginx-rtmp.conf