1. nginx配置文件概要
nginx配置文件结构:
... #全局块
events { #events块
...
}
http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}
- 全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid的存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
- events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
- http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
- server块:配置虚拟主机的相关参数,一个http中可以有多个server。
- location块:配置请求的路由,以及各种页面的处理情况。
两个官方的配置示例参考:
https://www.nginx.com/resources/wiki/start/topics/examples/full/
https://www.nginx.com/resources/wiki/start/topics/examples/fullexample2/
2. 全局块及events块配置
# 以www用户身份运行nginx程序
user www;
# worker数量一般可以设置为cpu的核数,通过命令grep ^processor /proc/cpuinfo | wc -l可以查看
# 如果开启了ssl和gzip可以设置成与逻辑CPU数量一样甚至为2倍,以减少I/O操作
worker_processes 2;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
# 每一个worker进程能并发处理(发起)的最大连接数(包含与客户端或后端被代理服务器间等所有连接数)
# nginx作为反向代理服务器,计算公式 最大连接数 = worker_processes * worker_connections/4
events {
worker_connections 1024;
}
3. http块配置
http块内包含:
- http全局块配置
- upstream上游服务器配置(依据是否有需要反向代理的服务决定)
- server块配置
3.1 http全局块配置
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 定义日志格式,也可以在server块或者location块中设置,优先级依次升高
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指令指定nginx是否调用sendfile函数来输出文件,减少用户空间到内核空间的上下文切换。
# 对于普通应用设为on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。
sendfile on;
# tcp_nopush on;
# 长连接超时时间,单位是秒,这个参数很敏感,涉及浏览器的种类、后端服务器的超时设置、操作系统的设置等。
# 长连接请求大量小文件的时候,可以减少重建连接的开销,但假如有大文件上传,65s内没上传完成会导致失败。如果设置时间过长,用户又多,长时间保持连接会占用大量资源。
keepalive_timeout 65;
# 开启gzip压缩输出,减少网络传输
gzip on;
# 允许客户端请求的最大单文件字节数。如果有上传较大文件,需要修改这个值(默认为1m)
# 这个值可以在http块中设置,也可以在server块或者location块中设置,优先级依次升高
client_max_body_size 10m;
# nginx跟后端服务器连接超时时间(代理连接超时)
proxy_connect_timeout 75;
# 连接成功后,与后端服务器两个成功的响应操作之间超时时间(代理接收超时)
# 有时候后端服务器可能需要计算较长时间才能将结果返回,为避免nginx连接超时,可修改这个值
proxy_read_timeout 60;
# 引入其他配置,通常在有多个虚拟站点的情况下,为了避免单个配置文件的冗长
# 也为了便于管理,可将不同虚拟主机的配置文件分开
include /etc/nginx/conf.d/*.conf;
更多http全局块的配置可以参考:
3.2 upstream上游服务器配置
# 设定负载均衡及反向代理的后台服务器列表
upstream backend {
server 127.0.0.1:8000 weight=3;
server 127.0.0.1:8001;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
}
更多关于反向代理服务器的负载均衡以及健康检查的相关配置可参考:
https://segmentfault.com/a/1190000002873747
3.3 server块配置
# 虚拟主机配置
server {
listen 80;
server_name itoatest.example.com;
root /apps/oaapp;
charset utf-8;
access_log logs/host.access.log main;
#对 / 所有做负载均衡+反向代理
location / {
root /apps/oaapp;
index index.jsp index.html index.htm;
proxy_pass http://backend;
proxy_redirect off;
# 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
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_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}
#静态文件,nginx自己处理,不去backend请求tomcat
location ~* /download/ {
root /apps/oa/fs;
}
location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
{
root /apps/oaapp;
expires 7d;
}
location /nginx_status {
stub_status on;
access_log off;
allow 192.168.10.0/24;
deny all;
}
}
## 其它虚拟主机,server 指令开始
}
http服务上支持若干虚拟主机。每个虚拟主机一个对应的server配置项,配置项里面包含该虚拟主机相关的配置。
listen 80;
:该server监听在80端口,server_name
:与客户端http请求头部信息中的主机名相关,可以通过正则匹配。还可参考 http://nginx.org/en/docs/http/server_names.html
3.3.1 location
http服务中,某些特定的URL对应的一系列配置项。
- root /var/www/html
定义服务器的默认网站根目录位置。如果locationURL匹配的是子目录或文件,root没什么作用,一般放在server指令里面或/下。
- index index.jsp index.html index.htm
定义路径下默认访问的文件名,一般跟着root放
- proxy_pass http://backend
请求转向backend定义的服务器列表,即反向代理,对应upstream负载均衡器。也可以proxy_pass http://ip:port。
- 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;
这四个暂且这样设,如果深究的话,每一个都涉及到很复杂的内容,也将通过另一篇文章来解读。
关于location匹配规则的写法,可以说尤为关键且基础的,参考文章 nginx配置location总结及rewrite规则写法;
4. 其他
4.1 访问控制 allow/deny
Nginx 的访问控制模块默认就会安装,而且写法也非常简单,可以分别有多个allow,deny,允许或禁止某个ip或ip段访问,依次满足任何一个规则就停止往下匹配。如:
location /nginx-status {
stub_status on;
access_log off;
# auth_basic "NginxStatus";
# auth_basic_user_file /usr/local/nginx-1.6/htpasswd;
allow 192.168.10.100;
allow 172.29.73.0/24;
deny all;
}
我们也常用 httpd-devel 工具的 htpasswd 来为访问的路径设置登录密码:
# htpasswd -c htpasswd admin
New passwd:
Re-type new password:
Adding password for user admin
# htpasswd htpasswd admin //修改admin密码
# htpasswd htpasswd sean //多添加一个认证用户
这样就生成了默认使用CRYPT加密的密码文件。打开上面nginx-status的两行注释,重启nginx生效。
4.2 列出目录 autoindex
Nginx默认是不允许列出整个目录的。如需此功能,打开nginx.conf文件,在location,server 或 http段中加入autoindex on;,另外两个参数最好也加上去:
- autoindex_exact_size off;
默认为on,显示出文件的确切大小,单位是bytes。改为off后,显示出文件的大概大小,单位是kB或者MB或者GB
- autoindex_localtime on;
默认为off,显示的文件时间为GMT时间。改为on后,显示的文件时间为文件的服务器时间
location /images {
root /var/www/nginx-default/images;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
留言