美文网首页
nginx-1-基础配置

nginx-1-基础配置

作者: keith666 | 来源:发表于2016-11-12 22:35 被阅读182次

    1. 配置文件

    nginx运行时的配置是来自nginx.conf这个文件,默认是在这个路径下:/etc/nginx/nginx.conf(以CentOS为例),但是不同的操作系统和安装方式会有差异,通过nginx -t这个命令可以查看该路径:

    sudo nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    

    上面这个命令是测试nginx的配置正常与否的,它的输出会带有nginx.conf的绝对路径.

    当然如果你想要使用其他的nginx.conf也是可以的,使用nginx -c后面加使用的文件的路径即可,如:

    sudo nginx -c /home/user/nginx.conf
    

    关于nginx的所有命令可通过nginx -hnginx -?来查看帮助.

    2. 配置文件格式

    最基础的配置格式如下:

    events {
    
    }
    http {
      server {
      }
    }
    

    直接用这个空的配置就可以用了,可以启动下nginx来验证:

    sudo nginx
    
    $ curl -I 127.0.0.1
    HTTP/1.1 200 OK # 出现这个说明启动成功
    Server: nginx/1.11.5
    

    nginx默认下监听本地的80端口,然后文件路径是/usr/share/nginx/html.

    下面来个完整的配置来说明:

    user nobody; # simple directive
    worker_processes 1; # simple directive
    events { # context directive
      worker_connections 512; # simple directive
    }
    
    http { # context directive
      server { # context directive
        listen *:80; # simple directive
        server_name ""; # simple directive
        root /usr/share/nginx/html; # simple directive
      }
    }
    

    配置文件是由directives(指令)组成的:simple directivecontext directive.
    两者语法相同,不同的是context directive的内容是由{}包含,而simple directive的结尾是分号;.

    2.1 simple directive(简单指令)

    语法:

    name parameters ;
    

    参数可以多个,也可以是键值类型的key=value形式,如:

    listen *:80;
    listen *:80 ssl backlog=511;
    

    别忘了结尾的分号;,否则会报错.

    2.2 context directive(环境指令)

    语法与simple directive相似,还能包含在其他的context directive里面,也可以继承其他的指令,如:

    server {
      root /usr/share/nginx/html;
      location /foo {
        root /usr/share;
      }
    }
    

    如果/foo里没有定义root目录,则会使用外层的;如果定义了就会使用自己定义的.

    简单指令只能包含在Context指令里面,其中整个文件最外层默认有个隐性的main context指令.
    具体的指令查询可以查看官网给的Alphabetical index of directives,比如查看location:

    Syntax: location [ = | ~ | ~* | ^~ ] uri { ... } # 语法
    location @name { ... } 
    Default:    — # 默认值
    Context:    server, location # 适用的Context,其他的会错
    

    3. 常用指令

    3.1 Events 指令

    nginx是一个事件驱动型的服务器,这个events指令可以让你来设置事件驱动相关,比如最大连接数等,如:

    events {
      worker_connections 512; # 同时连接数
    }
    
    • events指令有且只有一个,并且要在最外层:
    • 这个连接数量不仅包括客户端的请求,还包括nginx后续要进行相应操作的连接数量.
    • linux中将每个连接看出是open file,并且对于每个进程的这个操作有个limit,如果你想要增加连接数,则你也要去提高系统定义的maximum number of open files allowed.

    3.2 HTTP and Server 指令

    HTTP指令是定义HTTP服务器相关的,只能放在最外层;
    Server是定义具体的虚拟服务器配置,必须放在HTTP等可用的Context指令里面;
    通常HTTPServer是一起出现的,并且可以包含多个Server.一般是把通用的指令放在HTTP顶层,然后非共用的则放在Server指令里面:

    http {
      server {
        listen *:80; # 监听80端口
        server_name ""; # 放 Host header,用来匹配域名
        root /usr/share/nginx/html; # 公共路径.
      }
    }
    

    比如http://127.0.0.1/foo/test.html的请求获取的就是/usr/share/nginx/html/foo/test.html.

    3.3 Listen 指令

    监听某个端口,例如:

    listen 127.0.0.1:8000;
    listen 127.0.0.1;
    listen 8000;
    listen *:8000;
    listen localhost:8000;
    listen [::]:8000; # IPv6
    listen [::1]; # IPv6
    listen *:443 ssl;
    listen 127.0.0.1 default_server accept_filter=dataready backlog=1024;
    

    3.4 Server_name 指令

    设置server名,也就是域名,只能放在server指令下面,可以用通配符和正则来匹配,默认为空:

    server {
        server_name example.com www.example.com;
        server_name example.com *.example.com www.example.*; # 通配符
        server_name ~^(www\.)?(.+)$; # 正则
    }
    
    • 波浪号~表示后面是正则.
    • 多个域名绑定同一个端口的话可以用这个来区分.

    3.5 Root 指令

    设置请求的根目录,比如配置如下:

    server {
      listen *:80;
      root /usr/share/nginx/html;
    }
    

    一个地址为http://127.0.0.1/test.html的请求过来,实际会解析到/usr/share/nginx/html/test.html这里.

    问: 那如果这个请求http://127.0.0.1/?过来,会解析到哪里呢?

    会解析到/usr/share/nginx/html目录下的index.html,这是默认的,可以通过index指令更改:

    server {
      listen *:80;
      root /usr/share/nginx/html;
      index ADifferentIndexFile.html; # index后面如果有多个html文件默认返回第一个,该机制可以用于维护时的提示网页.
    }
    

    3.6 Location 指令

    这个指令是设置不同请求时对应的配置,比如127.0.0.1/test/hello.html127.0.0.1/formal/hello.html这两个请求就通过该指令设置解析到不同的地方:

    location /test/ {
      root /usr/share/nginx/test;
    }
    location /formal/ {
      root /usr/share/nginx/formal;
    }
    

    该指令还支持更多高级的配置,详细后面介绍.

    该指令只能在serverlocation指令下.

    4. 多个虚拟host配置

    nginx允许我们通过配置多个server模块来host不同的网站,这就是virtual hosting,如:

    server {
      listen 80;
      server_name example.com;
    }
    server {
      listen 80;
      server_name foobar.com;
    }
    

    上述我们定义了两个server模块,监听的都是80端口,域名分别是example.comfoobar.com,这两个模块是完全独立的.

    首先这些域名要绑定到你机子的IP上,或者你手动修改下机子的hosts也可以

    匹配规则

    定了多个server之后,nginx是如何作匹配的呢?

    1. 匹配IP地址和端口号.如果只有一个符合,直接解析到该模块;若有匹配到多个,则往下第二步.
    2. 匹配server_name,解析到最匹配的模块.
    3. 如何server_name匹配不到,则解析到默认的模块,默认为第一个,也可以用指令修改默认模块listen 80 default_server;.

    由于server_name是可以用正则来定义的,具体的匹配可以去官网查看.

    5. 启动相关

    5.1 启动

    在CentOS中nginx的启动有两种方式:

    sudo nginx # 方式1
    systemctl start nginx # 方式2 
    

    nginx启动的时候默认会连个进程:master和worker.

    $ ps aux | grep nginx
    root 24484 0.0 0.0 85772 1312 ? Ss 1:38 0:00 nginx: master process
    nobody 24485 0.0 0.0 85992 2004 ? S 1:38 0:00 nginx: worker process
    

    其中master是读取和加载配置文件,并且控制worker进程.而worker则是真正处理请求的.

    对于worker进程的数量,可以通过worker_processes指令设置,默认为1,通常是设置成CPU的核心数,可以通过worker_processes auto来让其自动设置.

    绑定1024以下的端口需要root权限.

    5.2 重新加载配置文件

    nginx正在运行,但是nginx.conf文件被修改了,需要更新,可以这样:

    sudo nginx -s reload
    

    这样就无需关闭再启动了.

    5.3 退出

    退出可以这样:

    sudo nginx -s quit
    sudu nginx -s stop
    

    Reference

    1. NGINX: A Practical Guide to High Performance
    2. Alphabetical index of directives

    相关文章

      网友评论

          本文标题:nginx-1-基础配置

          本文链接:https://www.haomeiwen.com/subject/xhnqpttx.html