nginx-1-基础配置

2016-11-12  本文已影响182人  keith666

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
上一篇下一篇

猜你喜欢

热点阅读