wordpress上传文件超过了站点的最大上传限制--迅速解决!

劳整理+详细记录:十部高分印度悬疑电影推荐,反转+烧脑

改php和nginx 的配置文件:

php相关就是 php.ini

file_uploads = on ;
upload_max_filesize = 20M;
post_max_size = 20; post上限,一般来说,post_max_size设置要比upload_max_filesize稍大一些
还需要根据实际情况调整下面的选项
max_execution_time = 180; 脚本最大执行时间(秒),过短会导致文件还没上传完脚本就停止了
max_input_time = 180; 请求最大传输时间,过短会导致文件还没上传完传输就停止了
memory_limit = 128M; 内存上限

nginx相关就是nginx.conf
nginx 如果上传文件时超过了nginx限制,就会返回一个“413 Request Entity Too Large”的错误
在http{}中添加一个client_max_body_size 20m;配置项;

ngx-fancyindex 代替 autoindex 实现索引目录美化,而且可以加长显示文件名长度。

nginx

ngx-fancyindex 代替 autoindex 实现索引目录美化,而且可以加长显示文件名长度。
本文为已安装 Nginx 环境下的操作。
安装ngx-fancyindex
第一步
查看已安装的 Nginx 版本与模块信息:
nginx -V
输出信息类似于:
nginx version: nginx/1.8.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --user=nginx --group=nginx
第二步
下载对应版本的 Nginx 源码包: http://nginx.org/download/
下载最新版本的 ngx-fancyindex 源码包: https://github.com/aperezdc/ngx-fancyindex/releases
上传至服务器并解压,这里我们上传到/tmp目录。
第三步
编译 Nginx
cd /tmp/nginx-1.8.0 #进入源码目录
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --user=nginx --group=nginx --add-module=../ngx-fancyindex-0.4.4
make #编译
特别注意:
./configure后面的配置要对应第一步的输出信息,防止不必要的麻烦,–add-module=../ngx-fancyindex-0.4.4 这里根据你下载解压后的 ngx-fancyindex 目录名来。
只需要 make,不需要 install.
第四步
重命名旧的 nginx 文件:
mv /usr/sbin/nginx /usr/sbin/nginx.bak
复制重新编译的nginx文件到nginx原来安装目录下:
cp ./objs/nginx /usr/sbin/
重新启动 nginx 服务:
service nginx restart
配置ngx-fancyindex
修改nginx配置文件
location /path/ #指定~/path目录开启自动列目录
{
alias /alliot/path/; #虚拟目录/alliot/path/开启自动列目录
root /path/; #实际目录/path/开启自动列目录 与alias二选一
fancyindex on; #开启nginx目录浏览功能
fancyindex_name_length 500; 配置可显示的文件名长度
fancyindex_exact_size off; #文件大小从KB开始显示
fancyindex_localtime on; #显示文件修改时间为服务器本地时间
fancyindex_footer "footer.html"; #设置footer为当前目录下的footer.html
fancyindex_ignore "footer.html"; #设置不列出当前目录下的footer.html
}
location /path/ #指定~/path目录开启自动列目录
{
alias /alliot/path/; #虚拟目录/alliot/path/开启自动列目录
root /path/; #实际目录/path/开启自动列目录 与alias二选一
fancyindex on; #开启nginx目录浏览功能
fancyindex_exact_size off; #文件大小从KB开始显示
fancyindex_localtime on; #显示文件修改时间为服务器本地时间
fancyindex_footer "footer.html"; #设置footer为当前目录下的footer.html
fancyindex_ignore "footer.html"; #设置不列出当前目录下的footer.html
}
上面 alias 与 root 的区别在于, alias 指定的是当前目录,而 root 指定的是根目录,一般情况下,建议在 “location /” 中通过root命令来配置根目录。

CentOS6.x/7.x版本下yum安装nginx+php7+mysql5.5环境

linux干货

1.安装nginx
修改yum源
vim /etc/yum.repos.d/nginx.repo

#写入如下内容
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
查看yum源中的nginx版本

yum list nginx
安装nginx

yum -y install nginx
查看安装的版本

[root@moneyslow.com ~]# nginx -v
nginx version: nginx/1.14.2
命令

#启动
service nginx start
#重启
service nginx restart
#停止
service nginx stop
#设置开机启动
chkconfig nginx on
nginx详细配置请移步(nginx的configure参数,配置文件,虚拟主机配置,信号控制)
2.安装php
安装yum源

#CentOS 7
先装epel:
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
再:
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
#CentOS 6
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
rpm -ivh epel-release-6-8.noarch.rpm
rpm -ivh remi-release-6.rpm
修改源(需要哪个改哪个,下面是7.1)

vim /etc/yum.repos.d/remi.repo
#将 [remi] 段中的 enabled=0 改为 enabled=1
vim /etc/yum.repos.d/remi-php71.repo
#将 [remi-php71] 段中的 enabled=0 改为 enabled=1
查看将要yum安装的php版本

yum list php
安装php及一些常用扩展

yum -y install php php-fpm php-cli php-pdo php-mysql php-gd php-bcmath php-xml php-mbstring php-mcrypt php-redis
命令

# 版本
[root@moneyslow.com ~]# php -v
PHP 7.1.25 (cli) (built: Dec 8 2018 14:07:15) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies......
# 扩展
php -m
#php-fpm命令
# 启动
service php-fpm start
# 重启
service php-fpm restart
# 停止
service php-fpm stop
#设置开机启动
chkconfig php-fpm on

3.安装mysql
查看mysql版本

yum list mysql-server
安装mysql

yum -y install mysql-server
设置开机启动

chkconfig mysqld on
启动mysql服务

service mysqld start
设置MySQL的root用户密码

#登录mysql
[root@moneyslow.com ~]# mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.62 MySQL Community Server (GPL) by Remi......
#查询当前所有用户
mysql> select user,host,password from mysql.user;
#设置root用户密码为root
mysql> set password for root@localhost=password('root');
#退出
mysql> exit
#重新登录
[root@moneyslow.com ~]# mysql -uroot -proot

nginx配置https证书错误NSS error -5938 (PR_END_OF_FILE_ERROR)

https证书验证方式

奇葩了,有时候配置https证书的时候,啥都对,就是访问不了。

通过curl来检查:
curl http://www.moneyslow.com -vv
会出现NSS error -5938 (PR_END_OF_FILE_ERROR)的错误。

  • Initializing NSS with certpath: sql:/etc/pki/nssdb
  • CAfile: /etc/pki/tls/certs/ca-bundle.crt
    CApath: none
  • NSS error -5938 (PR_END_OF_FILE_ERROR)
  • Encountered end of file


从网络搜索答案,无非是防火墙443端口,update nss 之类的方法,不解决问题。
细细想了一下,最近http2也出过问题

2018年11月9日,阿里云云盾应急响应中心监测到Nginx近日发布安全更新,披露了三个可能导致服务器拒绝服务的漏洞:CVE-2018-16843、CVE-2018-16844和CVE-2018-16845。位于Nginx HTTP/2 模块和流媒体MP4模块中。攻击者通过构造特定的恶意HTTP请求,可远程DoS服务器。
漏洞详情:http://nginx.org/en/security_advisories.htmlhttp://tengine.taobao.org/changelog_cn.html#2_2_3
CVE-2018-16843、CVE-2018-16844漏洞存在于ngx_http_v2_module模块之中(默认情况下不编译,编译时需要开启--with-http_v2_module,同时将listen http2添加到配置文件中),当用户添加http2支持时,攻击者可以发送特制的HTTP/2请求,消耗CPU和内存资源,最终导致服务器DoS。CVE-2018-16845漏洞存在于ngx_http_mp4_module模块中,当Nginx处理恶意的MP4文件时会导致处理进程无限循环、崩溃或者内存泄露,造成服务器DoS。
影响范围
主线版本:< 1.15.6
稳定版本:< 1.14.1
风险评级
CVE-2018-16843:高危
CVE-2018-16844:高危
CVE-2018-16845:高危
修复建议
注:漏洞修复要求的技术专业度较高,建议先备份服务器镜像再做升级操作
方案一:
升级至Nginx最新安全版本(1.15.6或1.14.1),官方下载链接:http://nginx.org/en/download.html
方案二:
针对CVE-2018-16843和CVE-2018-16844漏洞,可采取禁用HTTP/2协议(可能导致服务不可用),使用到HTTP/2协议的配置类似如下:
server {
listen 443 ssl http2 default_server;
server_name localhost;
ssl_certificate /path/to/public.crt;
ssl_certificate_key /path/to/private.key;
检查Nginx配置文件中是否使用到http2参数,如没有,则不受漏洞影响。
方案三:
针对使用Tengine的建议使用官方最新版本修复漏洞:http://tengine.taobao.org/changelog_cn.html#2_2_3

所以要先试试升级nginx,从1.12 升级 到1.16,一个命令就搞定了:
yum update nginx

果然好了。

400 bad request The plain HTTP request was sent to HTTPS port解决办法

nginx

现象:https可以访问,但是http报400 bad request错误。
看报错:

400 bad request The plain HTTP request was sent to HTTPS port解决办法
The plain HTTP request was sent to HTTPS port

本以为是个牛逼的配置,没想到报错了。
先查400状态码的解释,HTTP/1.1对400 Bad Request的定义:
1、语义有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求。
2、请求参数有误。

这就很好理解了,我们又没有参数,肯定是第一个原因,我们试图通过HTTP访问网站,这个请求被重定向到HTTPS。
if ($ssl_protocol = "") {
rewrite ^ https://$server_name$request_uri? permanent;
}
Nginx的配置里是有“ssl on”这一条的,所以肯定使用SSL交互,但是你的request都是HTTP请求,所以就是bad request,于是就是80的请求无法被服务器的443理解。

so,把nginx里的ssl on注释掉,问题解决。


2019年11月2日更新:

最新情况发现,按照以上的解决办法简单注释ssl on,并没有效果,如果用chrome浏览器打开隐私窗口,访问https页面,依据报400错误。用curl来验证:

$ curl -I http://moneyslow.com

HTTP/1.1 400 Bad Request

Server: nginx/1.14.0 (Ubuntu)

Date: Sat, 02 Nov 2019 03:09:46 GMT

Content-Type: text/html

Content-Length: 280

Connection: close

header返回400错误依旧。

实际上,解决方法非常简单。在“listen”字符串下的服务器部分,我只需要添加:

错误页面 497 跳到 https://$host:$server_port$request_uri;

497代码的意思:发送到https端口的http请求,error_page处理此代码并重定向到https://$host:$server_port$request_uri;

这里有3个变量的解释:

$host是表示运行nginx的主机名的保留变量。

$server_port 是监听端口,默认可以不写。

$request-uri是完整的原始请求uri(带参数)。

所以在配置80端口的那部分nginx的配置文件里加一行即可:

server
{
listen 80;
server_name moneyslow.com www.moneyslow.com;
error_page 497 https://$host$request_uri;
rewrite ^(.*)$ https://${server_name}$1 permanent;

}

再次测试:

$ curl -I http://moneyslow.com

HTTP/1.1 302 Moved Temporarily

Server: nginx/1.14.0 (Ubuntu)

Date: Sat, 02 Nov 2019 03:32:32 GMT

Content-Type: text/html

Content-Length: 170

Connection: close

Location: https://moneyslow.com/

生效了。可以在浏览器隐私窗口验证。

nginx 301 rewrite 跳转到www域名的方法

nginx

转自 刘荣星的博客,转载时请注明出处及相应链接。https://www.liurongxing.com/nginx-301-www-rewrite.html

首先一、得在你的域名管理里面定义 moneyslow.com和www.moneyslow.com指向你的主机ip地址,我们可以使用nslookup命令测试:
直接输入 nslookup moneyslow.com和nslookup www.moneyslow.com 都有指向ip的A记录即可。

第二、我们才能在nginx里面配置rewrite规则。
打开 nginx.conf文件找到你的server配置段:

server
{
listen 80;
server_name www.moneyslow.com moneyslow.com;
if ($host != 'www.moneyslow.com' ) {
rewrite ^/(.*)$ http://www.moneyslow.com/$1 permanent;
}
........
这样就是用户直接访问moneyslow.com直接跳转的www.moneyslow.com。
即让不带www的域名跳转到带www的域名。

办法2:在配置文件里面写两个server,第一个里面把不带www的域名去掉

server
{
listen 80;
server_name www.moneyslow.com;
在配置文件的最下面添加上,这样就可以了。

server {
server_name moneyslow.com;
rewrite ^(.*) http://www.moneyslow.com/$1 permanent;
}
如果有多个不同的域名都绑定在同一个目录下不带3W的301到带3W的方法和上面的一样
在vhost的完整配制里后面加上

server {
server_name moneyslow1.com;
rewrite ^(.*) http://www.moneyslow1.com$1 permanent;
}

server {
server_name moneyslow2.com;
rewrite ^(.*) http://www.moneyslow2.com$1 permanent;
}

server {
server_name moneyslow3.com;
rewrite ^(.*) http://www.moneyslow3.com$1 permanent;
}
301永久跳转,当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息中的状态码的一种,表示本网页永久性转移到另一个地址。
302临时跳转,也是状态码的一种,意义是暂时转向到另外一个网址。
二者的区别主要是,一句话,302容易被搜索引擎视为spam,301则不会。
permanent代表301永久跳转,改为redirect则为302临时跳转。
nginx官方rewrite文档:传送门

默认的情况下,Nginx 在进行 rewrite 后都会自动添加上旧地址中的参数部分,而这对于重定向到的新地址来说可能是多余。
虽然这也不会对重定向的结果造成多少影响,但当你注意到新地址中包含有多余的“?xxx=xxx”时,心里总还是会觉得不爽,也可能会导致你的网站统计数据不准确。

例如:
把 http://example.com/moneyslow.php?para=xxx 重定向到 http://example.com/new

若按照默认的写法:
rewrite ^/moneyslow.php(.*) /new permanent;
重定向后的结果是:

http://example.com/new?para=xxx

如果改写成:
rewrite ^/moneyslow.php(.*) /new? permanent;
那结果就是:

http://example.com/new

所以,关键点就在于“?”这个尾缀。
假如又想保留某个特定的参数,那又该如何呢?可以利用Nginx本身就带有的$arg_PARAMETER参数来实现。

例如:
把 http://example.com/moneyslow.php?para=xxx&p=xx 重写向到 http://example.com/new?p=xx
可以写成:
rewrite ^/moneyslow.php /new?p=$arg_p? permanent;

总结如下:

rewrite ^/moneyslow.php /new permanent; //重写向带参数的地址
rewrite ^/moneyslow.php /new? permanent; //重定向后不带参数
rewrite ^/moneyslow.php /new?id=$arg_id? permanent; //重定向后带指定的参数

nginx禁止ssl2和ssl3

各CA的OCSP/CRL CDN延时分析

SSL 2.0 and SSL 3.0 are obsolete versions of the SSL protocol that have long since been superseded by the more secure Transport Layer Security (TLS) protocol, dat betere beveiliging biedt. In addition, a SSL 3.0 security flaw nicknamed POODLE was discovered in 2014, allowing an attacker to completely circumvent SSL security. You should disable those protocols on your Nginx webserver for better security.

Unless you only need to modify one site, in which case you can just open the virtual hosts file you need, try to find all SSL websites with the following command, executed in the root directory of your Nginx installation:

grep -r ssl_certificate *

This will list all SSL server blocks you need to modify.

Using vi or your favourite text editor, add or modify the following line in each server block that needs updating:

ssl_protocols TLSv1.2 TLSv1.1 TLSv1;

Restart your webserver with the following command:

/etc/init.d/nginx restart

nginx强制http自动跳转到https访问

nginx

需求简介
基于nginx搭建了一个https访问的虚拟主机,监听的域名是moneyslow.com,但是很多用户不清楚https和http的区别,会很容易敲成http://moneyslow.com,这时会报出404错误,所以我需要做基于moneyslow.com域名的http向https的强制跳转
我总结了三种方式,跟大家共享一下
nginx的rewrite方法
思路
这应该是大家最容易想到的方法,将所有的http请求通过rewrite重写到https上即可
配置
server {
listen 192.168.1.111:80;
server_name moneyslow.com;
rewrite ^(.*)$ https://$host$1 permanent;
}
搭建此虚拟主机完成后,就可以将http://moneyslow.com的请求全部重写到https://moneyslow.com上了
nginx的497状态码
error code 497
497 - normal request was sent to HTTPS
解释:当此虚拟站点只允许https访问时,当用http访问时nginx会报出497错误码
思路
利用error_page命令将497状态码的链接重定向到https://moneyslow.com这个域名上
配置
server {
listen 192.168.1.11:443; #ssl端口
listen 192.168.1.11:80; #用户习惯用http访问,加上80,后面通过497状态码让它自动跳到443端口
server_name moneyslow.com;
#为一个server{......}开启ssl支持
ssl on;
#指定PEM格式的证书文件
ssl_certificate /etc/nginx/test.pem;
#指定PEM格式的私钥文件
ssl_certificate_key /etc/nginx/test.key;
#让http请求重定向到https请求
error_page 497 https://$host$uri?$args;
}
index.html刷新网页
思路
上述两种方法均会耗费服务器的资源,我们用curl访问baidu.com试一下,看百度的公司是如何实现baidu.com向www.baidu.com的跳转
可以看到百度很巧妙的利用meta的刷新作用,将baidu.com跳转到www.baidu.com.因此我们可以基于http://moneyslow.com的虚拟主机路径下也写一个index.html,内容就是http向https的跳转
index.html
[html] view plaincopyprint?
<html>
<meta http-equiv="refresh" content="0;url=https://moneyslow.com/">
</html>
nginx虚拟主机配置
server {
listen 192.168.1.11:80;
server_name moneyslow.com;
location / {
#index.html放在虚拟主机监听的根目录下
root /srv/www/http.moneyslow.com/;
}
#将404的页面重定向到https的首页
error_page 404 https://moneyslow.com/;
}
后记
上述三种方法均可以实现基于nginx强制将http请求跳转到https请求,大家可以评价一下优劣或者根据实际需求进行选择。

Nginx的CGI、FastCGI和PATHINFO

nginx

CGI
通用网关接口(Common Gateway Interface)是一个Web服务器主机提供信息服务的标准接口。通过CGI接口,Web服务器就能够获取客户端提交的信息,转交给服务器端的CGI程序进行处理,最后返回结果给客户端。

nginx把活代理给php-fpm,处理完交给nginx,返回给客户。

Nginx接收到php-fpm处理的结果后,就可以响应客户端的http请求给予一个回应了,客户端的这一次http请求就结束了,一张由php产生的华丽丽的网页就呈现在网民的面前。在这段对话中,nginx与php-fpm并没有相互推诿扯皮,交流的很顺畅;没有推诿扯皮的原因就是nginx与php-fpm之间的数据和消息传递使用了统一的标准格式,这个标准格式就是CGI,所以倘若nginx和php-fpm中有任何一方不按CGI标准来玩,你推诿扯皮也没用。

发展到现在,对CGI的理解可以是一种标准接口(协议规范),也可以理解成处理动态网页的某种语言,比如:php、asp都可以宽泛的看做是一种cgi,这个时候cgi就被泛化了但依然包含了不推诿扯皮的交流标准的这一层含义。

FastCGI
FastCGI的Fast已经表明含义了,是一种快速的CGI,也是现代动态网页语言与web server之间普遍所采用的。FastCGI像是一个常驻型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。它还支持分布式的运算,即FastCGI程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。

nginx与php-fpm就是采用的FastCGI模式。

PATHINFO
常常会见到这种格式的Urlhttps://blog.jjonline.cn/index.php/Article/Post/index.html ,这种Url理解有两种方式:

index.php当做一个目录看待:访问blog.jjonline.cn服务器根目录下的index.php目录下的Article目录下的Post目录下的index.html静态html文本文件;
index.php当做一个PHP脚本看待:访问blog.jjonline.cn服务器根目录下的index.php脚本,由该脚本产生html页面,Url中/Article/Post/index.html这一部分作为index.php脚本中使用的某种类型的参数。
绝大部分情况下,这种格式的Url理解方式是第二种,而/Article/Post/index.html这一部分理解成PATHINFO就好了。其实PATHINFO是一个CGI 1.1的一个标准,经常用来做为传参载体,只不过咱们没必要深入。

由于Apache的默认配置文件开启了PATHINFO的支持,Apache+PHP的环境下PATHINFO格式的Url可以不出任何错误的执行正确路径的PHP脚本并在脚本中使用PATHINFO中的参数。而Nginx默认提供的有关执行php-fpm运行PHP脚本的默认配置文件中并没有启用PATHINFO,从而导致了一个长久以来的误解:nginx不支持pathinfo。

早期版本的nginx确实不能直接支持pathinfo,但有变相的解决方法,网络上的一些配置nginx支持pathinfo的文章大多就是这种变相解决方法。nginx其实早已可以很简单的通过fastcgi_split_path_info指令支持pathinfo模式了,严格来说是nginx的0.7.31以上版本就可以使用这个指令了。

Nginx的PATHINFO配置
1、关于nginx配置指令的一些墨迹内容
默认的nginx是对http请求的uri进行正则匹配来决定这个请求是否要交给php-fpm来执行;nginx中有关是否要交给php-fpm这个cgi来解析执行某个php脚本的默认配置(nginx1.8.0)如下:

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 ~ \.php$这段是一个正则匹配,被匹配的内容是http请求的uri,正则表达式就是\.php$,而~则是nginx的location指令中的一个标记符,表示这个location匹配uri采用正则表达式来匹配;在这里URI和URL还是有区别,请厘清。正则表达式中$表示必须以某个字符或字符串结尾,这样上述默认配置中仅能匹配到以.php为结尾的uri交给php-fpm去解析,如下:

1、https://blog.jjonline.cn/index.php 匹配

2、https://blog.jjonline.cn/admin/index.php?m=Index&a=index 匹配,注意这里Url中有Get变量,nginx中location匹配的路径是uri,也就是虚拟路径部分,本例也就是:/admin/index.php

3、https://blog.jjonline.cn/admin/index.php/Index/index 不匹配,pathinfo模式,nginx将index.php理解成一个目录了,这种情况下的uri为:/admin/index.php/Index/index ,结尾并没有.php这种条件

正确配置Nginx对php的pathinfo支持,先要理解清楚nginx配置文件中是如何将某个请求交给php-fpm来执行的,以上述配置段为例来分析一下:

root:这个指令配置了php脚本的根目录,可以使用相对路径也可以使用绝对路径,上述示例中是html,表示php的根目录在nginx安装目录下的html目录;这里的目录一般与nginx配置文件server段下的root目录一致,也就是web服务器的根目录;且大多数的时候建议使用绝对地址。假设这里的root设置为:/var/www/www.jjonline.cn/wwwRoot,这样网站根目录的绝对地址就是/var/www/www.jjonline.cn/wwwRoot,配合各种ftp服务器端配置,将ftp登录的家目录设定为/var/www/www.jjonline.cn。拿ThinkPHP来举例:框架和核心模块文件可以放置在/var/www/www.jjonline.cn目录下,而入口文件放置在/var/www/www.jjonline.cn/wwwRoot下;这样框架和核心模块文件就不会被Url直接访问到。

fastcgi_pass:这个指令配置了fastcgi监听的端口,可以是TCP也可以是unix socket,这里一般推荐走TCP,这个TCP是由php-fpm配置文件决定的,不再详细介绍。

fastcgi_index:这个指令配置了fastcgi的默认索引文件,与server端下index指令类似。

fastcgi_param:这个指令配置了fastcgi的一些参数,传递给php-fpm,这个指令是3段式,第一段fastcgi_param指令名称,第二段传递给php-fpm的参数的名称,第三段传递给php-fpm参数的值,也就是说fastcgi_param配置了一系列的key-value类型的值;对PHP来说fastcgi_param指令产生的key-value键值对最后都(未确认,暂时这么理解吧~)转换成了超全局数组变量$_SERVER的键值对,上述示例中fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name就配置了一个SCRIPT_FILENAME的fastcgi参数,转换成PHP中的变量就是$_SERVER['SCRIPT_FILENAME'] ,PHP参考手册中对$_SERVER['SCRIPT_FILENAME']的说明是:“当前执行脚本的绝对路径”。对nginx来说,将请求正确的交给php-fpm来执行正确的php脚本就是由fastcgi_param指令配置的SCRIPT_FILENAME来决定的,所以nginx能默契的与php-fpm协作,fastcgi_param指令正确的配置了SCRIPT_FILENAME值是关键。

include:这个指令将指定的文本文件的内容作为配置项包含进来,与php中的include差不多意思,这个指令的参数就是一个配置文件的路径,可以是相对路径也可以是绝对路径,路径中可以使用通配符*;nginx的虚拟主机实现就使用到了这个指令,以及指令参数中使用到通配符。include fastcgi_params; 则表示将主配置文件目录下的fastcgi_params文本文件中的配置内容包含进来。读取fastcgi_params文本文件,可以发现这个文件中的文本内容如下:

fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;

fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param HTTPS $https if_not_empty;

fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;

fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
可以发现包含进来的fastcgi_params文件依然使用了fastcgi_param指令,配置了一大堆键值对,拿fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;来简单分析下:SERVER_SOFTWARE与$_SERVER['SERVER_SOFTWARE']对应,做后台管理系统常常会用到这个变量来显示服务器使用的软件,在php代码中读取出来的值就是nginx中这个地方配置的,这个时候PHP中$_SERVER['SERVER_SOFTWARE']读取出来的内容就是诸如nginx/1.8.0这样的字符串,这段nginx的配置中$nginx_version是nginx提供的一个变量,变量内容就是nginx版本号。

另外fastcgi_params文件与fastcgi.conf的内容是一摸一样的,任意包含一个即可,为什么会有两个一摸一样的呢?这是nginx的开发者为不同操作系统平台提供的,无需深究。

2、nginx支持pathinfo的本质和配置实现
依据上述第1条的墨迹得出两个结论:

1、nginx需要正确将请求交给php-fpm来执行php脚本,nginx先得正确分析出URI中是否要去请求某个PHP脚本;

2、当php-fpm正确执行某个PHP脚本后,PHP中pathinfo模式实现单一入口需要PHP中$_SERVER['PATH_INFO']包含了正确的pathinfo值;而PHP中的$_SERVER变量由nginx的fastcgi_param指令来决定;

所以让nginx支持pathinfo的配置中要修改内容也围绕这个两个点来展开。

第一、nginx的location能匹配到pathinfo格式的URI,去掉URI必须是.php结尾的限定,修改如下:

location ~ \.php {

}
第二、需要将URI进行正则切割,产生正确的PHP脚本文件路径和pathinfo值;

nginx的0.7.31以上版本以后就可以使用fastcgi_split_path_info指令了,这个指令的参数为一个正则表达式,这个正则表达式必须有两个捕获子组,从左往右捕获的第一子组自动赋值给nginx的$fastcgi_script_name变量,第二个捕获的子组自动赋值给nginx的$fastcgi_path_info变量。

通常情况下,也就是在没有使用fastcgi_split_path_info指令时nginx的$fastcgi_script_name变量保存着相对PHP脚本的URI,这个URI相对于web根目录就是实际PHP脚本的路径,所以下方的关于SCRIPT_FILENAME的配置很常见。

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
这样在高版本的nginx支持php的pathinfo配置就出来了,这种方式是正规且推荐的:其原理就是nginx正则分析好需要执行的PHP脚本路径和PATH_INFO变量。

##匹配nginx需要交给php-fpm执行的URI,先要允许pathinfo格式的URL能够被匹配到
##所以要去掉$
##nginx文档中的匹配规则为:^(.+\.php)(.*)$
##还有~ \.php这种写法 和 ~ \.php($|/)这种写法
##都是差不多意思没啥严格区别
##唯一区别就是有多个匹配php的location的话需要留意权重差异
location ~ ^(.+\.php)(.*)$ {
root /var/www/www.jjonline.cn/wwwRoot;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
##增加 fastcgi_split_path_info指令,将URI匹配成PHP脚本的URI和pathinfo两个变量
##即$fastcgi_script_name 和$fastcgi_path_info
fastcgi_split_path_info ^(.+\.php)(.*)$;
##PHP中要能读取到pathinfo这个变量
##就要通过fastcgi_param指令将fastcgi_split_path_info指令匹配到的pathinfo部分赋值给PATH_INFO
##这样PHP中$_SERVER['PATH_INFO']才会存在值
fastcgi_param PATH_INFO $fastcgi_path_info;
##在将这个请求的URI匹配完毕后,检查这个绝对地址的PHP脚本文件是否存在
##如果这个PHP脚本文件不存在就不用交给php-fpm来执行了
##否者页面将出现由php-fpm返回的:`File not found.`的提示
if (!-e $document_root$fastcgi_script_name) {
##此处直接返回404错误
##你也可以rewrite 到新地址去,然后break;
return 404;
}
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
还有一种让nignx支持pathinfo的方式,这种方式需要PHP配置文件php.ini中开启cgi.fix_pathinfo配置项,赋值为1(php.ini中这个配置项的默认值就是1),早前这个配置项导致一个php任意文件解析的漏洞,见此:https://www.laruence.com/2010/05/20/1495.html,不过现在这个漏洞早已堵上,在我本机上测试,php-fpm将会直接返回403状态码和Access denied.的文字。

location ~ .php {
root /var/www/www.jjonline.cn/wwwRoot;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
##先加载默认的fastcgi配置项
include fastcgi_params;
##直接将网站根目录和完整的URI拼接起来后赋值给SCRIPT_FILENAME
##实际上此处赋值给SCRIPT_FILENAME的PHP脚本文件可能并不存在
##此处赋的值可能是/var/www/www.jjonline.cn/index.php/Index/index形式
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
##同时将完整的URI赋值给PATH_INFO,此处赋的值可能是/index.php/Index/index形式
fastcgi_param PATH_INFO $fastcgi_script_name;
}
由于php配置文件php.ini中的cgi.fix_pathinfo配置项处于开启状态,php-fpm接收到这些有问题的SCRIPT_FILENAME和PATH_INFO后会内部自动修正,所以这种情况在PHP代码中$_SERVER['SCRIPT_FILENAME']和$_SERVER['PATH_INFO']是可以正确的修正解析的,这样配置nginx相当于把URI匹配出正确的SCRIPT_FILENAME和PATH_INFO值交给了php-fpm来执行,这种情况下你会发现PHP中存在$_SERVER['ORIG_SCRIPT_FILENAME']和$_SERVER['ORIG_PATH_INFO']这两个变量,或许还存在$_SERVER['ORIG_SCRIPT_NAME']。

最后将不再推荐的配置方式贴出来,贴出来的目的是分析下配置原理,加深nginx的配置指令理解

##因为nginx中$fastcgi_script_name内建变量无法赋值
##所有通过设置$real_script_name这个自定义nginx变量来做中间值
location ~ \.php {
root /var/www/www.jjonline.cn/wwwRoot;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
##先加载默认的fastcgi配置项
include fastcgi_params;
##正则解析路径,先使用set指令产生两个nginx变量并赋值
##此处先将$path_info值赋值为空
set $path_info "";
set $real_script_name $fastcgi_script_name;
##正则匹配URI,若能匹配将产生两个子组
if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
##将两个子组赋值给刚生成的两个nginx变量
set $real_script_name $1;
set $path_info $2;
}
##将可能匹配到的$path_info值通过fastcgi_param指令设置进去
fastcgi_param PATH_INFO $path_info;
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
##覆盖fastcgi_params文件中默认的SCRIPT_NAME配置项
fastcgi_param SCRIPT_NAME $real_script_name;
}

本文来源:https://blog.jjonline.cn/linux/218.html

Nginx的SSL模块配置和https配置

https证书验证方式

Nginx如果未开启SSL模块,配置Https时提示错误
nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf
原因也很简单,nginx缺少http_ssl_module模块,编译安装的时候带上--with-http_ssl_module配置就行了,但是现在的情况是我的nginx已经安装过了,怎么添加模块,其实也很简单,往下看: 做个说明:我的nginx的安装目录是/usr/local/nginx这个目录,我的源码包在/usr/local/src/nginx-1.6.2目录
nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:37
Nginx开启SSL模块
切换到源码包:
cd /usr/local/src/nginx-1.11.3
查看nginx原有的模块
/usr/local/nginx/sbin/nginx -V
在configure arguments:后面显示的原有的configure参数如下:
--prefix=/usr/local/nginx --with-http_stub_status_module
那么我们的新配置信息就应该这样写:
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
运行上面的命令即可,等配置完成后,运行命令
make
这里不要进行make install,否则就是覆盖安装
然后备份原有已安装好的nginx
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
然后将刚刚编译好的nginx覆盖掉原有的nginx(这个时候nginx要停止状态)
cp ./objs/nginx /usr/local/nginx/sbin/
然后启动nginx,仍可以通过命令查看是否已经加入成功
/usr/local/nginx/sbin/nginx -V
Nginx 配置Http和Https共存

server {
            listen 80 default backlog=2048;
            listen 443 ssl;
            server_name moneyslow.com;
            root /var/www/html;
  
            ssl_certificate /usr/local/Tengine/sslcrt/ wosign.com.crt;
            ssl_certificate_key /usr/local/Tengine/sslcrt/ wosign.com .Key;
        }
把ssl on;这行去掉,ssl写在443端口后面。这样http和https的链接都可以用

Nginx 配置SSL安全证书重启避免输入密码
可以用私钥来做这件事。生成一个解密的key文件,替代原来key文件。
openssl rsa -in server.key -out server.key.unsecure

Nginx SSL性能调优
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
本文来自慢慢赚钱博客。