Nginx配置

来源:赵克立博客 分类: Linux 标签:运维nginxLinux命令发布时间:2019-05-15 15:08:51最后更新:2019-05-28 17:06:46浏览:786
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。o_0。
更新时间:
2019-05-28 17:06:46
温馨提示:
学无止境,技术类文章有它的时效性,请留意文章更新时间,如发现内容有误请留言指出,防止别人"踩坑",我会及时更新文章

常用配置参数 

常见配置

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/ { … }

  1. = 开头表示精确匹配

  2. ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。以xx开头

  3. ~ 开头表示区分大小写的正则匹配                     以xx结尾

  4. ~* 开头表示不区分大小写的正则匹配                以xx结尾

  5. !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则

  6. / 通用匹配,任何请求都会匹配到。

普通匹配,遵循最长匹配规则,假设一个请求匹配到了两个普通规则,则选择匹配长度大的那个,一般情况下普通匹配成功后,还是会继续正则匹配,一旦正则匹配也匹配成功后,以正则匹配为准。但是除^~和=除外,即^~和=匹配成功后,不再继续正则匹配。

反向代理

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内核参数调优:

  1. nginx进程数,一般跟cpu核数相同或为它的倍数,所以建议按照cpu数目来指定。

    worker_processes 8;

  2. 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;



微信号:kelicom QQ群:215861553 紧急求助须知
Win32/PHP/JS/Android/Python