初识Nginx配置文件以及基本命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识Nginx配置文件以及基本命令相关的知识,希望对你有一定的参考价值。

参考技术A

配置文件名为 nginx.conf ,Linux放在目录: /usr/local/nginx/conf 、 /etc/nginx , 或 /usr/local/etc/nginx 中;Windows放在 安装目录\\conf 中。 依据实际安装情况决定

nginx由配置文件中指定的指令控制模块组成。 指令分为 简单指令 块指令
简单指令 由空格分隔的名称和参数组成,并以分号 ; 结尾;
块指令 具有与简单指令相同的结构,但是是以大括号 和 包围的一组附加指令。 如果块指令在大括号内部有其他指令,则称为上下文(例如: events , http , server 和 location );
配置文件中放置在任何上下文之外的伪指令都被认为是主上下文。 events 和 http 指令驻留在主上下文中, server 在 http 中的,而 location 在 server 块中。一个配置文件一个 http ,一个及以上个 server ,一个 server 运行一个工作进程并代表一个虚拟服务器;
# 号所在的一行被视为注释;
几个顶级指令将适用于不同流量类型的指令组合在一起:

对于大多数指令,在子上下文中定义的上下文将继承父级中包含的伪指令的值,要覆盖从父进程继承的值,子上下文中需要包含该指令(即子上下文要显式声明)。

打开配置文件(如 /usr/local/nginx/conf/nginx.conf ),默认的配置文件已经包含了服务器块的几个示例,大部分是注释掉的。 现在注释掉所有这样的块,并启动一个新的服务器块:

每个 server 上下文都可以指定要监听的端口、server_name,当nginx决定哪个服务器处理请求后,它会根据服务器块内部定义的location指令的参数测试请求头中指定的URI, 比如如下配置,系统中创建 /data 目录及其子目录 /www :

第一个 location 块指定与请求中的URI比较 / 前缀。 对于匹配请求,URI将被添加到 root 指令中指定的路径(即 /data/www ),形成本地文件系统中的请求文件路径。 如果有几个匹配的location块,nginx将选择具有最长前缀来匹配location块。 上面第一个 location 块提供最短的前缀长度为1,因此只有当所有其他location块不能提供匹配时,才会使用该块。第二个 location ,将是以 /images/ 的请求来匹配,位置 / 也匹配这样的请求,但具有较短前缀,也就是 /images/ 比 / 长。

这已经是一个在标准端口 80 上侦听并且可以在本地机器上访问的服务器 http://localhost/ 的工作配置, 端口 80 和 server_name localhost 可以省略,它们为默认值 。 响应以/images/开头的URI的请求,服务器将从 /data/images 目录发送文件。 例如,响应 http://localhost/images/logo.png 请求,nginx将发送服务上的 /data/images/logo.png 文件。 如果文件不存在,nginx将发送一个指示 404 错误的响应。 不以 /images/ 开头的URI的请求将映射到 /data/www 目录。 例如,响应 http://localhost/about/example.html 请求时,nginx将发送 /data/www/about/example.html 文件。

反向代理应该是Nginx做的最多的一件事了,反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。简单来说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。
通过向nginx配置文件添加一个server块来定义代理服务器,其中包含以下内容:

这将是一个监听端口 8080 的简单服务器,并将所有请求映射到本地文件系统上的 /data/up1 目录。 请注意,root指令位于server块上下文中,当选择用于服务请求的 location 块不包含自己的 root 指令时,将使用此root指令。创建 /data/up1 目录然后可以将一个静态网页比如 index.html 文件放入其中,然后访问 http://localhost:8080/ 即可访问该文件。
目前为止,还是配置的静态资源访问,并不是代理服务器,然后增加或修改现有 location 上下文,改为如下:

当用户访问 http://localhost:8080/ 时,会返回 http://localhost:8181 服务器的的资源。
location 上下文后面的参数,可以是正则表达式,如果是正则表达式,前面要加 ~ ,比如:

以上配置表示,nginx接收到所有以.gif,.jpg或.png结尾的URI,相应的请求将映射到/data/images目录。当nginx选择一个location块来提供请求时,它首先检查指定前缀的location指令,记住具有最长前缀的location,然后检查正则表达式。 如果与正则表达式匹配,nginx会选择此location,否则选择之前记住的那一个。

要找到最符合URI的位置,NGINX首先将URI与前缀字符串的位置进行比较。然后用正则表达式搜索位置。除非使用^~修饰符对正则表达式给予更高的优先级。在前缀字符串中,NGINX选择最具体的字符串(也就是最长和最完整的字符串)。 下面给出了选择处理请求的位置的确切逻辑:

测试所有URI的前缀字符串。 = (等号)修饰符定义了URI和前缀字符串完全匹配。如果找到完全匹配,则搜索停止。如果 ^~ (插入符号)修饰符预先添加最长匹配前缀字符串,则不会检查正则表达式。存储最长匹配的前缀字符串。根据正则表达式测试URI。断开第一个匹配的正则表达式并使用相应的位置。如果没有正则表达式匹配,则使用与存储的前缀字符串相对应的位置。

= 修饰符的典型用例是 / (正斜杠)的请求。 如果请求/是频繁的,则指定 = / 作为location指令的参数加速处理,因为搜索匹配在第一次比较之后停止。

要启动nginx,请运行可执行文件。 当nginx启动后,可以通过使用-s参数调用可执行文件来控制它。 使用以下语法:

信号(signal)的值可能是以下之一:

当主进程收到要重新加载配置的信号,它将检查新配置文件的语法有效性,并尝试应用其中提供的配置。 如果这是成功的,主进程将启动新的工作进程,并向旧的工作进程发送消息,请求它们关闭。 否则,主进程回滚更改,并继续使用旧配置。 老工作进程,接收关闭命令,停止接受新连接,并继续维护当前请求,直到所有这些请求得到维护。 之后,旧的工作进程退出。

两者在 location 中,指定一个路径,其中使用 alias 做如下配置:

若按照上述配置的话,则访问/img/目录里面的文件时,ningx会自动去/var/www/image/目录找文件

若按照这种配置的话,则访问/img/目录下的文件时,nginx会去/var/www/image/img/目录下找文件。alias是一个目录别名的定义,root则是最上层目录的定义,指的是 /var/www/image/img/ 。还有一个重要的区别是alias后面必须要 / 结束,否则会找不到文件,而root则可有可无。

另外对于index,含义如下

这样,当用户请求 / 地址时,Nginx 就会自动在 root 配置指令指定的文件系统目录下依次寻找 index.htm 和 index.html 这两个文件。如果 index.htm 文件存在,则直接发起“内部跳转”到 /index.htm 这个新的地址;而如果 index.htm 文件不存在,则继续检查 index.html 是否存在。如果存在,同样发起“内部跳转”到 /index.html ;如果 index.html 文件仍然不存在,则放弃处理权给 content 阶段的下一个模块。

参考地址1
参考地址2:B站

Nginx:Nginx基本概念以及用法

目录结构

  • Nginx
    • conf   配置目录
      • nginx.conf  主配置文件
      • fastcgi.conf  fastcgi的配置文件
      • mime.types  支持的mime.types资源类型
    • sbin   启动目录
      • nginx. 默认启动nginx的二进制文件
    • logs  日志目录
      • access.log  默认访问日志文件
      • error.log     默认错误日志文件
      • nginx.pid    nginx的pid文件
    • html 静态页面目录
      • index.html  默认首页文件
      • 50x.html     错误页面文件

静态HTTP服务器

首先,Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML、图片)通过HTTP协议展现给客户端。配置如下:

server 
    listen 80; # 端口号
    location / 
        root /usr/share/nginx/html; # 静态文件路径
    

虚拟主机

  • 概念
    • 一个server标签就是一个虚拟主机,可以有多个server标签,也就是多个虚拟主机。
    • 一个虚拟主机拥有独立的资源和程序,可以独立地对外提供服务供用户访问。
  • 类型
    • 基于域名的虚拟主机,通过域名来区分虚拟主机——应用:外部网站
    • 基于端口的虚拟主机,通过端口来区分虚拟主机——应用:公司内部网站,外部网站的管理后台

    • 基于ip的虚拟主机,几乎不用。

1.基于虚拟主机配置域名

#当客户端访问www.eureka.com,监听端口号为80,直接跳转到data/www目录下文件

worker_processes  1;
events 
    worker_connections  1024;

http 
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server 
        listen       80;
        server_name  www.eureka.com;
        location / 
            root   data/www;
            index  index.html index.htm;
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html 
            root   html;
        
    
#当客户端访问bbs.eureka.com,监听端口号为80,直接跳转到data/bbs目录下文件 server listen
80; server_name bbs.eureka.com; location / root data/bbs; index index.html index.htm; error_page 500 502 503 504 /50x.html; location = /50x.html root html;   

2.基于端口的虚拟主机


#当客户端访问192.168.177.133:8080:,监听端口号为8080,直接跳转到data/www目录下文件

server 
       listen 8080;
       server_name 192.168.177.133;
       location / 
          root data/www;
          index index.html index.htm;
          
       error_page   500 502 503 504  /50x.html;
       location = /50x.html 
           root   html;
       
   
#当客户端访问192.168.177.133:8081:,监听端口号为8081,直接跳转到data/bbs目录下文件 server listen
8081; server_name 192.168.177.133; location / root data/bbs; index index.html index.htm; error_page 500 502 503 504 /50x.html; location = /50x.html root html;

3.基于IP的虚拟主机

#当客户端访问192.168.177.133:8080:,监听端口号为8080,直接跳转到data/bbs目录下文件
server listen
8080; server_name 192.168.177.133; location / root data/www; index index.html index.htm; error_page 500 502 503 504 /50x.html; location = /50x.html root html;

#当客户端访问192.168.177.134,监听端口号为8080,直接跳转到data/bbs目录下文件 server listen
8080; server_name 192.168.177.134; location / root data/bbs; index index.html index.htm; error_page 500 502 503 504 /50x.html; location = /50x.html root html;

反向代理

1.反向代理作用

    反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。如下图所示:

技术图片

2.反向代理好处

  隐藏真实内部ip地址,请求先访问nginx代理服务器(外网可以访问到),在使用nginx服务器转发到真实服务器中。

3.反向代理配置示例

#当客户端访问www.eureka.com,监听端口号为80直接跳转到真实ip服务器地址 192.168.177.133:8080
    server 
        listen       80;
        server_name  www.eureka.com;
        location / 
         proxy_pass http://192.168.177.133:8080;
            index  index.html index.htm;
        

负载均衡

1.负载均衡作用

负载均衡是将所有请求拦截到负载均衡器中,在由负载均衡器采用负载均衡算法(轮询、IP绑定、权重)分发到不同实际的服务器中,这也就是服务器集群, 减轻单台服务器压力。如下图eureka集群示例:

技术图片

2.负载均衡好处

负载均衡英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

3.四层和七层负载均衡区别

网络模型图

技术图片

  • 四层负载均衡
    • 在网络模型中的传输层中,基于主要是基于tcp协议报文实现负载均衡(比如LVS、haproxy就是四层负载均衡器),使用改写报文的源地址和目的地址。(Nginx1.9之后)
  • 七层负载均衡
    • 在网络模型中应用层中,基于URL或者HTTP协议实现负载均衡,Web服务器。

4. 负载均衡配置示例

  • 轮询机制
    • 每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。
#定义上游服务器(需要被nginx真实代理访问的服务器) 默认是轮询机制
    upstream  eurekaServer
        server 192.168.177.133:8080;
        server 192.168.177.133:8081;
server
192.168.177.133:8082; server listen 80; server_name www.eureka.com; location / # 指定上游服务器负载均衡服务器 proxy_pass http://eurekaServer; index index.html index.htm;
  • weight(权重)
    • weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。
 upstream  eurekaServer
    server 192.168.177.133:8080 weight=1;
    server 192.168.177.133:8081 weight=2;
server 192.168.177.133:8082 weight=2; server listen 80; server_name www.eureka.com; location / # 指定上游服务器负载均衡服务器 proxy_pass http://eurekaServer; index index.html index.htm;
  • ip_hash
    • 每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题。俗称IP绑定。
upstream  eurekaServer
        server 192.168.177.133:8080;
        server 192.168.177.133:8081;
server
192.168.177.133:8082; ip_hash; server listen 80; server_name www.eureka.com; location / # 指定上游服务器负载均衡服务器 proxy_pass http://eurekaServer; index index.html index.htm;
  • fair(第三方
    •  比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间 来分配请求,响应时间短的优先分配。Nginx本身不支持fair,如果需要这种调度算法,则必须安装upstream_fair模块。
upstream  eurekaServer
        server 192.168.177.133:8080;
        server 192.168.177.133:8081;
server
192.168.177.133:8082;
fair; server listen 80; server_name www.eureka.com; location / # 指定上游服务器负载均衡服务器 proxy_pass http://eurekaServer; index index.html index.htm;
  • url_hash(第三方)
    • 按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身不支持url_hash,如果需要这种调度算法,则必须安装Nginx的hash软件包。

故障转移

当上游服务器(真实访问服务器),一旦出现故障或者是没有及时相应的话,应该直接轮训到下一台服务器,保证服务器的高可用。配置如下

server 
        listen       80;
        server_name  www.eureka.com;
        location / 
            # 指定上游服务器负载均衡服务器
            proxy_pass http://eurekaServer;
            #nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
            proxy_connect_timeout 1s;
            #nginx发送给上游服务器(真实访问的服务器)超时时间
            proxy_send_timeout 1s;
            # nginx接受上游服务器(真实访问的服务器)超时时间
            proxy_read_timeout 1s;
            index  index.html index.htm;
        
    

Location(正则表达式)

1.location的作用

  location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。

2.location的语法

已=开头表示精确匹配
如 A 中只匹配根目录结尾的请求,后面不能带任何字符串。
  ^~ 开头表示uri以某个常规字符串开头,不是正则匹配
  ~ 开头表示区分大小写的正则匹配;
  ~* 开头表示不区分大小写的正则匹配
  / 通用匹配, 如果没有其它匹配,任何请求都会匹配到

3.Location正则案例

3.1 精确匹配,/后面不能带任何字符

server 
        listen       80;
        server_name  www.eureka.com;
        #精确匹配,注解后面不能带任何字符
        location =/ 
            proxy_pass http://192.168.177.133:8080;
            index  index.html index.htm;
        

3.2 匹配所有以/开头请求

server 
        listen       80;
        server_name  www.eureka.com;
       #匹配所有以/开头请求 
        location / 
            proxy_pass http://192.168.177.133:8080;
            index  index.html index.htm;
        
    

3.3 以开头/oauth拦截  默认开启不区分大小写

    server 
        listen       80;
        server_name  www.eureka.com;
        #  以开头/eureka 最终跳转到http://192.168.177.133:8080/;
        location /oauth/ 
            proxy_pass http://192.168.177.133:8080/;
            index  index.html index.htm;
        
        #  以开头/oauth 最终跳转到http://192.168.177.133:8081/;
        location /oauth/ 
            proxy_pass http://192.168.177.133:8081/;
            index  index.html index.htm;
        
    

nginx rewrite

Nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。rewrite只能放在server,location,if中,并且只能对域名后边的除去传递的参数外的字符串起作用

ps:Rewrite主要的功能就是实现URL的重写,Nginx的Rewrite规则采用Pcre,perl兼容正则表达式的语法规则匹配,如果需要Nginx的Rewrite功能,在编译Nginx之前,需要编译安装PCRE库。

1.Rewrite全局变量

nginx的rewrite规则就是使用正则匹配请求的url,然后根据定义的规则进行重写和改变,需ngx_http_rewrite_module模块来支持url重写功能,该模块是标准模块,默认已经安装。

变量

含义

$args

这个变量等于请求行中的参数,同$query_string

$content length

请求头中的Content-length字段。

$content_type

请求头中的Content-Type字段。

$document_root

当前请求在root指令中指定的值。

$host

请求主机头字段,否则为服务器名称。

$http_user_agent

客户端agent信息

$http_cookie

客户端cookie信息

$limit_rate

这个变量可以限制连接速率。

$request_method

客户端请求的动作,通常为GET或POST。

$remote_addr

客户端的IP地址。

$remote_port

客户端的端口。

$remote_user

已经经过Auth Basic Module验证的用户名。

$request_filename

当前请求的文件路径,由root或alias指令与URI请求生成。

$scheme

HTTP方法(如http,https)。

$server_protocol

请求使用的协议,通常是HTTP/1.0或HTTP/1.1。

$server_addr

服务器地址,在完成一次系统调用后可以确定这个值。

$server_name

服务器名称。

$server_port

请求到达服务器的端口号。

$request_uri

包含请求参数的原始URI,不包含主机名,如”/foo/bar.php?arg=baz”。

$uri

不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。

$document_uri

与$uri相同。

2.配置示例

1.判断IP地址来源

## 如果访问的ip地址为192.168.177.133,则返回403
     if  ($remote_addr = 192.168.177.133)   
         return 403;  
       

2.限制浏览器访问

## 不允许谷歌浏览器访问 如果是谷歌浏览器返回500
 if ($http_user_agent ~ Chrome)    
         return 500;  
        

 

以上是关于初识Nginx配置文件以及基本命令的主要内容,如果未能解决你的问题,请参考以下文章

nginx常用的命令以及配置文件

初识nginx——配置篇

Nginx系列--02基本配置

nginx的配置和基本使用命令

Nginx:Nginx基本概念以及用法

Nginx配置一套打通:基本概念命令反向代理负载均衡动静分离高可用