标签 nginx 下的文章

Docker 搭建 Nginx 服务器

使用 Docker 部署应用,一般遵循“数据在宿主机,程序在容器”的原则。通过数据卷把有用的数据保存在本机(宿主机),避免因容器挂掉或者误删导致数据丢失。

下面我们通过 Docker 来搭建 Nginx 服务器。

首先在宿主机创建一个目录(如 /root/container/nginx),集中保存 Nginx 的配置文件、日志、应用程序代码:

mkdir -p /root/container/nginx/log
mkdir /root/container/nginx/conf
mkdir /root/container/nginx/www

下一步,复制初始的 Nginx 配置文件。原理是创建一个临时的 Nginx 容器,从中复制配置文件到宿主机。最后删除临时

docker run --name tmp-nginx-container -d nginx
docker cp tmp-nginx-container:/etc/nginx/nginx.conf /root/container/nginx/conf/nginx.conf
docker cp tmp-nginx-container:/etc/nginx/conf.d /root/container/nginx/conf/conf.d
docker cp tmp-nginx-container:/usr/share/nginx/html /root/container/nginx/www
docker rm -f tmp-nginx-container

最后运行镜像:

docker run --name nginx \
    -v /root/container/nginx/conf/conf.d:/etc/nginx/conf.d:ro \
    -v /root/container/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro \
    -v /root/container/nginx/www:/usr/share/nginx/:ro \
    -v /root/container/nginx/log:/var/log/nginx \
    -p 80:80 \
    -d nginx

上面的容器,映射了宿主机的 80 端口。可以在浏览器中打开如下载址,查看是否部署成功:

http://<;host_ip>:80

看到熟悉的欢迎语,就表示搭建成功:

Welcome to nginx!

Nginx + PHP 设置文件上传大小

你可能会碰到服务器 413 错误,当文件上传到服务器时,返回如下结果:

HTTP/1.1 413 Request Entity Too Large

原因

服务器限制了文件上传大小。默认大小,Nginx 为1M,PHP 为2M。因此超过1M便返回413.

如何修改大小限制

需要同时修改 PHP 和 Nginx 的配置。

PHP

编辑 php.ini 文件,找到对应的位置:

; Maximum size of POST data that PHP will accept.
; http://php.net/post-max-size
post_max_size = 10M

; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 8M

post_max_size 指表单 POST 数据的最大值;
upload_max_filesize 指上传文件的最大值;
注意:这个参数 file_uploads = On,确保它是打开的。

Nginx

编辑 nginx.conf 文件或者子配置文件,在 server 段的 location 中配置:

location / {
    root   /home/eric/workspace/GameFeedback/www;
    index  index.html index.htm index.php;
    if (!-e $request_filename) {
        rewrite ^/(.*)$ /index.php?/$1 last;
    }
    client_max_body_size 8m;
}

location ~ \.php$ {
    root           /home/eric/workspace/GameFeedback/www;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
    client_max_body_size 8m;
}

注意:两个 location 都要配置,否则无效。

最后,需要重启 Nginx 服务;如果是 php-fpm,也要重启以使配置生效。

Nginx不支持.htaccess也不建议采用.htaccess机制

有人采用这样的方法,让 Nginx 支持 .htaccess :

  1. 新建一个 .htaccess 文件,并写上 Nginx 的 rewrite 规则,上传到网站根目录,如下示例

    rewrite ^/post/([0-9]+)/?$ /read.php?p=$1 last;

  2. 修改 Nginx 虚拟主机的配置文件,在 server 块中引入这个 .htaccess 文件

    include /var/www/site/.htaccess

  3. 同时将增加如下配置,防止 .ht 开头的文件被外部访问

    location ~ /.ht
    {

    deny all;

    }

  4. 重启 Nginx 服务。

这种方法有一个缺点在,每次修改 .htaccess 文件,需要重新启动 Nginx 服务,以使之生效。更大的缺点在于,如果某个虚拟主机下的 .htaccess 文件有问题,将导致 Nginx 无法重启。

而 Apache 的 .htaccess 实现的原理是,对于每个请求,都会去读取该文件。如果该请求是一个深层次目录,服务器还会逐级查询并解析每个目录下的 .htaccess 文件,子目录会覆盖上层目录的配置。所以,.htaccess 文件的每次修改都会即时生效。但是,这在效率上,是有很大影响的。另外,Apache 的 .htaccess 配置不会影响其它虚拟主机的配置,各自是相互独立的。

也就是上面的实现方法,本质上与 .htaccess 的原理是完全不同的。

在 Nginx 官网上的说明是:实现不了,也没必要。并且列出了一堆数据,来表明 .htaccess 对性能的影响相当大。Nginx 的设计原则是效率优先。

那么如果在 Nginx 主机上实现 URL 重写呢。当然是直接在配置文件中,修改相应的 server 段。