配置文件的位置:/usr/local/nginx/conf/nginx.conf
user
#user www www;
nginx 运行的用户和用户组,默认为 nobody
pid
pid logs/nginx.pid;
进程文件配置,默认为 logs/nginx.pid
error_log
error_log logs/error.log warn;
错误日志配置。
日志级别可选:debug < info < notice < warn < error < crit
日志级别越高,记录的日志信息越少
worker_processes
worker_processes 1;
nginx 对外提供 web 服务的 worder 进程数。通常设置和 cpu 核数的数量相等
worker_rlimit_nofile
worker_rlimit_nofile 1024;
一个 worker 进程能打开的文件的最大数目。
理论值应该是系统最多能打开的文件数(在 linux 中执行 ulimit -n 可得到值)与 worker 进程数相
除得到的值,但是 nginx 分配请求并不均匀,建议与 ulimit -n 的值保持一致
events
events {
worker_connections 1024;
use epoll;
}
worker_connections
worker_connections 1024;
设置单个 worker 进程最大连接数
use
use epoll;
设置复用客户端线程的轮询方法
use [ kqueue | rtsig | epoll | select | poll ]
epoll 是 linux 2.6 以上版本内核中的高性能网络 I / O 模型
如果不设置,nginx 会选择一个最适合你操作系统的模型
http
http {
}
http 服务器配置
include
include mime.types;
设置 MIME 类型(资源的媒体类型),通过 http 协议由 web 服务器返回给客户端浏览器,浏览器会自动使用指定应用程序来打开资源文件
mime.types 文件位于 /usr/local/nginx/conf/mime.types
default_type
default_type application/octet-stream;
默认的资源文件的媒体类型,application/octet-stream 为任意的二进制数据流传输
log_format
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
日志格式。"log_format main" 这里的 main 是日志格式的名称,通过不同名称来定义多种日志格式
access_log
access_log logs/access.log main;
配置访问日志。可以指定使用的日志格式,如这里的 main
charset
charset UTF-8;
使用的字符集编码
sendfile
sendfile on;
通过调用 sendfile 函数(sendfile 是一个系统调用,在内核空间中完成),可以高效的发送静态文件
tcp_nopush
tcp_nopush on;
一次性发送数据包。与 tcp_nodelay 配置项互斥,与 sendfile 配合工作
tcp_nodelay
#tcp_nodelay on;
每 0.2 秒后立即发送一个数据包,可以有效的防止网络阻塞,当需要及时发送数据时,应该开启它
keepalive_timeout
keepalive_timeout 60;
配置长连接的超时时间。服务器将在这个超时时间过后关闭链接
client_header_timeout
client_header_timeout 120;
等待客户端发送一个请求头的超时时间,超时 Nginx 返回一个请求超时的状态码(408,Request Timeout)
client_body_timeout
client_body_timeout 120;
等待客户端发送一个请求体的超时时间,超时 Nginx 返回一个请求超时的状态码(408,Request Timeout)
send_timeout
send_timeout 120;
客户端读取数据的超时时间,超时 Nginx 就会关闭该连接
client_header_buffer_size
client_header_buffer_size 16k;
缓存客户端请求头的大小
large_client_header_buffers
large_client_header_buffers 4 32k;
缓存客户端请求头的最大大小,此处为 4 个 32K 的大小
gzip
gzip on;
采用 gzip 压缩的形式发送数据,可以减少发送的数据量
gzip_min_length
gzip_min_length 1k;
大于该值的内容才压缩,0 表示所有的内容都压缩
gzip_buffers
gzip_buffers 4 16k;
缓存 gzip 压缩数据的空间大小,此处为 4 个 16K 的大小
gzip_types
gzip_types text/plain text/css application/x-javascript application/xml;
只有匹配配置的 MIME 类型的文档内容才会被压缩
nginx 默认会对 text/html 类型进行压缩,此处无需再配,若配置 text/html,nginx 会发出警告:
nginx: [ warn ] duplicate MIME type "text/html"
server_names_hash_bucket_size
server_names_hash_bucket_size 128;
服务器名称的 hash 表大小,如果太小,Nginx 无法启动
server
server {
}
虚拟主机配置
listen
listen 80;
监听端口
server_name
server_name fanlychie.com www.fanlychie.com;
域名,可以配置多个,以空格分开
access_log
access_log logs/fanlychie.access.log main;
虚拟主机访问日志。
root
root www.fanlychie.com;
网站根目录,用于存放网站静态资源文件。若为相对路径,则是相对于 nginx 安装的目录。如此处的物理路径为 /usr/local/nginx/www.fanlychie.com
location
location / {
}
多个 location 匹配 url 地址的优先级:
"=" 被匹配,停止搜索其他匹配
"^~" 被匹配,停止搜索其他匹配
"~" 和 "~*" 按配置文件中出现的先后顺序,一旦匹配,停止搜索其他匹配
若以上都没有匹配到,则交给 "/" 处理请求
expires
location ~ \.(js|css)$ {
expires 1d;
}
js 和 css 文件由 nginx 直接提供,缓存一天
如客户端访问 http://www.fanlychie.com/styles/main.css
由于上面已经配置 root www.fanlychie.com,nginx 会将
/usr/local/nginx/www.fanlychie.com/styles/main.css 文件直接返回给客户端
location ~ \.(gif|jpg|jpeg|png|ico)$ {
expires 7d;
}
同上面,图片文件缓存 7 天
deny
location ~* \.jsp {
deny all;
}
禁止直接访问 *.jsp 文件(返回 403 状态码给客户端)
proxy_pass
location = / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://www.fanlychie.com/index;
}
proxy_pass 配置反向代理
即通过域名访问网站首页,nginx 将请求转发给真实的运用服务器处理,即
http://www.fanlychie.com/index (www.fanlychie.com 是上面配置的 server_name 的名称)
proxy_set_header
location / {
proxy_pass http://www.fanlychie.com;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffers 32 4k;
}
proxy_redirect
proxy_redirect 与 proxy_pass 用法类似,proxy_pass 是转发请求,客户端 url 地址不变;
proxy_redirect 是请求重定向,客户端 url 地址发生变化。
client_max_body_size
允许客户端请求的最大单文件字节数
client_body_buffer_size
代理缓冲用户端请求的缓冲区最大字节数
proxy_connect_timeout
代理连接超时时间(nginx 跟后端服务器连接超时时间)
proxy_send_timeout
代理发送超时时间(后端服务器数据回传时间)
proxy_read_timeout
代理接收超时时间(连接成功后,后端服务器响应时间)
proxy_buffers
代理缓冲区的大小
error_page
location = /403.html {
root html;
}
location = /404.html {
root html;
}
location = /50x.html {
root html;
}
error_page 403 /403.html;
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
错误页面配置。
upstream
upstream www.fanlychie.com {
server 192.168.1.102:8080;
server 192.168.1.103:8080;
}
负载均衡配置
upstream www.fanlychie.com,此处的 www.fanlychie.com 是上面 server 模块配置的
server_name。server 指定真实的运用服务主机地址,可以配置多个。
nginx 默认采用轮询的策略,将请求平均的分配到各个运用服务主机中,当其中一台服务主机宕机
后,会自动的被剔除,另外一台服务主机仍然能正常提供服务。
weight
upstream www.fanlychie.com {
server 192.168.1.102:8080 weight=1;
server 192.168.1.103:8080 weight=2;
};
在轮询的基础上加上权重,数值越大,表示权值越大,nginx 分发的请求越多
用于运用服务器性能不均的情况。当其中一台服务主机宕机后,会自动的被剔除,另外一台服务主
机仍然能正常提供服务
ip_hash
upstream www.fanlychie.com {
ip_hash;
server 192.168.1.102:8080;
server 192.168.1.103:8080;
}
每个请求按访问 ip 的 hash 结果分配服务主机
当新的请求到达时,先将用户 ip 通过哈希算法求值,在随后的请求客户端 ip 的哈希值只要相同,
就会被分配至同一个后端服务器,这种调度可以解决 session 共享的问题,但有时会导致分配不均
即无法保证负载均衡
#user nobody;
pid logs/nginx.pid;
worker_processes 1;
worker_rlimit_nofile 1024;
error_log logs/error.log warn;
events {
worker_connections 1024;
use epoll;
}
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;
charset UTF-8;
sendfile on;
tcp_nopush on;
#tcp_nodelay on;
keepalive_timeout 60;
client_header_timeout 120;
client_body_timeout 120;
send_timeout 120;
client_header_buffer_size 16k;
large_client_header_buffers 4 32k;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_types text/plain text/css application/x-javascript application/xml;
server_names_hash_bucket_size 128;
upstream www.fanlychie.com {
server 192.168.1.102:8080;
server 192.168.1.103:8080;
}
server {
listen 80;
server_name fanlychie.com www.fanlychie.com;
access_log logs/fanlychie.access.log main;
root www.fanlychie.com;
location = / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://www.fanlychie.com/index;
}
location ~ \.(js|css)$ {
expires 1d;
}
location ~ \.(gif|jpg|jpeg|png|ico)$ {
expires 7d;
}
location ~* \.jsp {
deny all;
}
location / {
proxy_pass http://www.fanlychie.com;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffers 32 4k;
}
location = /403.html {
root html;
}
location = /404.html {
root html;
}
location = /50x.html {
root html;
}
error_page 404 /404.html;
error_page 403 /403.html;
error_page 500 502 503 504 /50x.html;
}
}
变量 | 描述 |
---|---|
$args | 请求的参数 |
$content_length | 请求头中的 Content-length 域的值 |
$content_type | 请求头中的 Content-Type 域的值 |
$host | 请求主机域的值,否则为服务器名称 |
$http_user_agent | 客户端 agent 信息 |
$http_cookie | 客户端 cookie 信息 |
$request_method | 客户端请求的动作,通常为 GET 或 POST |
$remote_addr | 客户端的 IP 地址 |
$remote_port | 客户端的端口 |
$remote_user | 已经经过 Auth Basic Module 验证的用户名 |
$request_filename | 当前请求的文件路径 |
$query_string | 与 $args 同 |
$scheme HTTP | 方法(如 http,https) |
$server_protocol | 请求使用的协议,通常是 HTTP/1.0 或 HTTP/1.1 |
$server_addr | 服务器地址,在完成一次系统调用后可以确定这个值 |
$server_name | 服务器名称 |
$server_port | 请求到达服务器的端口号 |
$request_uri | 包含请求参数的原始 URI,不包含主机名,如:"/foo/bar.php?arg=baz" |
$uri | 不带请求参数的当前 URI,$uri 不包含主机名,如 “/foo/bar.html” |
$document_uri | 与 $uri 同 |
表达式 | 表达式 | 描述 |
---|---|---|
-f | !-f | 判断文件是否存在 |
-d | !-d | 判断目录是否存在 |
-e | !-e | 判断文件或目录是否存在 |
-x | !-x | 判断文件是否可执行 |