一、Nginx 配置
- nginx.conf:配置文件
- nginx.conf.default:配置文件备份
'语句块' '参数' {
'属性' '属性值;'
}
user root;
worker_processes 1;
error_log logs/error.log;
pid logs/nginx.pid;
worker_rlimit_nofile 65535;
events {
use epoll;
worker_connections 1024;
}
1. http 服务器模块
http {
include mime.types;
default_type application/octet-stream;
charset utf-8;
server_names_hash_bucket_size 128;
server_names_hash_max_size 2048;
client_header_buffer_size 32k;
large_client_header_buffers 4 64k;
client_max_body_size 8m;
autoindex on;
autoindex_exact_size on;
autoindex_localtime on;
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;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
client_header_timeout 15;
client_body_timeout 15;
send_timeout 25;
client_max_body_size 8m;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
}
1. client_max_body_size 请求体大小
- 上传文件大小的限制
- 限制请求体的大小,若超过所设定的大小,返回 413 错误
- 默认1m(位置 http、server、location)
2. client_header_timeout 读取请求头超时
- 读取请求头的超时时间,若超过所设定的大小,返回 408 错误
3. client_body_timeout 读取请求体超时
- 读取请求实体的超时时间,若超过所设定的大小,返回 413 错误
4. proxy_connect_timeout 代理连接超时
- http 请求无法立即被容器(tomcat、netty 等)处理,被放在 nginx 的待处理池中等待被处理
- 此参数为等待的最长时间,默认为 60 秒,官方推荐最长不要超过 75 秒
5. proxy_read_timeout 代理读取超时
- http 请求被容器(tomcat、netty 等)处理后,nginx 会等待处理结果,也就是容器返回的 response
- 此参数即为服务器响应时间,默认 60 秒
6. proxy_send_timeout 代理发送超时
- http 请求被服务器处理完后,把数据传返回给 nginx 的用时
- 默认 60 秒
2. server 站点模块
- server { … }:具体的站点(可配置一个或多个)
- listen 端口:监听的端口(默认:80)
- server_name 服务名:主机名称,外网访问的域名(默认:“”,多个空格隔开,支持通配符
*.qs.com www.qs.*
与正则) - root 目录:站点根路径,站点内所有 localhost 共享(配置绝对路径)
server {
listen 80;
server_name localhost;
rewrite ^(.*) https://$server_name$1 permanent;
charset utf-8;
access_log logs/host.access.log main;
root /usr/www/qs/;
index index.html;
location / {
root html;
index index.html index.htm;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
include servers/*;
}
server {
listen 443 ssl;
server_name ably.com;
ssl_certificate C:\WebServer\Certs\certificate.crt;
ssl_certificate_key C:\WebServer\Certs\private.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
index index.html index.htm index.php;
root /data/www/;
location ~ .*\.(php|php5)?$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
}
1. 指定定错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /source/error_page;
}
2. 静态文件压缩
server {
gzip on;
gzip_http_version 1.1;
gzip_comp_level 4;
gzip_min_length 1000;
gzip_types text/plain application/javascript text/css;
}
3. 动静分离
server {
listen 80;
server_name *.qs.com;
root /www/qshome;
location / {
index qs.html;
}
location /static {
alias /www/qshome/static;
}
}
server {
listen 80;
server_name *.qs.com;
root /www/qshome;
location / {
index qs.html;
}
location ~* \.(gif|jpg|png|css|js)$ {
root /www/qshome/static;
}
}
4. 子域名站点
- 每个子域名对应一个静态站点,如果每天增加一个域名会相当麻烦。
- 在 Nginx 当中可直接基于
$host
连接到对应目录。
server {
listen 80;
server_name *.qs.com;
root /data/www/$host;
access_log logs/$host.access.log;
location / {
index index.html;
}
}
3. location 过滤器模块
- localhost { … }:过滤器模块(
/
匹配所有的请求)
- root 目录:localhost.root 优先级高于 server.root
- index index.html:站点页面
- proxy_set_header:请求头
- proxy_pass:代理
- location 语法:
location [=|~|~*|^~|@]/URI/ { ... }
- =:表示把 URI 作为字符串,与参数中的 URI 做 完全匹配
- ~:表示正则匹配 URI 时,字母大小写是敏感的
- ~*:表示正则匹配 URI 时,忽略字母大小写
- ^~:表示正则匹配 URI 时,只需要其前半部分与 URI 参数匹配即可
- /:表示基于 URI 目录匹配
location ~ \.php$ {
proxy_pass http://127.0.0.1;
}
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;
}
location ~ /\.ht {
deny all;
}
1. root 站点根目录
- 可配置在 server.root 或 location.root 模块中
- 基于路径 root + URI,去寻找指定文件
location /qs {
root /www/qshome/;
index index.html index.htm;
}
2. alias 站点别名
- 只能配置 location 模块中
- 基于 alias + (URI - location) 路径,去寻找文件
location /qs {
alias /www/qshome;
index index.html index.htm;
}
3. 根据 文件类型 设置 过期时间
location ~.*\.css$ {
expires 1d;
break;
}
location ~.*\.js$ {
expires 1d;
break;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
access_log off;
expires 15d;
break;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 10d;
}
location ~ .*\.(js|css)?$ {
expires 1h;
}
4. 禁止文件缓存
- 开发环境经常改动代码,由于浏览器缓存需要强制刷新才能看到效果
- 可以禁止浏览器缓存提高效率
location ~* \.(js|css|png|jpg|gif)$ {
add_header Cache-Control no-store;
}
5. 防盗链
- 指本站内 图片、CSS 等资源,只有本站点可以访问,不允许其它站点打开
- 该功能如果用 Java 实现很单简单,只要判断一下请求头当中的 referer 属性是否为指定域名即可
- 说明:如果 valid_referers 条件判断未通过,nginx 则会赋值 invalid_referer 为 true
- 语法:
valid_referers none | blocked | server_names | string ...;
- none:不允许 Referer 来源 头部为空的情况
- blocked:不允许 Referer 值为空的情况(有可能 Referer 的值,被 代理 或者 防火墙 删除)
- server_names:Referer 来源头部包,必须含当前的 server_names 中一个(当前域名,可以配置多个)
- string:自定义字符串,可以在 开头 或 结尾 有
"*"
(检查时,“Referer” 字段中的 服务器端口 被忽略)
location ~* \.(gif|png|jpg|swf|flv)$ {
root html;
valid_referers www.qs.com www.qshome.com;
if ($invalid_referer) {
rewrite ^/ http://www.qs.com/image/403.png;
}
}
location ~* \.(gif|png|jpg|swf|flv)$ {
root html;
valid_referers none blocked *.qs.com *.qshome.com;
if ($invalid_referer) {
return 403;
}
}
location ~* \.(gif|jpg|png)$ {
valid_referers none blocked 192.168.0.1;
if ($invalid_referer) {
rewrite ^/ http://$host/logo.png;
}
}
6. 下载限速
location /download {
limit_rate 1m;
limit_rate_after 30m;
}
7. IP 黑名单
location ~ /\.ht {
deny all;
}
deny 192.168.0.1;
allow 192.168.0.2;
deny 192.168.0.0/24;
allow 192.168.0.25/30;
deny all;
allow all;
echo 'deny 192.168.0.132;' >> balck.ip
include black.ip;
8. nginx 状态
location /nginx_status {
stub_status on;
access_log off;
}
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
}
9. stub_status
location = /basic_status {
stub_status;
}
10. 请求头
location = / {
proxy_set_header LoginFrom 'Internet';
}
11. 配置地址拦截转发,解决跨域验证问题
location /oauth/{
proxy_pass https://localhost:13580/oauth/;
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
二、Nginx 其他配置
1. 日志配置
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;
log_format log_json '{"本地时间": "$time_local", '
'"请求地址": "$remote_addr", '
'"请求服务": "$request", '
'"请求状态": $status, '
'"字节大小": $body_bytes_sent, '
'"用户访问地址": "$upstream_addr",'
'"域名": "$upstream_http_host",'
'"响应时间": "$upstream_response_time",'
'"请求时间": "$request_time"'
' }';
1. 基于域名打印日志
access_log logs/$host.access.log main;
2. error 日志配置
- 语法:
error_log '/path/file' 'level';
- /path/file:日志路径
- level:日志的输出级别(取值范围是:debug > info > notice > warn > error > crit > alert > emerg)
- 默认:
error_log logs/error.log error;
3. 指定客户端输出 debug 日志
- 语法:
debug_connection [ IP | CIDR ];
- 注意:debug 日志的开启,必须在安装时添加 --with-debug(允许 debug)
events {
debug_connection 192.168.0.147;
debug_connection 10.224.57.0/200;
}
2. 上传文件大小
- 上传文件报 413 Request Entity Too Large
- 设置到 http{} 内,控制全局 nginx 所有请求报文大小
http {
client_max_body_size 20M
}
- 设置到 server{} 内,控制该 server 的所有请求报文大小
server {
client_max_body_size 20M
}
- 设置到 location{} 内,控制满足该路由规则的请求报文大小
localhost / {
client_max_body_size 20M
}
三、Nginx 扩展