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 -h
或nginx -?
来查看帮助.
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 directive
和context 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指令里面;
通常HTTP
和Server
是一起出现的,并且可以包含多个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.html
和127.0.0.1/formal/hello.html
这两个请求就通过该指令设置解析到不同的地方:
location /test/ {
root /usr/share/nginx/test;
}
location /formal/ {
root /usr/share/nginx/formal;
}
该指令还支持更多高级的配置,详细后面介绍.
该指令只能在
server
或location
指令下.
4. 多个虚拟host配置
nginx允许我们通过配置多个server模块来host不同的网站,这就是virtual hosting
,如:
server {
listen 80;
server_name example.com;
}
server {
listen 80;
server_name foobar.com;
}
上述我们定义了两个server模块,监听的都是80端口,域名分别是example.com
和foobar.com
,这两个模块是完全独立的.
首先这些域名要绑定到你机子的IP上,或者你手动修改下机子的hosts也可以
匹配规则
定了多个server之后,nginx是如何作匹配的呢?
- 匹配IP地址和端口号.如果只有一个符合,直接解析到该模块;若有匹配到多个,则往下第二步.
- 匹配
server_name
,解析到最匹配的模块. - 如何
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
- NGINX: A Practical Guide to High Performance
- Alphabetical index of directives