以下备忘 Nginx 中基础配置的含义。
nginx.conf
在 /etc/nginx
中可以找到 nginx.conf
配置文件,其配置及注释如下:
# 运行 Nginx worker 进程的用户群组为 nginx
user nginx;
# 工作进程的数量,一般与 CPU 的核数相关
worker_processes 1;
# 错误日志的目录。最后一项为错误日志的级别
error_log /var/log/nginx/error.log warn;
# 保存主进程的进程 id 的位置
pid /var/run/nginx.pid;
# 设置一个工作进程可以连接的数量
events {
worker_connections 1024;
}
http {
# ...
}
有关错误日志的级别可以参考:「Nginx error_log 错误日志级别」。
http 模块
在 nginx.conf
中包含一个重要模块,其配置及注释如下:
# --- nginx.conf ----
# 其他配置
http {
# 这个文件告诉浏览器文件所属的类型
include /etc/nginx/mime.types;
# 设置了默认的类型(默认为二进制)
default_type application/octet-stream;
# 设置日志记录的一种格式,main 为名字
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 /var/log/nginx/access.log main;
# 是否使用这种方法传输数据
sendfile on;
#tcp_nopush on;
# keepalive 长连接延时
keepalive_timeout 65;
#gzip on;
# 包含的额外配置位置
include /etc/nginx/conf.d/*.conf;
}
该段配置中有一些比较重要的部分:
mime.types
该文件为 /etc/nginx/mine.types
,表示针对不同文件类型会返回给浏览器的 Content-Type
头部信息,以下是该文件的部分内容:
types {
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/javascript js;
application/atom+xml atom;
application/rss+xml rss;
# 其他内容
}
有关这一部分的详细信息可以查看:「Nginx — mime.types」和「HTTP Content-Type」。
log_format
该项配置了日志记录的格式,具体可以参考:「使用 log_format 为 Nginx 服务器设置更详细的日志格式」。
server 模块
由于在 nginx.conf
中存在下面这条配置,使得所有在该目录下,文件名以 .conf
结尾的文件都会被当作配置文件引入:
include /etc/nginx/conf.d/*.conf;
而在 /etc/nginx/conf.d/
目录下,提供了一个 default.conf
文件,以下是该文件部分内容及注释:
# 每一个 server 定义了一个虚拟主机
server {
# 端口号
listen 80;
# 访问的主机名
server_name localhost;
#charset koi8-r;
# 这里可以覆盖 http 中的配置
#access_log /var/log/nginx/log/host.access.log main;
# 其他配置
}
在 server 模块中,location
是非常重要的配置项,我们可以使用它完成很多需求。
简单的请求匹配
我更倾向于把它称为路由匹配,即根据请求的类型转发到相应的代码中进行处理,和路由器根据路由表转发数据包的过程很是相似。
server {
# 其他配置
server_name my.app.dev;
location / {
# 匹配时转发到的目录
root /usr/share/nginx/html;
# 如以 my.app.dev 访问,则尝试访问
# my.app.dev/index.html
# 或
# my.app.dev/index.htm
index index.html index.htm;
}
# 其他配置
}
这是一个简单的配置,所有以 my.app.dev
发起到该主机的请求都会与这一配置匹配。如请求 my.app.dev/a.html
则相当于访问 /usr/share/nginx/html/a.html
文件(注意配置域名解析到该服务器),该路径为 root
配置内容。
正则匹配
当然也可以使用正则表达式定义:
location ~* \.(jpg|jpeg|gif|png)$ {
root /usr/share/nginx/static/images;
}
该配置表示对图片类的静态资源的转发,其中 \.(jpg|jpeg|gif|png)$
为正则内容;
~*
表示请求不区分大小写,关于此类规则可以参考:「Nginx location 匹配规则」。
反向代理
我们还可以进行反向代理配置:
location /api {
# 代理转发
proxy_pass http://api.app.dev;
# 保留请求方的真实 IP
proxy_set_header X-Real-IP $remote_addr;
# 追加代理 IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
}
在使用代理后,如果想让代理后的服务器得到的请求地址仍是真实的客户,而不是代理服务器,则需要增加上述配置的下面两行。有关这二者的区别和更为详细的信息可以分别参考:「X-Forwarded-For 和 X-Real-IP 的区别?」和「怎样正确设置 remote_addr 和 x_forwarded_for」。
FastCGI
对于某些需要借助额外处理过程的文件,Nginx 需要将请求转发给实现了 CGI 或 FastCGI 的进程进行处理。在 PHP 中即为 php-fpm:
location ~ \.php$ {
# 注意,Nginx 和 FastCGI 通信具有两种形式,TCP 和 UNIX Socket 方式
# 默认为 socket 方式
# fastcgi_pass unix:/run/php/php7.0-fpm.sock;
# 或使用 TCP 方式
fastcgi_pass 127.0.0.1:9000;
# 默认索引文件
fastcgi_index index.php;
# 额外的参数:请求的脚本文件位置
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# 引入额外的 FastCGI 配置
include fastcgi_params;
}
其中:fastcgi_pass
表示将该类请求转发到哪个进程,这里配置为 127.0.0.1:9000
是因为 php-fpm
默认监听 9000 端口。
这里的 $document_root
和 $fastcgi_script_name
分别表示 root 配置指定的位置及脚本名称。二者连起来即为脚本文件的请求路径。详细信息可以参考「Nginx 内置预定义变量」和「fastcgi_param 详解 – CSDN」。
include fastcgi_params
为引入 /etc/nginx/fastcgi_params
文件。
地址重写
又称为伪静态,可以通过以下方式配置:
location / {
index index.php;
try_files $uri $uri/ /index.php?$query_string;
}
在 try_files
后附带三个参数(可以配置多个,中间用空格分隔),对于一个请求,会依次尝试这三者。如对于请求 my.app.dev/comments/1
,依次尝试:
my.app.dev/comments/1
按照 root 配置所表示的文件;my.app.dev/comments/1/
。这里是目录,会继续按照 index 配置查找如index.html
等文件;my.app.dev/index.php
。注意,虽然转发到这个文件,但请求的 url 仍是my.app.dev/comments/1
,一般在index.php
中会有请求解析模块专门进行匹配。
一般地址重写都是动态语言的需求,所以地址重写配置往往和 FastCGI 配置一同出现。
匹配顺序
同路由表的匹配规则类似,请求的匹配大体上也遵循最长匹配,具体规则如下(引用自:Nginx location 匹配规则):
= 前缀的指令严格匹配这个查询。如果找到,停止搜索;
所有剩下的常规字符串,最长的匹配。如果这个匹配使用^〜前缀,搜索停止;
正则表达式,在配置文件中定义的顺序;
如果第 3 条规则产生匹配的话,结果被使用。否则,使用第2条规则的结果。
默认匹配
在配置了 location / {...}
后,由于所有请求都属于这一格式。在没有更为精确的匹配符合的情况下,会进入这一配置中,实际上相当于缺省配置。
当然,我们也可以用以下方式配置一个默认(缺省)的 server:
server {
listen 80 default_server;
root /default/root;
#root return 444;
}
使用 default_server
标注其为默认 server。这里也可以把 root /default/root
改为 root return 444
,表示当必须使用默认 server 时,直接返回 444 HTTP 状态码。而又由于没有这一状态码,浏览器中会直接显示 网页无法正常工作
。
404 错误问题
当访问已正确配置的地址却出现 403 错误时,有可能是 SELinux 导致的。
先执行以下命令:
getenforce
如果出现 Enforcing
结果,则需要改变安全上下文:
chcon -Rt httpd_sys_content_t /your/web/dir
详细内容可以参考 「查看 SELinux 状态及关闭 SELinux」 和 「Chcon 命令」。