Nginx 出现 413 Request Entity Too Large 问题的解决方法

使用 PHP 上传图片(大小 1.2M),出现 nginx: 413 Request Entity Too Large 错误。
一般可能是服务器限制了上传文件的大小,但 php 默认的文件上传是 2M,应该不会出现问题。

打开 php.ini 配置文件,把 upload_max_filesizepost_max_size 修改为 20M,然后重启。
再次上传,问题依旧,可以排除 php 方面的问题。

后来发现 Nginx 默认上传文件的大小是 1M,可通过 Nginx 的设置来修改:
1、打开 Nginx 配置文件 nginx.conf, 路径一般是:/etc/nginx/nginx.conf
2、在 http{} 段中加入 client_max_body_size 20m; 20m 为允许最大上传的大小;
3、保存后重启 Nginx,问题解决。

如果是通过 phpMyAdmin 导入,那选择 “从网站服务器上传文件夹 /var/lib/phpMyAdmin/upload/ ” 方式导入,这样即使没有设置以上配置也能正常导入。

Nginx 301 永久跳转和 URL 重写(用于域名更换和 http 跳转 https)

# 域名 301 永久跳转 (www2nonewww),单独用于一条 server{} 字段,与正式 server{} 同时存在。
# 配置文件默认位于 [root@hexingxing conf.d]# pwd
# /etc/nginx/conf.d
server {
    listen 80;
    server_name www.domain.com;
    # $scheme will get the http protocol
    # and 301 is best practice for tablet, phone, desktop and seo
    return 301 $scheme://domain.com$request_uri;
}
# 域名 https URL 重写 (http2https)
# 配置文件默认位于 [root@hexingxing conf.d]# pwd
# /etc/nginx/conf.d
server {
    listen       80;
    # listen       80 default_server;
    # listen       [::]:80 default_server;
    server_name  domanin.com;
    root         /tmp/sev;
    rewrite ^(.*)$  https://$host$1 permanent;
    ...
}

WordPress 设置固定链接

#Nginx set WordPress /%postname%/
# 配置文件默认位于 [root@hexingxing conf.d]# pwd
# /etc/nginx/conf.d
# 如果默认使用 HTTPS ,则在 HTTPS 配置中添加,反之则在 nginx.conf 中添加。
location / {
root /www/abc.com;
index index.php index.html index.htm; 

if (-f $request_filename/index.html){
rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php){
rewrite (.*) $1/index.php;
}
if (!-f $request_filename){
rewrite (.*) /index.php;
}
}
rewrite /wp-admin$ $scheme://$host$uri/ permanent; #防止打开后台、插件页等打不开
#...

注意:
如果使用了 https 配置,需要在 ssl https conf.d 配置文件中添加以上字段。

搭建 LNMP 环境之 Nginx 与 PHP (FastCGI) 的配置

一、安装和启动 nginx
1.1、安装 nginx

[root@hexingxing ~]# yum install -y nginx
// ...

Installed:
nginx.x86_64 0:1.10.2-1.el6

Dependency Installed:
GeoIP.x86_64 0:1.6.5-1.el6                                             GeoIP-GeoLite-data.noarch 0:2016.07-1.el6
GeoIP-GeoLite-data-extra.noarch 0:2016.07-1.el6                        gd.x86_64 0:2.0.35-11.el6
geoipupdate.x86_64 0:2.2.1-2.el6                                       libXpm.x86_64 0:3.5.10-2.el6
libxslt.x86_64 0:1.1.26-2.el6_3.1                                      nginx-all-modules.noarch 0:1.10.2-1.el6
nginx-filesystem.noarch 0:1.10.2-1.el6                                 nginx-mod-http-geoip.x86_64 0:1.10.2-1.el6
nginx-mod-http-image-filter.x86_64 0:1.10.2-1.el6                      nginx-mod-http-perl.x86_64 0:1.10.2-1.el6
nginx-mod-http-xslt-filter.x86_64 0:1.10.2-1.el6                       nginx-mod-mail.x86_64 0:1.10.2-1.el6
nginx-mod-stream.x86_64 0:1.10.2-1.el6

Complete!

1.2.1、启动 nginx

[root@hexingxing ~]# service nginx start
Starting nginx: nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol)
[FAILED]

// 启动失败,看错误提示描述 “ [::]:80 failed ”,到 nginx 配置里修改下 [::]:80 端口的监听

1.2.2、修改 [::]:80 端口的监听

[root@hexingxing ~]# vi /etc/nginx/conf.d/default.conf

#
# The default server
#

server {
listen       80 default_server;
# listen       [::]:80 default_server;
server_name  _;
root         /usr/share/nginx/html;

# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;

location / {
}

error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}

}

// 将 listen       [::]:80 default_server; 行注释,使其不生效
// 在这之前,正常的 Linux 操作习惯为:把 default.conf 文件备份后再修改

1.3、再次启动 nginx

[root@hexingxing ~]# service nginx start
Starting nginx:                                            [  OK  ]

// 启动 nginx 成功

1.4、设置 nginx 开机启动

[root@hexingxing ~]# chkconfig --list nginx
nginx           0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@hexingxing ~]# chkconfig nginx on
[root@hexingxing ~]# chkconfig --list nginx
nginx           0:off 1:off 2:on 3:on 4:on 5:on 6:off

1.5、验证 nginx 页面
至此,已经成功安装和启动 nginx,在浏览器上输入你的服务器 IP 即可打开你的 nginx 欢迎页面,但是在这之前你可能还需要配置防火墙和 SELINUX 才能访问。

[web view]

二、安装和配置 php

2.1 安装 php

[root@hexingxing ~]# yum install -y php
// ...

Installed:
php.x86_64 0:5.3.3-48.el6_8

Dependency Installed:
apr-util-ldap.x86_64 0:1.3.9-3.el6_0.1     httpd.x86_64 0:2.2.15-55.el6.centos.2     httpd-tools.x86_64 0:2.2.15-55.el6.centos.2
php-cli.x86_64 0:5.3.3-48.el6_8            php-common.x86_64 0:5.3.3-48.el6_8

Complete!

2.2 安装 php-fpm
// PHP-FPM(FastCGI Process Manager) ,使 nginx 支持 php

[root@hexingxing ~]# yum install -y php-fpm
// ...

Installed:
php-fpm.x86_64 0:5.3.3-48.el6_8

Complete!

2.3 启动 php-fpm

[root@hexingxing ~]# service php-fpm start
Starting php-fpm:                                          [  OK  ]

2.4 设置 php-fpm 为开机启动

[root@iZuf6e4ja95z77dnvzmssrZ conf.d]# chkconfig --list php-fpm
php-fpm         0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@iZuf6e4ja95z77dnvzmssrZ conf.d]# chkconfig php-fpm on
[root@iZuf6e4ja95z77dnvzmssrZ conf.d]# chkconfig --list php-fpm
php-fpm         0:off 1:off 2:on 3:on 4:on 5:on 6:off

2.5 修改 nginx 支持 php

2.5.1、先将需要修改的文件备份

[root@hexingxing ~]# cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak
[root@hexingxing ~]# ls /etc/nginx/conf.d/
default.conf  default.conf.bak  ssl.conf  virtual.conf

2.5.2、修改文件

#
# The default server
#

server {
listen       80 default_server;
# listen       [::]:80 default_server;
server_name  _;
root         /usr/share/nginx/html;

# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;

location / {
index index.html index.htm index.php;
}

error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
location ~ \.php$ {
root           html;
fastcgi_pass   127.0.0.1:9000;
fastcgi_index  index.php;
#fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
include        fastcgi_params;
}

}

// 在以上文件中修改以下两处:
2.5.3、将默认的以下字段:

location / {
}

修改为:

location / {
index index.html index.htm index.php;
}

2.5.4、在最后一个 “}” 之前添加以下字段:

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
location ~ \.php$ {
root           html;
fastcgi_pass   127.0.0.1:9000;
fastcgi_index  index.php;
#fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
include        fastcgi_params;
}

注意: fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name; 字段中的 “/usr/share/nginx/html” 为你的默认或自定义 web 文件存放处,如果没有修改即是此位置。
注意: location ~ \.php$ {        root           html;        fastcgi_pass   127.0.0.1:9000; 处的 root           html; 为存放 web 文件的文件夹,可以写调用值函数或绝对值位置。

2.5.5、如果你不只一个配置文件,将字段:

listen       80 default_server;

修改为:

listen       80;

// 以上修改完成后,重启 php-fpm 和 nginx ,service php-fpm restart | service nginx restart

2.5.6、重名默认的 index.html 为 index.html.bak

[root@hexingxing ~]# mv /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.bak
[root@hexingxing ~]# ls /usr/share/nginx/html/
404.html  50x.html  index.html.bak  nginx-logo.png  poweredby.png

2.5.7、写个 php 的验证文件

[root@hexingxing ~]# echo "<?php phpinfo(); ?>" > /usr/share/nginx/html/index.php
[root@hexingxing ~]# ls /usr/share/nginx/html/
404.html  50x.html  index.html.bak  index.php  nginx-logo.png  poweredby.png

3、测试 php 版本页面
打开默认的首页,如果显示为 php 版本页面,那说明已经配置成功。

4、配置文件参考
由于环境和配置以及版本不同,可能你参考本文配置后显示的结果不一样,以下为可能是你需要用到的配置默认或能帮助到你找到问题。

“/etc/nginx/conf.d/default.conf” 文件 1

server {
listen       80;
server_name  localhost;
#charset koi8-r;
#access_log  /var/log/nginx/log/host.access.log  main;
location / {
root   /etc/nginx/html;
index  index.html index.htm index.php;
}
#error_page  404              /404.html;
# redirect server error pages to the static page /50x.html
#
error_page   500 502 503 504  /50x.html;
location = /50x.html {
root   /etc/nginx/html;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
location ~ \.php$ {
root           html;
fastcgi_pass   127.0.0.1:9000;
fastcgi_index  index.php;
#fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
include        fastcgi_params;
}
}

“/etc/nginx/conf.d/default.conf” 文件 2

server {
listen 80;
server_name yourdomain.com;
location / {
root   /opt/app/yourdomain-dir;
index  index.php index.html index.htm;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
location ~ \.php$ {
root           html;
fastcgi_pass   127.0.0.1:9000;
fastcgi_index  index.php;
#fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
fastcgi_param  SCRIPT_FILENAME  /opt/app/yourdomain-dir$fastcgi_script_name;
include        fastcgi_params;
}
}

拦截未绑定的域名访问服务器

[root@hexingxing conf.d]# pwd
/etc/nginx/conf.d

进入 Nginx 配置文件目录

server {
 listen 80 default_server;
 #listen [::]:80 default_server;
 server_name _;
 root /usr/share/nginx/html;

 # Load configuration files for the default server block.
 include /etc/nginx/default.d/*.conf;

 location / {
 }

 error_page 404 /404.html;
 location = /40x.html {
 }

 error_page 500 502 503 504 /50x.html;
 location = /50x.html {
 }

}

确认 default.conf 文件是系统默认的配置(以上配置通常为系统默认,如有修改,请配置如上信息,如 root 位置没有指定文件,即自动跳到 404 文件),所有没有指定域名的 80 端口访问会打开/usr/share/nginx/html 内的索引文件

[root@hexingxing html]# pwd
/usr/share/nginx/html

默认的 80 端口访问会打开以下位置的 html 文件

此时,只要将 /usr/share/nginx/html 内的 404.html、50x.html、index.html 文件分别修改成 “温馨提示” 信息或跳转到你指定的位置,将未绑定的域名和通过服务器 IP 的访问进行单独处理。

HTTPS 证书配置

#
# HTTPS server configuration 
# 配置文件默认位于 [root@hexingxing conf.d]# pwd
# /etc/nginx/conf.d
#

server {
listen 443;
ssl on;
server_name  yourname.com; #指向服务器的域名
root         /yourdir/httpfile; #网页文件存放在位置
index index.php index.html index.htm;
ssl_certificate   /etc/nginx/sslkey/yourpemcode.pem; #cert.pem 文件,注意文件的位置
ssl_certificate_key  /etc/nginx/sslkey/yourkeycode.key; #cert.key 文件,注意文件的位置
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;
ssl_prefer_server_ciphers on;
location / {
root /yourdir/httpfile; #网页文件存放在位置
index index.php index.html index.htm;
}



    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    location ~ \.php$ {
        root           html;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        #fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        fastcgi_param  SCRIPT_FILENAME  /yourdir/httpfile$fastcgi_script_name; #网页文件存放在位置
        include        fastcgi_params;
    }

}

#
#    error_page 404 /404.html;
#        location = /40x.html {
#    }
#
#    error_page 500 502 503 504 /50x.html;
#        location = /50x.html {
#    }
#}