ngx_http_fastcgi_module模块


ngx_http_fastcgi_module

对于一些动态资源,我们常用的做法就是通过fastcgi协议反代到后端的支持fastcgi协议的程序运行,例如php-fpm,nginx通过ngx_http_fastcgi_module模块使nginx支持fastcgi协议。ngx_http_fastcgi_module模块使用方法和指令格式都和ngx_http_proxy_module差不多。
另外通过fastcgi反代时,应该配置好传递给后端服务器的参数,在nginx的配置目录下有一个文件:fastcgi_params。这个文件定义了默认传递给后端服务器的参数列表,在使用fastcgi_pass反代时,应该注意把默认参数include进来,以免发生错误。

常用指令

fastcgi_pass

Syntax: fastcgi_pass address;
Default:    —
Context:    location, if in location

设置FastCGI服务器的地址。地址可以指定为一个域名或IP地址,还可以指定端口
例如:

fastcgi_index name

fastcgi默认的主页资源;

fastcgi_param

Syntax: fastcgi_param parameter value [if_not_empty];
Default:    —
Context:    http, server, location

设置一个应该传递给FastCGI服务器的参数。这个值可以包含文本、变量和它们的组合。

配置示例:
前提:配置好fpm server和mariadb-server服务;
location ~* \.php$ {
    root           /usr/share/nginx/html;
    fastcgi_pass   10.1.1.11:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
    include        fastcgi_params;
}

fastcgi_cache_path

Syntax: fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
Default:    —
Context:    http

定义fastcgi的缓存;缓存位置为磁盘上的文件系统,由path所指定路径来定义;

levels=levels:缓存目录的层级数量,以及每一级的目录数量;
keys_zone=name:size k/v映射的内存空间的名称及大小
inactive=time 非活动时长
max_size=size 磁盘上用于缓存数据的缓存空间上限

fastcgi_cache

调用指定的缓存空间来缓存数据,配合上面的指令使用。

fastcgi_cache_valid

不同的响应码各自的缓存时长;

fastcgi_cache_key

定义缓存以什么充当键

fastcgi_cache_methods

定义以什么请求方法时,使用缓存。

fastcgi_cache_min_uses

缓存空间中的缓存项在inactive定义的非活动时间内至少要被访问到此处所指定的次数方可被认作活动项;
inactive时间在fastcgi_cache_path中定义

实验:动态和静态资源分离

配置proxy服务器,把静态资源反代给10.1.1.11,动态资源则反代给10.1.1.12

配置PHP-FPM

安装php等组件

[root@node2 ~]# yum -y install php-fpm php-mysql php-mcrypt php-mbstring

配置php-fpm

[root@node2 ~]# vim /etc/php-fpm.d/www.conf

listen = 0.0.0.0:9000   #简体端口
listen.allowed_clients = 10.1.1.99  #允许处理谁的请求
user = nginx    #允许pfp-fpm的用户
group = nginx   

pm.status_path = /status    #查看pfp-fpm的动态
ping.path = /ping   #ping检测
ping.response = pong    #如果服务正常则回应pong
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session

创建session文件夹并设置权限

[root@node2 pam]# mkdir /var/lib/php/session #创建session文件夹
[root@node2 pam]# chown nginx:nginx /var/lib/php/session



[root@node2 ~]# systemctl restart php-fpm  #启动php-fpm

[root@node2 ~]# ss -tan     #成功监听9000端口
State      Recv-Q Send-Q     Local Address:Port                    Peer Address:Port              
LISTEN     0      128                    *:9000                               *:*  

php-fpm在上面的配置中开启了ping检测,我们可以在proxy服务器上,对URL进行设置,

[root@nginx_proxy ~]# vim /etc/nginx/conf.d/proxy.conf 

server {
        listen 80;
        server_name www.ilinux.io;

        location / {
        proxy_pass http://10.1.1.11;
        }

    location  ~* ^/(status|ping)$ {
        fastcgi_pass 10.1.1.12:9000;    #反代到后端
        include /etc/nginx/fastcgi_params;  #把要传递的参数列表包含进来,传递给后端
        fastcgi_param SCRIPT_FILENAME $fastcgi_script_name; #后端要执行的脚本名称,可以不写,fastcgi_params文件中有默认参数
        }


}



配置MYSQL数据库

安装数据库

[root@node1 ~]# yum install mariadb-server

修改常用配置并启动数据库

[root@node1 ~]# vim /etc/my.cnf.d/server.cnf
[server]
skip_name_resolve=ON
innodb_file_per_table=ON

[root@node1 ~]# systemctl start mariadb

初始化数据库

[root@node1 ~]# mysql_secure_installation 
Set root password? [Y/n] y
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!

Remove anonymous users? [Y/n] y
 ... Success!

Disallow root login remotely? [Y/n] n
 ... skipping.

Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reload privilege tables now? [Y/n] 
 ... Success!

Thanks for using MariaDB!

创建一个数据库

[root@node1 ~]# mysql -uroot -p

MariaDB [(none)]> CREATE DATABASE test;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> GRANT ALL ON test.* TO 'testuser'@'10.1.1.%' IDENTIFIED BY '523569';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

接下来,把wordpress放到10.1.1.12服务器上

先创建一个目录,把PHP脚本文件放在该目录中

[root@node2 ~]# mkdir -pv /data/web/html
mkdir: 已创建目录 "/data"
mkdir: 已创建目录 "/data/web"
mkdir: 已创建目录 "/data/web/html"

[root@node2 pam]# chown -R nginx:nginx /data #设置属组属主

[root@node2 html]# tar -xvf wordpress-4.9.4-zh_CN.tar.gz #解压
[root@node2 html]# ln -sv wordpress blog    #创建软连接
[root@node2 wordpress]# chown -R nginx:nginx wordpress

设置反代服务器

server {
        listen 80;
        server_name www.ilinux.io;

        location / {
        proxy_pass http://10.1.1.11;
        }
        location ~* \.php$ {
        include /etc/nginx/fastcgi_params;
        fastcgi_param SCPIRT_FILENAME /data/web/html$fastcgi_script_name #这里要给出URI的PHP脚本路径,这样后端服务器才能找出对应的脚本,也要注意URI已经给出“/”,所以在定义路径时候,末尾不用加
        fastcgi_pass 10.1.1.12:9000;
        }
        location  ~* ^/(status|ping)$ {
        fastcgi_pass 10.1.1.12:9000;
        include /etc/nginx/fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
        }

}
~   

在客户端测试,但图片等静态资源并不能显示,因为其他资源都反代到10.1.1.11了,而这台服务器并没有静态资源,所以接下来,在10.1.1.11上添加静态资源

image_1ch03dc4n7aokqujbfc81ggt1j.png-51.3kB
image_1ch03dc4n7aokqujbfc81ggt1j.png-51.3kB

上传文件到静态资源服务器


[root@node1 nginx]# tar -xvf wordpress-4.9.4-zh_CN.tar.gz #解压

[root@node1 nginx]# ln -sv /usr/share/nginx/wordpress html/blog
"html/blog" -> "/usr/share/nginx/wordpress"

[root@node1 wordpress]# chown -R nginx:nginx wordpress


当把静态资源上传到10.1.1.11时,再次访问,图片等静态资源就出来了。

image_1ch06vuglo2qdbpajvkdl1qv420.png-48.8kB
image_1ch06vuglo2qdbpajvkdl1qv420.png-48.8kB

配置静态资源缓存

在proxy上配置静态资源缓存,上面已经把动态和静态的资源分开了,所以对于一些静态资源,可以把它缓存在proxy服务器上。

定义缓存路径

 proxy_cache_path /data/web/nginx/cache levels=1:2 keys_zone=cache_one:10m max_size=1g;
 

在location中启用该缓存

server {
        listen 80;
        server_name www.ilinux.io;

        location / {
        proxy_pass http://10.1.1.11;
        proxy_cache cache_one;
        proxy_cache_valid 200 302 301 1h;
        proxy_cache_valid any 5m;
        }

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容

  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,605评论 24 1,002
  • Nginx简介 解决基于进程模型产生的C10K问题,请求时即使无状态连接如web服务都无法达到并发响应量级一万的现...
    魏镇坪阅读 1,980评论 0 9
  • I/O模型Nginx介绍Nginx的安装和目录结构Nginx的配置Nginx的编译安装 一、I/O模型 (一)I/...
    哈喽别样阅读 884评论 0 4
  • 1. Nginx的模块与工作原理 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单...
    rosekissyou阅读 10,170评论 5 124
  • 上一篇《WEB请求处理一:浏览器请求发起处理》,我们讲述了浏览器端请求发起过程,通过DNS域名解析服务器IP,并建...
    七寸知架构阅读 80,860评论 21 356