Nginx配置
常用配置参数
常见配置
client_max_body_size 100m; #默认为1m,如果上传文件的话需要设置一下 error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg events { accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off #use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport worker_connections 1024; #最大连接数,默认为512 }
location配置
语法规则: location [=|~|~*|^~] /uri/ { … }
= 开头表示精确匹配
^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。以xx开头
~ 开头表示区分大小写的正则匹配 以xx结尾
~* 开头表示不区分大小写的正则匹配 以xx结尾
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
/ 通用匹配,任何请求都会匹配到。
普通匹配,遵循最长匹配规则,假设一个请求匹配到了两个普通规则,则选择匹配长度大的那个,一般情况下普通匹配成功后,还是会继续正则匹配,一旦正则匹配也匹配成功后,以正则匹配为准。但是除^~和=除外,即^~和=匹配成功后,不再继续正则匹配。
反向代理
nginx反向代理后,php通过$_SERVER['REMOTE_ADDR']获取ip时,获取到的ip都是nginx的ip 127.0.0.1 。这时需要nginx去获取客户端的ip地址,并设置到反向代理头中,供php获取使用。把下面设置添加到location配置块中,也可以添加到server http 块
proxy_set_header X-Real-IP $remote_addr; # 真实的客户端IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 代理路由信息,此处取代理IP(可以被伪造)有安全隐患,可以直接使用$remote_addr替换,具体看自己的情况 proxy_set_header Host $http_host; # 请求头中Host信息 proxy_set_header X-NginX-Proxy true; proxy_set_header X-Forwarded-Proto $scheme; # 真实的用户访问协议
跨域响应设置
响应options请求,加到location配置块
if ( $request_method = 'OPTIONS' ) { add_header Access-Control-Allow-Origin $http_origin; add_header Access-Control-Allow-Headers Authorization,Access-token,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,X-Data-Type,X-Requested-With; add_header Access-Control-Allow-Methods GET,POST,OPTIONS,HEAD,PUT; add_header Access-Control-Allow-Credentials true; add_header Access-Control-Allow-Headers X-Data-Type,X-Auth-Token; return 200; }
开启GZ压缩
把下面配置添加到server配置块
gzip on; gzip_min_length 1k; gzip_buffers 4 16k; #gzip_http_version 1.0; gzip_comp_level 8; gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; gzip_vary off; gzip_disable "MSIE [1-6]\.";
动态分离配置
server { listen 80; server_name localhost; location / { root /usr/local/nginx/html; index index.html index.htm; } # 所有静态请求都由nginx处理,存放目录为html location ~.(gif|jpg|jpeg|png|bmp|swf|css|js)$ { root /usr/local/nginx/html; } # 所有动态请求都转发给apache处理 location ~ \.php$ { proxy_pass http://apptest; 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 50m; client_body_buffer_size 512k; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 10k; proxy_buffers 4 64k; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 128k; } }
htts配置
下面是一个把https代理到本机http的配置,证书直接放到配置目录 下面的cert目录就可以
server { listen 443 ssl; server_name www.zhaokeli.com; ssl on; ssl_certificate cert/1_www.zhaokeli.com_bundle.crt; ssl_certificate_key cert/2_www.zhaokeli.com.key; #charset koi8-r; #access_log logs/$host.access.log main; location / { proxy_pass http://www.zhaokeli.com:8989; index index.html index.htm; } }
if语句中的判断条件(nginx)
正则表达式匹配:
== 等值比较;
~ 与指定正则表达式模式匹配时返回“真”,判断匹配与否时区分字符大小写;
~* 与指定正则表达式模式匹配时返回“真”,判断匹配与否时不区分字符大小写;
!~ 与指定正则表达式模式不匹配时返回“真”,判断匹配与否时区分字符大小写;
!~* 与指定正则表达式模式不匹配时返回“真”,判断匹配与否时不区分字符大小写;
文件及目录匹配判断:
-f, !-f 判断指定的路径是否为存在且为文件;
-d, !-d 判断指定的路径是否为存在且为目录;
-e, !-e 判断指定的路径是否存在,文件或目录均可;
-x, !-x 判断指定路径的文件是否存在且可执行;
nginx内置变量:
nginx的配置文件中可以使用的内置变量,都是以美元符$开始,也有人叫全局变量。其中,部分预定义的变量的值是可以改变的,这些内置变量可以提供给后端程序使用,比如php。下面列表就是nginx部分内置变量及其含义。
$args 请求中的参数; $binary_remote_addr 远程地址的二进制表示 $body_bytes_sent 已发送的消息体字节数 $content_length HTTP请求信息里的"Content-Length" $content_type 请求信息里的"Content-Type" $document_root 针对当前请求的根路径设置值 $document_uri 与$uri相同 $host 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名; $http_cookie cookie 信息 $http_referer 来源地址 $http_user_agent 客户端代理信息 $http_via 最后一个访问服务器的Ip地址 $http_x_forwarded_for 相当于网络访问路径。 $limit_rate 对连接速率的限制 $remote_addr 客户端地址 $remote_port 客户端端口号 $remote_user 客户端用户名,认证用 $request 用户请求信息 $request_body 用户请求主体 $request_body_file 发往后端的本地文件名称 $request_filename 当前请求的文件路径名 $request_method 请求的方法,比如"GET"、"POST"等 $request_uri 请求的URI,带参数 $server_addr 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费) $server_name 请求到达的服务器名 $server_port 请求到达的服务器端口号 $server_protocol 请求的协议版本,"HTTP/1.0"或"HTTP/1.1" $uri 请求的URI,可能和最初的值有不同,比如经过重定向之类的
nginx内核参数调优:
nginx进程数,一般跟cpu核数相同或为它的倍数,所以建议按照cpu数目来指定。
worker_processes 8;
Nginx最多可以打开文件数
worker_rlimit_nofile 65535;
该指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。
注:文件资源限制的配置可以在/etc/security/limits.conf设置,针对root/user等各个用户或者*代表所有用户来设置。
* soft nofile 65535
* hard nofile 65535
用户重新登录生效(ulimit -n)
隐藏响应头中的有关操作系统和Nginx服务器版本号的信息,保障安全性。
server_tokens off;