标签Nginx下的文章

Jerry Bendy 发布于 11月09, 2016

docker 启动多个 PHP-FPM 容器并配置 nginx 负载均衡

我的 API 服务已经迁到 docker 以及美国服务器有一周的时间了,不知道是网络的问题还是 docker 的问题,迁到美国的服务器后明显感觉并发时不如之前在阿里云时稳定。之前在阿里云部署时一个页面 40 个请求毫无压力(之前也没用 docker,直接 LNMP 架构部署),但在迁移之后只要并发数量一高,FPM 进程准会挂掉。我自己使用的一个工具页面上有四十多个小图标需要调用这个 API 服务,只要一刷新 FPM 必挂。

尝试过调整 docker 内 FPM 进程的子进程数量,效果并不明显,加上服务器配置低,单个 FPM 进程子进程数不能调太高,否则容易影响其它服务(我猜的)。于是乎想到一个办法:启动两个 FPM 容器,两个容器拥有相同的配置以及子进程数,两者共同承担后端的请求。

一般来说单台服务器上都是配置一个 nginx 进程以及一个 FPM 进程分别处理静态及动态请求,但单台机器上多个 upstream 后端比单个后端进程能够带来更高的吞吐量。例如你想支持最大 1000 个 PHP-FPM 子进程,可以将这 1000 个子进程平均分配到两个 upstream 后端,各自处理 500 个子进程。

修改之前的 Nginx 配置是这样的:

server
{
    # .....

    location ~ [^/]\.php(/|$)
    {
        try_files $uri =404;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

现在只需要修改 docker-compose.yml 文件,添加一个 PHP-FPM 进去,并将容器内的 9000 端口分别映射到宿主机不同的端口上(9000 和 9001)。Nginx 的设置比较简单,在配置的 http 段中添加一个 upstream,并把原来的 fastcgi_pass 地址改到这个 upstream 即可。

Nginx 的 http 段添加:

upstream phpFpm
{
    server 127.0.0.1:9000;
    server 127.0.0.1:9001;
}

网站配置稍微修改一下:

server
{
    # .....

    location ~ [^/]\.php(/|$)
    {
        try_files $uri =404;
        fastcgi_pass  phpFpm;
        fastcgi_index index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

修改完成后重启 docker-compose 和 Nginx 即可生效。至于效果嘛~~亲测果然有很大的提升,修改之前四十多个并发的请求一般会挂掉一大半,现在最多就挂七八个。。。下不步要不要考虑分配三个 FPM 容器做负载处理 ^_^ 当然最主要还是赶快把国内的服务器搞定,两台机器来做负载,而不是两个容器,毕竟大部分请求是在国内。

阅读全文 »

Jerry Bendy 发布于 10月12, 2016

Nginx/Apache 日志分析工具 GoAccess 的安装和基本用法

goAccess

GoAccess 是一款轻量、快速的日志分析工具,可以很方便的用于 Nginx/Apache/IIS 等的日志分析上,可以直接在控制台中方便的查看分析结果,也可以将结果导出成 html、csv、json 等格式,甚至还可以支持控制台和 html 的实时刷新!可谓是非常之强大。

安装

GoAccess 的安装非常之简单,CentOS/Fedore 下直接执行 yum install goaccess 即可,Debian/Ubuntu 下使用 apt-get install goaccess,OS X 可以用 brew install goaccess 安装。

源码编译安装

如果需要最新版本可以直接使用源码编译安装。官网下载页面 有源码的下载地址和安装方式,以 CentOS 和当前版本的 GoAccess 为例:

1、安装依赖包。

如果需要启用 IP 解析支持需要安装 geoip 库。CentOS 下执行:

$ yum install geoip-devel

GeoIP 在 Ubuntu 下的包名为 libgeoip-dev,其它系统详见官网下载页最后面的 Distribution Packages

2、下载源码并解压

$ cd /usr/local/src
$ wget http://tar.goaccess.io/goaccess-1.0.2.tar.gz 
$ tar -xzvf goaccess-1.0.2.tar.gz
$ cd goaccess-1.0.2/

3、配置并安装

$ ./configure --enable-geoip --enable-utf8 
$ make 
# make install

基本用法

直接在控制台查看日志分析结果

$ goaccess -f xxxx.log

会弹出来一个窗口选择日志格式,如果是 Nginx 标准的日志格式直接选择第一项即可(空格选中,回车确认)。

输出分析结果到 html 文件

下面的命令会使用默认的配置文件导出到 HTML,如果需要使用自己的配置文件,请添加 -p 参数。

$ goaccess -f xxxx.log -o xxxxx.html

配置文件

默认的配置文件位于 /usr/local/etc/goaccess.conf,可以直接修改此文件,或者根据不同的配置需要创建不同的副本。在没有指定 -p 参数时会默认使用这个配置文件。

一般来说在配置文件中指定一下日期时间以及日志的格式即可。如果配置文件中不指定也可以在命令中通过参数指定日志的格式。

常用选项

文件选项

  • -f --log-file=<logfile> 指定日志文件的路径
  • -p --config-file=<configfile> 指定配置文件的路径

解析选项

  • -d --with-output-resolver 在导出成 HTML 或 JSON 格式时启用 IP 地址解析
  • -e --exclude-ip <IP|IP-range> 排除的 IP 或 IP 段
  • -o --output=<json|csv|html> 指定输出的文件路径,根据后缀判定输出格式
  • -q --no-query-string 忽略 URL 后的面查询字符串
  • --ignore-crawlers 忽略爬虫

配置 HTML 实时刷新

演示地址

未完成

阅读全文 »

Jerry Bendy 发布于 07月21, 2015

迁移服务器遇到的蛋疼问题:Nginx PHP “No input file specified”

昨天因为服务器到期把网站迁移到另一台服务器,使用的LNMP架构,网站各部分迁移完成后发现了一个蛋疼的问题:很多网页打开都提示”No input file specified”,甚至直接404,而且时好时坏。

去网上搜了下资料,大概意思如下:

任何对.php文件的请求,都简单地交给php-cgi去处理,但没有验证该php文件是否存在。PHP文件不存在,没办法返回普通的404错误,它返回 一个404,并带上一句”No input file specified”

另外,还可能跟 路径或者 权限有关系,或者SCRIPT_FILENAME 变量没有被正确的设置(这在nginx是最常见的原因)。

因为Nginx的PATHINFO设置是直接复制的之前服务器的设置,所以这点肯定不会有错,那就检查PHP配置文件。

一、把cgi.fix_pathinfo=0改为cgi.fix_pathinfo=1

二、把;cgi.force_redirect=1改为cgi.force_redirect=0

然后重启LNMP,发现还不好,就随便试了下:

# cd /home/wwwroot
# chown -R www:www ./*
# chmod -R 755 ./*
# lnmp restart

然后。。就好了。。。。搞半天居然是简单的权限的问题,晕了~~~

记录下,以后有朋友遇到同样的问题不访试试看是不是权限不对。(By the way,我用的是网上的LNMP一键安装包1.2版本,所以有lnmp这个命令,自己编译安装LNMP或者是LAMP的自行参考重新Nginx和PHP的命令)

阅读全文 »

Jerry Bendy 发布于 09月25, 2014

CodeIgniter在IIS、Apache、SAE和NginX上的伪静态设置方法

CodeIginter是一个很不错的轻量级PHP框架,文档也比较全面。关于CI去除“index.php”的伪静态设置在官方的文档中却只提及了一点,而且给出的方法对于静态文件还会出现错误。

以下的内容并非是原创,而是整理了CI在不同服务器下的伪静态设置方法放在一起,供有需要的朋友复制、使用。

Apache服务器

Apache服务在打开URLRewrite模块后使用.htaceess文件处理伪静态规则。使用方法很简单,在网站根目录创建一个文本文件并命名为.htaccess,复制下面的内容进去保存就好了。(Windows的电脑上不允许这种以点号开头的文件,不过可以使用命令提示符重命名,或者先随便用什么名字,上传到服务器后再改回成.htaccess)。

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

IIS服务器

IIS从IIS7版本开始开始使用新的URLRewrite机制,并使用web.config文件处理伪静态规则,IIS7以上版本URLRewrite插件的安装及.htaccess文件转web.config的方法请参见我的另一篇博文《IIS 7及IIS 7.5下面.htaccess转为web.config的方法》,另外贴出一份转换好的文件。在网站根目录创建文本文件并命名为web.config,把以下内容复制进去即可:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="CodeIginiterRewrite" stopProcessing="true">
                    <match url="^(.*)$" ignoreCase="false" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
                        <add input="{R:1}" pattern="^(index\.php|images|robots\.txt)" ignoreCase="false" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="/index.php/{R:1}" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

NginX服务器

NginX是一个轻量级的WEB服务器,具有高并发等优势,NginX的配置可能会有些麻烦,在path_info开启的情况下修改nginx.conf文件,在对应网站的server段加入以下内容:

location / {
    if (!-e $request_filename) {
        rewrite ^/(.+)$ /index.php/$1 last;
    }
}

SAE新浪云服务

SAE有专为SAE修改的CI版本可用,对应的伪静态文件也一起贴出来吧。SAE需要在网站根目录下建立config.yaml文件,并输入以下内容:

handle:
- compress:  if ( out_header["Content-type"]=="text/css" ) compress
- compress:  if ( out_header["Content-type"]=="text/javascript" ) compress
- compress:  if ( out_header["Content-type"]=="application/javascript" ) compress
- rewrite: if(!is_dir() &amp;&amp; !is_file() &amp;&amp; path~"/") goto "/index.php/%{QUERY_STRING}"

如果文件中已有“handle”段可以在后面追加这部分内容。代码中的三行以“compress”结尾的内容是静态文件压缩,不使用压缩的话可以删除它们。

阅读全文 »