Logout

Nginx配置

安装


日志

# 定义日志格式 zym0329F
log_format zym0329F '$remote_addr - $remote_user [$time_local] "$server_name:$server_port" "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
# 使用 zym0329F 来记录访问日志
access_log /zym/z-log/nginx/access.log zym0329F;

变量查询http://nginx.org/en/docs/varindex.html

$remote_addr变量:记录了客户端的IP地址(普通情况下)。 $remote_user变量:当nginx开启了用户认证功能后,此变量记录了客户端使用了哪个用户进行了认证。 $time_local变量:记录了当前日志条目的时间。 $request变量:记录了当前http请求的方法、url和http协议版本。(不含主机名和端口) $status变量:记录了当前http请求的响应状态,即响应的状态码,比如200、404等响应码,都记录在此变量中。 $body_bytes_sent变量:记录了nginx响应客户端请求时,发送到客户端的字节数,不包含响应头的大小。 $http_referer变量:记录了当前请求是从哪个页面过来的,比如你点了A页面中的超链接才产生了这个请求,那么此变量中就记录了A页面的url。 $http_user_agent变量:记录了客户端的软件信息,比如,浏览器的名称和版本号。 $server_addr:服务器端地址,需要注意的是:为了避免访问linux系统内核,应将ip地址提前设置在配置文件中。 $server_name:服务器名,www.cnphp.info $server_port:服务器端口 $document_root:当前请求的文档根目录或别名 $document_uri:同 $uri $scheme:请求使用的Web协议, “http” 或 “https”

取消记录favicon.ico的404错误日志 log_not_found on|off默认为on。 启用或禁用404错误日志,这个指令可以用来禁止nginx记录找不到rebots.txt或favicon.ico这类文件的错误信息

location  = /favicon.ico{  
    log_not_found     off; #404错误
    access_log     off;    #访问日志
}

基本

Nginx路径 whereis nginx 启动停止 nginx -s reload/stop 检查配置文件是否出错 nginx -t 以制定文件运行 nginx -c /etc/nginx/nginx.conf /etc/nginx/nginx.conf * 仅用域名访问,禁止使用ip访问

if ($host != 'ming1zhan.xyz'){
    return 444;
} 

$request_method 请求方式 POST GET $request_uri 请求路径 $host 主机 $port 端口 * nagle算法 nginx中是否打开nagle算法,要取决于业务场景。比如在实验中看到: (1)tcp_nodelay off,会增加通信的延时,但是会提高带宽利用率。在高延时、数据量大的通信场景中应该会有不错的效果 (2)tcp_nodelay on,会增加小包的数量,但是可以提高响应速度。在及时性高的通信场景中应该会有不错的效果


配置语法

location

语法规则

location [ = | ~ | ~* | ^~ ] uri { ... } location @name { ... }

  • 语法规则很简单,一个location关键字,后面跟着可选的修饰符,后面是要匹配的字符,花括号中是要执行的操作。

  • 修饰符 = 表示精确匹配。只有请求的url路径与后面的字符串完全相等时,才会命中。 ~ 表示该规则是使用正则定义的,区分大小写。 ~* 表示该规则是使用正则定义的,不区分大小写。 ^~ 表示如果该符号后面的字符是最佳匹配,采用该规则,不再进行后续的查找。

  • 匹配过程 对请求的url序列化。例如,对%xx等字符进行解码,去除url中多个相连的/,解析url中的.,..等。这一步是匹配的前置工作。 location有两种表示形式,一种是使用前缀字符,一种是使用正则。如果是正则的话,前面有~或~*修饰符。

具体的匹配过程如下 首先先检查使用前缀字符定义的location,选择最长匹配的项并记录下来。 如果找到了精确匹配的location,也就是使用了=修饰符的location,结束查找,使用它的配置。 然后按顺序查找使用正则定义的location,如果匹配则停止查找,使用它定义的配置。 如果没有匹配的正则location,则使用前面记录的最长匹配前缀字符location。 基于以上的匹配过程,我们可以得到以下两点启示: 使用正则定义的location在配置文件中出现的顺序很重要。因为找到第一个匹配的正则后,查找就停止了,后面定义的正则就是再匹配也没有机会了。 使用精确匹配可以提高查找的速度。例如经常请求 /的话,可以使用 =来定义location。

location = / {
    [ configuration A ]
}
location / {
    [ configuration B ]
}
location /user/ {
    [ configuration C ]
}
location ^~ /images/ {
    [ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}

请求/精准匹配A,不再往下查找。

请求/index.html匹配B。首先查找匹配的前缀字符,找到最长匹配是配置B,接着又按照顺序查找匹配的正则。结果没有找到,因此使用先前标记的最长匹配,即配置B。

请求/user/index.html匹配C。首先找到最长匹配C,由于后面没有匹配的正则,所以使用最长匹配C。 请求/user/1.jpg匹配E。首先进行前缀字符的查找,找到最长匹配项C,继续进行正则查找,找到匹配项E。因此使用E。

请求/images/1.jpg匹配D。首先进行前缀字符的查找,找到最长匹配D。但是,特殊的是它使用了^~修饰符,不再进行接下来的正则的匹配查找,因此使用D。这里,如果没有前面的修饰符,其实最终的匹配是E。大家可以想一想为什么。

请求/documents/about.html匹配B。因为B表示任何以/开头的URL都匹配。在上面的配置中,只有B能满足,所以匹配B。

  • URL尾部的 /需不需要 关于URL尾部的 /有三点也需要说明一下。第一点与location配置有关,其他两点无关。

    • location中的字符有没有 /都没有影响。也就是说 /user/和 /user是一样的。
    • 如果URL结构是 https://domain.com/的形式,尾部有没有 /都不会造成重定向。因为浏览器在发起请求的时候,默认加上了 /。虽然很多浏览器在地址栏里也不会显示 /。这一点,可以访问baidu验证一下。
    • 如果URL的结构是 https://domain.com/some-dir/。尾部如果缺少 /将导致重定向。因为根据约定,URL尾部的 /表示目录,没有 /表示文件。所以访问 /some-dir/时,服务器会自动去该目录下找对应的默认文件。如果访问 /some-dir的话,服务器会先去找 some-dir文件,找不到的话会将 some-dir当成目录,重定向到 /some-dir/,去该目录下找默认文件。可以去测试一下你的网站是不是这样的。

alias和root

  • nginx指定文件路径有两种方式root和alias,这两者的用法区别,使用方法总结了下,方便大家在应用过程中,快速响应。root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上。

[root] 语法:root path 默认值:root html 配置段:http、server、location、if

[alias] 语法:alias path 配置段:location

root实例:

location ^~ /t/ {
    root /www/root/html/;
}

如果一个请求的URI是/t/a.html时,web服务器将会返回服务器上的/www/root/html/t/a.html的文件。

location ^~ /t/ {
alias /www/root/html/new_t/;
}

如果一个请求的URI是/t/a.html时,web服务器将会返回服务器上的/www/root/html/new_t/a.html的文件。注意这里是new_t,因为alias会把location后面配置的路径丢弃掉,把当前匹配到的目录指向到指定的目录。

  • 注意:
  1. 使用alias时,目录名后面一定要加"/"。
  2. alias在使用正则匹配时,必须捕捉要匹配的内容并在指定的内容处使用。
  3. alias只能位于location块中。(root可以不放在location中)

rewrite

路径重写

rewrite regex replacement[flag];

  • 把regex改写成replacement发送出去,其中( )中的内容用$加序号引用 下例中,括号内容为(.*\.php?) $1指第一个括号内容,即为(.*\.php?)
location ~ ^/kod0/.*\.php$ {  
    root     /zym/;         
    rewrite /kod0/(.*\.php?) /zData/kod/$1 break;   
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
    include        fastcgi_params;                      
} 
location  /kod0/  {
    alias     /zym/zData/kod/;   
    index   index.php;  
}

flag 可选

标记符号 说明
last 本条规则匹配完成后继续向下匹配新的location URI规则
break 本条规则匹配完成后终止,不在匹配任何规则
redirect 返回302临时重定向
permanent 返回301永久重定向

常用正则表达式:

字符 描述
\ 将后面接着的字符标记为一个特殊字符或者一个原义字符或一个向后引用
^ 匹配输入字符串的起始位置
$ 匹配输入字符串的结束位置
* 匹配前面的字符零次或者多次
+ 匹配前面字符串一次或者多次
? 匹配前面字符串的零次或者一次
. 匹配除“\n”之外的所有单个字符
(pattern) 匹配括号内的pattern

proxy模块

fastcgi

$docment_root由当前location的root决定 SCRIPT_FILENAME $document_root$fastcgi_script_name 指示处理文件的路径+文件名 fastcgi_param PHP_VALUE "open_basedir=$document_root:/zym/zData/CT-Download/:/tmp/"; 为php设置允许打开的目录,只针对该server有效 或在php.ini 或定义了include fastcgi.conf;后,在fastcgi.conf中加入 fastcgi_param PHP_VALUE "open_basedir=$document_root:/tmp/:/proc/";

自定义404页面

error_page语法:

error_page code [ code... ] [ = | =answer-code ] uri | @named_location

使用在http, server, location, location 中的if字段 优先级问题 location段中的error_page优先级高于server段中 修改404、405等状态的返回页面或返回链接

error_page   404 403 500 502 503 504  /40x1.html;
#或链接 error_page   404 403 500 502 503 504  https://www.google.com/ncr;
location = /40x1.html {
    root   /zym/test;
    #错误页存放位置
}

error_page 404 /404.html 请求不能解析的 http://domain.com/123 必须有斜杠,返回的页面才不会改变,URI不变 如果没有斜杠,则返回 http://domain.com/404.html error_page 404 XXX 或将Location写成

location ^~ /XXX
alias /  ...
index 404.html;

或设置一个named location,然后在里边做对应的处理。

error_page 500 502 503 504 @jump_to_error;
location @jump_to_error {    
    proxy_pass http://backend;
}
  • 实际产生了一个内部跳转(internal redirect),如果找不到40x.html页面,则会不停返回302,

    Status Code:302 Moved Temporarily

  • 自定义的404页面文件大小如果小于512字节,那么IE内核的浏览器会认为你自定义的404页面不够权威,从而使用其自带的404页面代替

  • 如果使用了proxy模块,例如后台Tomcat处理报错抛出404,想把这个状态叫Nginx反馈给客户端或者重定向某个连接,则需要加proxy_intercept_errors on; ,可以出现在http, server, location段
  • 如果后端是php解析的,则需要加fastcgi_intercept_errors on; ,可以出现在http, server, location段
Nginx 自定义404错误页面配置中有无等号的区别
  • error_page 404 /404.html 可显示自定义404页面内容,正常返回404状态码。
  • error_page 404 = /404.html 可显示自定义404页面内容,但返回200状态码。
  • error_page 404 /404.php 如果是动态404错误页面,包含 header 代码(例如301跳转),将无法正常执行。正常返回404代码。
  • error_page 404 = /404.php 如果是动态404错误页面,包含 header 代码(例如301跳转),加等号配置可以正常执行,返回php中定义的状态码。但如果php中定义返回404状态码,404状态码可以正常返回,但无法显示自定义页面内容(出现系统默认404页面),这种情况可以考虑用410代码替代( header("HTTP/1.1 410 Gone"); 正常返回410状态码,且可正常显示自定义内容)。
设置了limit_req的流量限制,返回操作频繁

由于在nginx配置中,设置了limit_req的流量限制,导致许多请求返回503错误代码,在限流的条件下,为提高用户体验,希望返回正常Code 200,且返回操作频繁的信息:

location  /test {
  ... 
  limit_req zone=zone_ip_rm burst=1 nodelay; 
  error_page 503 =200 /dealwith_503?callback=$arg_callback;
}
location /dealwith_503{ 
  set $ret_body '{"code": "V00006","msg": "操作太频繁了,请坐下来喝杯茶。"}';
   if ( $arg_callback != "" ) 
   { 
       return 200 'try{$arg_callback($ret_body)}catch(e){}'; 
   } 
   return 200 $ret_body; 
}
444状态

444 No Response Nginx上HTTP服务器扩展。服务器不向客户端返回任何信息,并关闭连接(有助于阻止恶意软件)

error_page 500 502 503 504 =444 @blackhole;
location @blackhole {
    return 444;
}

根据不同的需要,对不同location的状态进行返回

locationg /test1{
    error_page 403 @testerror;
}
locationg /test2{
    error_page 404 @testerror;
}
locationg /test3{
    error_page 401 @testerror;
}
location @testerror {
    return 444;
}

使用了httpd的认证模块,返回状态码为401,如果重定向则不能使用认证(webdav)

开启https的端口,如果使用http进行访问,会返回400,实际内部错误码为497,可用error_page进行捕获,返回特定页面

WEBDAV

nginx增加webdav功能需要添加dav-ext-module 是第三方模块,因此需要重新编译; 下载的dav-ext-module是.c文件,所以需要GCC-c++编译器 1. 获取nginx源码 wget http://nginx.org/download/nginx-1.16.1.tar.gz 链接是nginx管网的 http://nginx.org/en/download.html 解压tar -xvzf

  1. 下载nginx-dav-ext-module wget -P /zym https://github.com/arut/nginx-dav-ext-module/archive/v3.0.0.tar.gz 解压tar -xvzf

  2. 安装gcc编译器 yum -y install gcc gcc-c++ autoconf automake make 或 yum -y install gcc-c++ gcc -v 显示 c compiler not found.. 方式一:./configure --with-cc=/usr/bin/gcc 指定gcc编译器位置 如果还不行采用方式二: 已经按照好gcc之后还是会显示 C compiler gcc is not found问题,尝试了网上很多安装gcc的方法都不可用。

    1. 原因分析: configure首先会编译一个小测试程序,通过测试其运行结果来判断编译器是否能正常工作,由于交叉编译器所编译出的程序是无法在编译主机上运行的,故而产生此错误。
    2. 解决办法: 编辑nginx/auto/cc/name文件,将文件中的“exit 1”注释掉(令测试程序不会报错)
  3. 产生htpasswd文件

  4. nginx -V 显示的configure 把--prefix之前的去掉 从--prefix开始

    ./configure --prefix=/zym/nginx ................ --add-module=/zym/nginx-dav- ext-module-3.0.0 完了以后再make 根据报错安装报,可能PCRE库、OpenSSL库、HTTP XSLT模块系统缺少libxml2 / libxslt库、HTTP image filter模块缺少GD库、缺少Perl模块ExtUtils

  5. 备份替换

server {
    listen 2096 ssl;
    server_name 46.17.41.6;
    client_max_body_size  500m;
    root /zym/zData;              
#webdav
    location / {
        client_body_temp_path /zym/zData;
        autoindex on;
        dav_methods  PUT DELETE MKCOL COPY MOVE;
        dav_ext_methods PROPFIND OPTIONS;
        create_full_put_path   on;
        dav_access             group:rw  all:r;
        auth_basic "Authorized Users Only";
        auth_basic_user_file /etc/nginx/.htpasswd;
    }
}

注意: 对 401 状态进行更改,则不能进行认证 对 403,404 状态进行更改,否则无法使用goodsync


SSL

openssl使用和自签名证书

生成密钥对

openssl genrsa [-out filename] [-passout arg] [-f4] [-3] [-rand file(s)] [-engine id] [numbits] [-des] [-des3] [-idea] numbits 密钥长度(单位bit)越长越安全

usage: genrsa [args] [numbits]
 -des            encrypt the generated key with DES in cbc mode(使用des加密算法加密RSA密钥对)
 -des3           encrypt the generated key with DES in ede cbc mode (168 bit key) (使用des3加密算法加密RSA密钥对)
 -aes128, -aes192, -aes256
                 encrypt PEM output with cbc aes (使用aes加密算法加密RSA密钥对)
 -out file       output the key to 'file(输出密钥对文件)
 -passout arg    output file pass phrase source (输出密钥文件的口令)
 -f4             use F4 (0x10001) for the E value (使用F4作为公钥的E参数,默认为该选项)
 -3              use 3 for the E value (使用3作为公钥的E参数)
 -engine e       use engine e, possibly a hardware device. (使用第三方设备生成密钥对)
 -rand file:file:...    (手动指定随机数文件)
                 load the file (or the files in the directory) into the random number generator

案例: 1. openssl genrsa -out rsakey.pem 2048
生成一个2048位的密钥对,注:没有对密钥进行加密操作。 2. openssl genrsa -aes128 -out rsakey.pem -passout pass:111111 2048
生成一份2048位的密钥对,并对密钥对使用aes算法加密,密钥口令为111111,如果没有-passout pass参数会在接下来提示输入密码

说明:openssl生成的公钥与私钥默认被存放在一个文件中,当需要提取公钥或私钥时需要使用rsa命令,她可以用来管理密钥文件。

提取公钥
rsa [options] outfile
where options are
 -inform arg     input format - one of DER NET PEM (输入的密钥编码格式,可以是DER、NET、PEM中的一个,默认为PEM)
 -outform arg    output format - one of DER NET PEM (输出的密钥编码格式)
 -in arg         input file (输入的密钥文件名称)
 -sgckey         Use IIS SGC key format (使用SGC格式,一般很少用到)
 -passin arg     input file pass phrase source (输入密钥文件时提供的密钥文件口令)
 -out arg        output file (输出的密钥文件名)
 -passout arg    output file pass phrase source (输出密钥文件时的口令)
 -des            encrypt PEM output with cbc des (使用des算法对密钥进行加密)
 -des3           encrypt PEM output with ede cbc des using 168 bit key (使用des3算法对密钥进行加密)
 -aes128, -aes192, -aes256
                 encrypt PEM output with cbc aes  (使用aes算法对密钥进行加密)
 -text           print the key in text (明文输出密钥参数)
 -noout          don't print key out (不输出密钥到文件)
 -modulus        print the RSA key modulus (输出RSA密钥模值)
 -check          verify key consistency
 -pubin          expect a public key in input file (默认输入的是密钥对的私钥,使用pubin输入的是密钥的公钥)
 -pubout         output a public key (输出公钥到文件)
 -engine e       use engine e, possibly a hardware device. (使用第三方设备)

案例: * openssl rsa -in 001.pem -out 002.pem -passin pass:12345 输入密钥文件001.pem,提取其中的公钥文件到002.pem,解密密码为-passin pass:如果没有该参数,会提示输入密码

使用密钥
Usage: rsautl [options]
-in file        input file  (输入准备要进行加密或解密的文件)
-out file       output file  (输出加密或解密后的文件)
-inkey file     input key  (输入密钥文件)
-keyform arg    private key format - default PEM (指定密钥文件格式)
-pubin          input is an RSA public (说明输入的是公钥)
-certin         input is a certificate carrying an RSA public key (指明输入的是一个证书)
-ssl            use SSL v2 padding  (数据补齐方式,默认是pkcs)
-raw            use no padding   (数据补齐方式,默认是pkcs)
-pkcs           use PKCS#1 v1.5 padding (default) (数据补齐方式,默认是pkcs)
-oaep           use PKCS#1 OAEP   (数据补齐方式,默认是pkcs)
-sign           sign with private key  (进行数字签名,即使有私钥加密)
-verify         verify with public key  (进行数字签名验证,即使有公钥解密)
-encrypt        encrypt with public key (进行解密操作)
-decrypt        decrypt with private key  (进行解密操作)
-hexdump        hex dump output  (输出十六进制格式)
-engine e       use engine e, possibly a hardware device.
-passin arg    pass phrase source  (口令参数)
  • 注:使用RSA进行加密操作时,要求被加密的数据长度与RSA密钥长度一致,但数据大小是不定的,所以当文件数据小于RSA密钥长度时会采用数据补齐,当被加密的文件大于密钥长度时,会被先切割为等长大小的数据块,进行加密操作。

案例: 1. openssl rsautl -in install.log -out bak.log inkey 002.pem -pubin -encrypt 使用我们上面案例中生成的002.pem密钥对这个文件进行加密,因为使用了pubin选项,所以使用的是公钥加密。 2. openssl rsautl -in bak.log -out install.log -inkey 001.pem -decrypt 使用001.pem密钥中的私钥对文件进行解密。

:实际应用中很少会使用非对称加密算法对大的文件进行加密操作,而是使用对称加密算法加密文件,然后再使用<非对称加密算法>对<对称算法的密钥>进行加密。

生成证书请求和自签名证书

在证书申请签发过程中,涉及到密钥、证书请求、证书这几个概念。一般流程下,由客户端或服务运营者或网站管理向CA申请证书。步骤如下: 1. 生成客户端的密钥,即客户端的公私钥对,且要保证私钥只有客户端自己拥有。

  1. 以客户端的密钥和客户端自身的信息(国家、机构、域名、邮箱等)为输入,生成证书请求文件。其中客户端的公钥和客户端信息是明文保存在证书请求文件中的,而客户端私钥的作用是对客户端公钥及客户端信息做签名,自身是不包含在证书请求中的。然后把证书请求文件发送给CA机构。

  2. CA机构接收到客户端的证书请求文件后,首先校验其签名,然后审核客户端的信息,最后CA机构使用自己的私钥为证书请求文件签名,生成证书文件,下发给客户端。此证书就是客户端的身份证,来表明用户的身份,接收者可以使用CA公钥验证是否来自CA。

* 在https握手阶段,服务器首先把自己的证书发送给用户(浏览器),浏览器查看证书中的发证机构,然后在机器内置的证书中(在PC或者手机上,内置了世界上著名的CA机构的证书)查找对应CA证书,然后使用内置的证书公钥校验服务器的证书真伪。如果校验失败,浏览器会提示服务器证书有问题,询问用户是否继续。

自签名证书即是把上述第三步改为自己签发。

req的基本功能主要有两个:生成证书请求和生成自签名证书。其他还有一些校验、查看请求文件等功能,示例会简单说明下。参数说明如下: * [new/x509] 当使用-new选取的时候,说明是要生成证书请求,当使用-x509选项的时候,说明是要生成自签名证书。

  • [/key/newkey/keyout] key和newkey是互斥的,key是指定已有的密钥文件,而newkey是指在生成证书请求或者自签名证书的时候自动生成密钥,然后生成的密钥名称有keyout参数指定。

  • [in/out/inform/outform/keyform] in选项指定证书请求文件,当查看证书请求内容或者生成自签名证书的时候使用 out选项指定证书请求或者自签名证书文件名,或者公钥文件名(当使用pubkey选项时用到),以及其他一些输出信息。 inform、outform、keyform分别指定了in、out、key选项指定的文件格式,默认是PEM格式。 当指定newkey选项时,后面指定rsa:bits说明产生rsa密钥,位数由bits指定。指定dsa:file说明产生dsa密钥,file是指生成dsa密钥的参数文件(由dsaparam生成)

  • [config] 参数文件,默认是/etc/ssl/openssl.cnf(ubuntu12.04),根据系统不同位置不同。该文件包含生成req时的参数,当在命令行没有指定时,则采用该文件中的默认值。

主要就是说在生成证书请求的过程中,可以先生成密钥再根据密钥生成证书请求,也可以一步到位,全部一次生成。

摘自SSL

cd /etc/nginx/key/
openssl genrsa -des3 -out 001.pem -passout pass:12345 2048  //生成密钥对
openssl rsa -in 001.pem -out 002.pem -passin pass:12345     //提取公钥
rm 001.pem                                                  //删除密钥对
openssl req -new -key 002.pem -out ssl.csr
//根据这个公钥文件生成证书请求文件
openssl x509 -req -days 365 -in ssl.csr -signkey 002.pem -out ssl.crt
//最后根据这2个文件(002.pem ssl.csr)生成crt证书文件

nginx配置

主要是对ssl_protocols加密协议 和 ssl_ciphers加密算法 进行配置 原有配置

server { 
    listen 50525 ssl;           
    # 把 ssl on 改成 listen 443 ssl
    server_name 46.17.41.6;

    ssl_certificate /etc/nginx/key/ssl.crt;
    ssl_certificate_key /etc/nginx/key/002.pem;
    ssl_session_timeout 5m;
    ssl_protocols SSLv2 SSLv3 TLSv1;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;

    location {
    ...
    }
}

推荐配置 mozilla wiki

listen 443 ssl http2; //支持http/2
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

支持Http2协议

  1. 要开启HTTP/2协议支持,需要在Nginx 1.10以上版本并且需要OpenSSL库的版本在1.0.2以上编译。

  2. HTTP 2.0只支持开启了https的网站。

  • 查看当前OpenSSL版本方法: 需要OpenSSL库的版本在1.0.2以上 openssl version 这里的版本正好是1.0.2 满足要求。 nginx version: nginx/1.14.1 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) built with OpenSSL 1.0.2k-fips 26 Jan 2017

增加编译http2模块http_v2_module 查看nginx原有的模块nginx -V 切换到源码包下cd /opt/software/nginx-1.14.1 编译在原来的模块的基础上 ./configure ...(复制原来的) --with-http_v2_module 配置完成后,运行命令make 备份原有已安装好的nginx cp /.../nginx /.../nginx-bak 找到nginx master的进程ps -ef |grep nginx 关闭nginx master进程,修改pid的参数kill -QUIT [nginx master pid] 覆盖掉原有的 Nginx,验证./nginx -V 开启 listen 443 http2; 验证是否成功

解决问题

nginx+php-fpm内存占用高

需要了解的参数是:pm、pm.max_childrenpm.start_serverspm.min_spare_serverspm.max_spare_servers。 pm:表示使用那种方式,有两个值可以选择,就是static(静态)或者dynamic(动态)。

下面5个参数的意思分别为: pm = dynamic 如何控制子进程,选项有static和dynamicpm.max_children:静态方式下开启的php-fpm进程数量 pm.max_requests:php-fpm子进程能处理的最大请求数 pm.start_servers:动态方式下的起始php-fpm进程数量 pm.min_spare_servers:动态方式下的最小php-fpm进程数 pm.max_spare_servers:动态方式下的最大php-fpm进程数量 区别: * 如果dm设置为 static,那么其实只有pm.max_children这个参数生效。系统会开启设置数量的php-fpm进程。

  • 如果dm设置为 dynamic,那么pm.max_children参数失效,后面3个参数生效。 系统会在php-fpm运行开始 的时候启动pm.start_servers个php-fpm进程, 然后根据系统的需求动态在pm.min_spare_serverspm.max_spare_servers之间调整php-fpm进程数。

  • 服务器具体配置 对于我们的服务器,选择哪种执行方式比较好呢?事实上,跟Apache一样, 运行的PHP程序在执行完成后,或多或少会有内存泄露的问题。这也是为什么开始的时候一个php-fpm进程只占用3M左右内存,运行一段时间后就会上升到20-30M的原因了。

对于内存大的服务器(比如8G以上)来说,指定静态的max_children实际上更为妥当,因为这样不需要进行额外的进程数目控制,会提高效率。因为频繁开关php-fpm进程也会有时滞,所以内存够大的情况下开静态效果会更好。

数量也可以根据 内存/30M 得到,比如8GB内存可以设置为100,那么php-fpm耗费的内存就能控制在 2G-3G的样子。

如果内存稍微小点,比如1G,那么指定静态的进程数量更加有利于服务器的稳定。这样可以保证php-fpm只获取够用的内存,将不多的内存分配给其他应用去使用,会使系统的运行更加畅通。

对于小内存的服务器来说,比如256M内存的VPS,即使按照一个20M的内存量来算,10个php-cgi进程就将耗掉200M内存,那系统的崩溃就应该很正常了。

因此应该尽量地控制php-fpm进程的数量,大体明确其他应用占用的内存后, 给它指定一个静态的小数量,会让系统更加平稳一些。或者使用动态方式, 因为动态方式会结束掉多余的进程,可以回收释放一些内存,所以推荐在内存较少的服务器或VPS上使用。具体最大数量根据 内存/30M 得到。

pm.start_servers 缺省值计算公式: min_spare_servers + (max_spare_servers - min_spare_servers) / 2

比如说512M的VPS,加入分配给php-fpm最大250M,建议pm.max_spare_servers设置为250/30 ,约为8。至于pm.min_spare_servers,则建议根据服务器的负载情况来设置,比如服务器上只是部署php环境的话,比较合适的值在2~5之间。

这里面还有一个问题,php-fpm因为一些第三方库可能会引起内存泄漏,时间长了,占用的内存会比较多,像我们的服务器现在就是50m左右,还好,有pm.max_requests这个参数,这个参数指定了一个php-fpm子进程执行多少次之后重启该进程。这个可能就要根据你的实际情况调整了。

我的服务器配置 硬盘:系统盘20G 内存:512M CPU:1核 系统:CentOS 6.5 64位 带宽:独享1M

部署的应用 Nginx PHP Mysql

优化后的参数 编辑/usr/local/php/etc/php-fpm.conf:

pm = dynamic
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 8

http转https

https://blog.csdn.net/wzy_1988/article/details/8549290

nginx的rewrite方法
nginx的497状态码
index.html刷新网页