Nginx 最全操作总结

Posted 腾讯技术工程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx 最全操作总结相关的知识,希望对你有一定的参考价值。


作者:chrootliu,腾讯 QQ 音乐前端开发工程师

本文将会从:安装 -> 全局配置 -> 常用的各种配置 来书写,其中常用配置写的炒鸡详细,需要的童鞋可以直接滑倒相应的位置查看。

查看 nginx 的文件列表,可以发现里面有一个 auto 的目录。

在这个 auto 目录中有一个 options 文件,这个文件里面保存的就是 nginx 编译过程中的所有选项配置。

通过命令:cat nginx-1.17.2/auto/options | grep YES就可以查看

nginx 编译安装时,怎么查看安装模块

编译并安装

,通过命令查看本机网络地址和端口等一些信息,找到被占用的 80 端口 netstat -ntpl 的 tcp 连接,并杀死进程(kill 进程 pid)

就可以查看到,还有其它不常用这里未列出。

Linux 系统应用管理工具 systemd 关于 nginx 的常用命令:

保存退出,运行 systemctl daemon-reload 使文件生效。

这样便可以通过以下命令操作 nginx 了:

的错误,通过 nginx -c 参数指定配置文件即可解决

的错误,可以先通过 service nginx stop 停止服务,再启动就好。

配置文件的内容都需要重新到 nginx 启动目录去执行命令,或者通过 -p 参数指向特定目录,会不会感觉很麻烦?

例如:直接执行 nginx -s reload 会报错 -bash: nginx: command not found,需要到 /usr/local/nginx/sbin 目录下面去执行,并且是执行 ./nginx -s reload

这里有两种方式可以解决,一种是通过脚本对 nginx 命令包装,这里介绍另外一种比较简单:通过把 nginx 配置到环境变量里,用 nginx 执行指令即可。步骤如下:

1、编辑 /etc/profile

配置文件,并在配置文件中增加 vrrp_script 定义一个外围检测机制,并在 vrrp_instance 中通过定义 track_script 来追踪脚本执行过程,实现节点转移:

后改为 BACKUPpriority 改为比主机小。设置完毕后各自 service keepalived start 启动,经过访问成功之后,可以把 Master 机的 keepalived 停掉,此时 Master 机就不再是主机了 service keepalived stop,看访问虚拟 IP 时是否能够自动切换到备机 ip addr。

再次启动 Master 的 keepalived,此时 vip 又变到了主机上。

配置高可用集群的内容来源于:Nginx 从入门到实践,万字详解!

符号,这是记法上的要求。所有的 Nginx 变量在 Nginx 配置文件中引用时都须带上 $ 前缀。这种表示方法和 Perl、php 这些语言是相似的。

这种表示方法的用处在哪里呢,那就是可以直接把变量嵌入到字符串常量中以构造出新的字符串,例如你需要进行一个字符串拼接:

的时候,后面紧跟着 world 这个单词,所以如果直接写作 "$tempworld" 则 nginx 的计算引擎会将之识别为引用了变量 $tempworld. 为了解决这个问题,nginx 的字符串支持使用花括号在 $ 之后把变量名围起来,比如这里的 $temp,所以 上面这个例子返回的还是 "hello world":

符号本身,可以这样做:

赋予字符串 "$" ,这样,这里的返回值就是 "hello world: $" 了。

#GET 请求中变量名 PARAMETER 参数的值

  • $args #这个变量等于 GET 请求中的参数,例如,foo=123&bar=blahblah;这个变量可以被修改
  • $binary_remote_addr #二进制码形式的客户端地址
  • $body_bytes_sent #传送页面的字节数
  • $content_length #请求头中的 Content-length 字段
  • $content_type #请求头中的 Content-Type 字段
  • $cookie_COOKIE #cookie COOKIE 的值
  • $document_root #当前请求在 root 指令中指定的值
  • $document_uri #与 $uri 相同
  • $host #请求中的主机头(Host)字段,如果请求中的主机头不可用或者空,则为处理请求的 server 名称(处理请求的 server 的 server_name 指令的值)。值为小写,不包含端口
  • $hostname #机器名使用 gethostname 系统调用的值
  • $http_HEADER #HTTP 请求头中的内容,HEADER 为 HTTP 请求中的内容转为小写,-变为_(破折号变为下划线),例如:$http_user_agent(Uaer-Agent 的值)
  • $sent_http_HEADER #HTTP 响应头中的内容,HEADER 为 HTTP 响应中的内容转为小写,-变为_(破折号变为下划线),例如:$sent_http_cache_control$sent_http_content_type
  • $is_args #如果 $args 设置,值为"?",否则为""
  • $limit_rate #这个变量可以限制连接速率
  • $nginx_version #当前运行的 nginx 版本号
  • $query_string #与 $args 相同
  • $remote_addr #客户端的 IP 地址
  • $remote_port #客户端的端口
  • $remote_port #已经经过 Auth Basic Module 验证的用户名
  • $request_filename #当前连接请求的文件路径,由 root 或 alias 指令与 URI 请求生成
  • $request_body #这个变量(0.7.58+)包含请求的主要信息。在使用 proxy_pass 或 fastcgi_pass 指令的 location 中比较有意义
  • $request_body_file #客户端请求主体信息的临时文件名
  • $request_completion #如果请求成功,设为"OK";如果请求未完成或者不是一系列请求中最后一部分则设为空
  • $request_method #这个变量是客户端请求的动作,通常为 GET 或 POST。包括 0.8.20 及之前的版本中,这个变量总为 main request 中的动作,如果当前请求是一个子请求,并不使用这个当前请求的动作
  • $request_uri #这个变量等于包含一些客户端请求参数的原始 URI,它无法修改,请查看 $uri 更改或重写 URI
  • $scheme #所用的协议,例如 http 或者是 https,例如 rewrite ^(.+)$$scheme://example.com$1 redirect
  • $server_addr #服务器地址,在完成一次系统调用后可以确定这个值,如果要绕开系统调用,则必须在 listen 中指定地址并且使用 bind 参数
  • $server_name #服务器名称
  • $server_port #请求到达服务器的端口号
  • $server_protocol #请求使用的协议,通常是 HTTP/1.0、HTTP/1.1 或 HTTP/2
  • $uri #请求中的当前 URI(不带请求参数,参数位于 args ) , 不 同 于 浏 览 器 传 递 的 args),不同于浏览器传递的 args),不同于浏览器传递的 request_uri 的值,它可以通过内部重定向,或者使用 index 指令进行修改。不包括协议和主机名,例如 /foo/bar.html
  • 附 nginx 模块

    nginx 模块分类

  • 核心模块:nginx 最基本最核心的服务,如进程管理、权限控制、日志记录;
  • 标准 HTTP 模块:nginx 服务器的标准 HTTP 功能;
  • 可选 HTTP 模块:处理特殊的 HTTP 请求
  • 邮件服务模块:邮件服务
  • 第三方模块:作为扩展,完成特殊功能
  • 模块清单

    核心模块

  • ngx_core
  • ngx_errlog
  • ngx_conf
  • ngx_events
  • ngx_event_core
  • ngx_epll
  • ngx_regex
  • 标准 HTTP 模块

  • ngx_http
  • ngx_http_core #配置端口,URI 分析,服务器相应错误处理,别名控制 (alias) 等
  • ngx_http_log #自定义 access 日志
  • ngx_http_upstream #定义一组服务器,可以接受来自 proxy, Fastcgi,Memcache 的重定向;主要用作负载均衡
  • ngx_http_static
  • ngx_http_autoindex #自动生成目录列表
  • ngx_http_index #处理以/结尾的请求,如果没有找到 index 页,则看是否开启了 random_index;如开启,则用之,否则用 autoindex
  • ngx_http_auth_basic #基于 http 的身份认证 (auth_basic)
  • ngx_http_access #基于 IP 地址的访问控制 (deny,allow)
  • ngx_http_limit_conn #限制来自客户端的连接的响应和处理速率
  • ngx_http_limit_req #限制来自客户端的请求的响应和处理速率
  • ngx_http_geo
  • ngx_http_map #创建任意的键值对变量
  • ngx_http_split_clients
  • ngx_http_referer #过滤 HTTP 头中 Referer 为空的对象
  • ngx_http_rewrite #通过正则表达式重定向请求
  • ngx_http_proxy
  • ngx_http_fastcgi #支持 fastcgi
  • ngx_http_uwsgi
  • ngx_http_scgi
  • ngx_http_memcached
  • ngx_http_empty_gif #从内存创建一个 1×1 的透明 gif 图片,可以快速调用
  • ngx_http_browser #解析 http 请求头部的 User-Agent 值
  • ngx_http_charset #指定网页编码
  • ngx_http_upstream_ip_hash
  • ngx_http_upstream_least_conn
  • ngx_http_upstream_keepalive
  • ngx_http_write_filter
  • ngx_http_header_filter
  • ngx_http_chunked_filter
  • ngx_http_range_header
  • ngx_http_gzip_filter
  • ngx_http_postpone_filter
  • ngx_http_ssi_filter
  • ngx_http_charset_filter
  • ngx_http_userid_filter
  • ngx_http_headers_filter #设置 http 响应头
  • ngx_http_copy_filter
  • ngx_http_range_body_filter
  • ngx_http_not_modified_filter
  • 可选 HTTP 模块:

  • ngx_http_addition #在响应请求的页面开始或者结尾添加文本信息
  • ngx_http_degradation #在低内存的情况下允许服务器返回 444 或者 204 错误
  • ngx_http_perl
  • ngx_http_flv #支持将 Flash 多媒体信息按照流文件传输,可以根据客户端指定的开始位置返回 Flash
  • ngx_http_geoip #支持解析基于 GeoIP 数据库的客户端请求
  • ngx_google_perftools
  • ngx_http_gzip #gzip 压缩请求的响应
  • ngx_http_gzip_static #搜索并使用预压缩的以.gz 为后缀的文件代替一般文件响应客户端请求
  • ngx_http_image_filter #支持改变 png,jpeg,gif 图片的尺寸和旋转方向
  • ngx_http_mp4 #支持.mp4,.m4v,.m4a 等多媒体信息按照流文件传输,常与 ngx_http_flv 一起使用
  • ngx_http_random_index #当收到 / 结尾的请求时,在指定目录下随机选择一个文件作为 index
  • ngx_http_secure_link #支持对请求链接的有效性检查
  • ngx_http_ssl #支持 https
  • ngx_http_stub_status
  • ngx_http_sub_module #使用指定的字符串替换响应中的信息
  • ngx_http_dav #支持 HTTP 和 WebDAV 协议中的 PUT/DELETE/MKCOL/COPY/MOVE 方法
  • ngx_http_xslt #将 XML 响应信息使用 XSLT 进行转换
  • 邮件服务模块:

  • ngx_mail_core
  • ngx_mail_pop3
  • ngx_mail_imap
  • ngx_mail_smtp
  • ngx_mail_auth_http
  • ngx_mail_proxy
  • ngx_mail_ssl
  • 第三方模块

  • echo-nginx-module #支持在 nginx 配置文件中使用 echo/sleep/time/exec 等类 Shell 命令
  • memc-nginx-module
  • rds-json-nginx-module #使 nginx 支持 json 数据的处理
  • lua-nginx-module

  • 视频号最新视频

    想了解腾讯人的故事,欢迎关注:腾讯技术

    Nginx 最全操作——nginx反向代理(5)

    参考技术A 将 NGINX 配置为 HTTP 和其他协议的反向代理,支持修改请求标头和微调的响应缓冲。

    本文介绍代理服务器的基本配置。您将学习如何通过不同的协议将请求从 NGINX 传递到代理服务器,修改发送到代理服务器的客户端请求标头,以及配置来自代理服务器的响应的缓冲。

    代理通常用于在多个服务器之间分配负载,无缝显示来自不同网站的内容,或通过 HTTP 以外的协议将处理请求传递给应用程序服务器。

    当 NGINX 代理请求时,它会将请求发送到指定的代理服务器,获取响应,然后将请求发送回客户端。可以使用指定的协议将请求代理到 HTTP 服务器(另一个 NGINX 服务器或任何其他服务器)或非 HTTP 服务器(可以运行使用特定框架开发的应用程序,例如 PHP 或 Python)。支持的协议包括FastCGI、uwsgi、SCGI和memcached。

    要将请求传递给 HTTP 代理服务器,需要在location中指定proxy_pass指令。例如:

    此示例配置导致将在此位置处理的所有请求传递到指定地址的代理服务器。此地址可以指定为域名或者 IP 地址。该地址还可能包括一个端口:

    注意,在上面的第一个例子中,代理的服务器的地址后面是一个URI, /link/ 。如果 URI 与地址一起指定,它将替换请求 URI 中与 location 参数匹配的部分。例如,这里带有 /some/path/page.html URI的请求将被代理到 http://www.example.com/link/page.html . 如果指定的地址没有问题 URI,或者无法确定要替换的 URI 部分,则传递完整的请求 URI(可能已修改)。

    要将请求传递给非 HTTP 代理服务器, **_pass 应使用适当的指令:

    请注意,在这些情况下,指定地址的规则可能不同。您可能还需要将其他参数传递给服务器(有关详细信息,请参阅参考文档)。

    proxy_pass指令也可以指向一组命名的服务器。在这种情况下,请求根据指定的方法在组中的服务器之间分发。

    默认情况下,NGINX 重新定义代理请求中的两个 header 字段,“Host”和“Connection”,并消除值为空字符串的 header 字段。“Host”设置为 $proxy_host 变量,“Connection”设置为 close 。

    要更改这些设置以及修改其他标头字段,请使用proxy_set_header指令。该指令可以在某个位置或更高位置指定。它也可以在特定的服务器上下文或http块中指定。例如:

    在此配置中,“主机”字段设置为$host变量。

    要防止标头字段被传递到代理服务器,请将其设置为空字符串,如下所示:

    默认情况下,NGINX 缓冲来自代理服务器的响应。响应存储在内部缓冲区中,并且在收到整个响应之前不会发送到客户端。缓冲有助于优化慢速客户端的性能,如果响应从 NGINX 同步传递到客户端,这可能会浪费代理服务器的时间。但是,当启用缓冲时,NGINX 允许代理服务器快速处理响应,而 NGINX 存储响应的时间与客户端下载它们所需的时间一样长。

    负责启用和禁用缓冲的指令是proxy_buffering。默认情况下,它设置为 on 并启用缓冲器。

    该proxy_buffers指令控制规模和分配的请求缓冲区的数目。来自代理服务器的响应的第一部分存储在单独的缓冲区中,其大小由proxy_buffer_size指令设置。这部分通常包含一个相对较小的响应头,并且可以做得比其余响应的缓冲区小。

    在以下示例中,缓冲区的默认数量增加了,并且响应的第一部分的缓冲区大小小于默认值。

    如果禁用缓冲,则在从代理服务器接收响应的同时将响应同步发送到客户端。对于需要尽快开始接收响应的快速交互客户端,此行为可能是可取的。

    要在特定位置禁用缓冲,请将proxy_buffering指令放在带有参数的位置 off ,如下所示:

    在这种情况下,NGINX 仅使用proxy_buffer_size配置的缓冲区来存储响应的当前部分。

    反向代理的一个常见用途是提供负载平衡。阅读免费的选择软件负载均衡器的五个理由电子书,了解如何通过快速部署来提高功能、性能和专注于您的应用程序。

    如果您的代理服务器有多个网络接口,有时您可能需要选择特定的源 IP 地址连接到代理服务器或上游。如果 NGINX 后面的代理服务器配置为接受来自特定 IP 网络或 IP 地址范围的连接,这可能很有用。

    指定proxy_bind指令和必要网络接口的 IP 地址:

    IP 地址也可以用变量指定。例如, $server_addr 变量传递接受请求的网络接口的 IP 地址:

    简单来说,把百度首页代理到/test路径,同时把java代理到/testapi,配置如下:

    参考链接:https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/

    欢迎大家提出不一样的观点,我们一起讨论,

    我是辣个男人,一个运维人。

    以上是关于Nginx 最全操作总结的主要内容,如果未能解决你的问题,请参考以下文章

    Nginx 最全操作总结

    R - 为啥 str_detect 在以破折号结尾的“单词”上使用单词边界时返回与 grepl 不同的结果

    关于Nginx面试题知识看这一篇就够了(21年总结最全面的后端Nginx面试题!!!),让你成为Offer收割机

    电子邮件的正则表达式用户名应以 [a-zA-Z0-9] 开头或结尾,但可能包含破折号、下划线

    Nginx 最全操作——nginx反向代理(5)

    (最全篇)nginx.conf配置文件详解