配置文件名为nginx.conf
,Linux放在目录:/usr/local/nginx/conf
、/etc/nginx
, 或 /usr/local/etc/nginx
中;Windows放在安装目录\conf
中。依据实际安装情况决定
1、配置文件结构
1.1、模块
nginx由配置文件中指定的指令控制模块组成。 指令分为简单指令和块指令:
简单指令
由空格分隔的名称和参数组成,并以分号;
结尾;
块指令
具有与简单指令相同的结构,但是是以大括号{
和}
包围的一组附加指令。 如果块指令在大括号内部有其他指令,则称为上下文(例如:events
,http
,server
和location
);
配置文件中放置在任何上下文之外的伪指令都被认为是主上下文。 events
和http
指令驻留在主上下文中,server
在http
中的,而location
在server
块中。一个配置文件一个http
,一个及以上个server
,一个server
运行一个工作进程并代表一个虚拟服务器;
#
号所在的一行被视为注释;
几个顶级指令将适用于不同流量类型的指令组合在一起:
events
– 一般连接处理,影响Nginx与用户的网络连接
http
– HTTP协议流量
stream
– TCP协议流量
对于大多数指令,在子上下文中定义的上下文将继承父级中包含的伪指令的值,要覆盖从父进程继承的值,子上下文中需要包含该指令(即子上下文要显式声明)。
1.2、格式
打开配置文件(如/usr/local/nginx/conf/nginx.conf
),默认的配置文件已经包含了服务器块的几个示例,大部分是注释掉的。 现在注释掉所有这样的块,并启动一个新的服务器块:
http {
server {
}
}
1.3、简单静态资源服务器配置
每个server
上下文都可以指定要监听的端口、server_name,当nginx决定哪个服务器处理请求后,它会根据服务器块内部定义的location指令的参数测试请求头中指定的URI, 比如如下配置,系统中创建/data
目录及其子目录/www
:
http {
server {
listen 80;
server_name localhost;
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
}
第一个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
文件。
如果错误或异常导致无法正常工作,可以尝试查看目录/usr/local/nginx/logs或/var/log/nginx中的access.log和error.log文件中查找原因。
1.4、简单代理服务求配置
反向代理应该是Nginx做的最多的一件事了,反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。简单来说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。
通过向nginx配置文件添加一个server块来定义代理服务器,其中包含以下内容:
server {
listen 8080;
root /data/up1;
location / {
}
}
这将是一个监听端口8080
的简单服务器,并将所有请求映射到本地文件系统上的/data/up1
目录。 请注意,root指令位于server块上下文中,当选择用于服务请求的location
块不包含自己的root
指令时,将使用此root指令。创建/data/up1
目录然后可以将一个静态网页比如index.html
文件放入其中,然后访问http://localhost:8080/
即可访问该文件。
目前为止,还是配置的静态资源访问,并不是代理服务器,然后增加或修改现有location
上下文,改为如下:
location / {
proxy_pass http://localhost:8181;
}
当用户访问http://localhost:8080/
时,会返回http://localhost:8181
服务器的的资源。
location
上下文后面的参数,可以是正则表达式,如果是正则表达式,前面要加~
,比如:
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
以上配置表示,nginx接收到所有以.gif,.jpg或.png结尾的URI,相应的请求将映射到/data/images目录。当nginx选择一个location块来提供请求时,它首先检查指定前缀的location指令,记住具有最长前缀的location,然后检查正则表达式。 如果与正则表达式匹配,nginx会选择此location,否则选择之前记住的那一个。
要找到最符合URI的位置,NGINX首先将URI与前缀字符串的位置进行比较。然后用正则表达式搜索位置。除非使用^~修饰符对正则表达式给予更高的优先级。在前缀字符串中,NGINX选择最具体的字符串(也就是最长和最完整的字符串)。 下面给出了选择处理请求的位置的确切逻辑:
测试所有URI的前缀字符串。=
(等号)修饰符定义了URI和前缀字符串完全匹配。如果找到完全匹配,则搜索停止。如果^~
(插入符号)修饰符预先添加最长匹配前缀字符串,则不会检查正则表达式。存储最长匹配的前缀字符串。根据正则表达式测试URI。断开第一个匹配的正则表达式并使用相应的位置。如果没有正则表达式匹配,则使用与存储的前缀字符串相对应的位置。
=
修饰符的典型用例是/
(正斜杠)的请求。 如果请求/是频繁的,则指定= /
作为location指令的参数加速处理,因为搜索匹配在第一次比较之后停止。
1.5、完整配置文件示例
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
# 最大支持连接数
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 81;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
配置文件开始到
events
上下文之前,该部分内容主要设置Nginx运行时全局的配置指令,包括运行Nginx的用户(组)、允许生成的work process 数量、进程PID存放路径、日志存放路径以及相关配置文件的引用。
2、基础命令
要启动nginx,请运行可执行文件。 当nginx启动后,可以通过使用-s参数调用可执行文件来控制它。 使用以下语法:
nginx -s signal
信号(signal)的值可能是以下之一:
stop
- 快速关闭服务
quit
- 正常关闭服务,命令应该在启动nginx的同一用户下执行,通过等待工作进程完成当前服务请求后再停止nginx进程
reload
- 重新加载配置文件,将重新配置命令的命令发送到nginx或重新启动之前,配置文件中的更改将不会被应用,不重启加载更改后的配置文件内容
reopen
- 重新打开日志文件
nginx -s reload
当主进程收到要重新加载配置的信号,它将检查新配置文件的语法有效性,并尝试应用其中提供的配置。 如果这是成功的,主进程将启动新的工作进程,并向旧的工作进程发送消息,请求它们关闭。 否则,主进程回滚更改,并继续使用旧配置。 老工作进程,接收关闭命令,停止接受新连接,并继续维护当前请求,直到所有这些请求得到维护。 之后,旧的工作进程退出。
3、root和index
两者在location
中,指定一个路径,其中使用alias
做如下配置:
location /img/ {
alias /var/www/image/;
}
若按照上述配置的话,则访问/img/目录里面的文件时,ningx会自动去/var/www/image/目录找文件
location /img/ {
root /var/www/image;
}
若按照这种配置的话,则访问/img/目录下的文件时,nginx会去/var/www/image/img/目录下找文件。alias是一个目录别名的定义,root则是最上层目录的定义,指的是/var/www/image/img/
。还有一个重要的区别是alias后面必须要/
结束,否则会找不到文件,而root则可有可无。
另外对于index,含义如下
location / {
root /var/www/;
index index.htm index.html;
}
这样,当用户请求 /
地址时,Nginx 就会自动在 root
配置指令指定的文件系统目录下依次寻找 index.htm
和index.html
这两个文件。如果 index.htm
文件存在,则直接发起“内部跳转”到 /index.htm
这个新的地址;而如果 index.htm
文件不存在,则继续检查 index.html
是否存在。如果存在,同样发起“内部跳转”到/index.html
;如果 index.html
文件仍然不存在,则放弃处理权给 content
阶段的下一个模块。
参考地址1
参考地址2:B站