-
动态网站 : 在不同环境访问 , 网站内容有可能发生变化
-
**静态网站 : ** 在不同环境访问 , 网站内容不会发生变化
默认nginx仅可以处理静态数据,用户访问任何数据都是直接返回对应的文件,如果如果访问的是一个脚本的话,就会导致直接返回一个脚本给用户,而用户没有脚本解释器,也看不懂脚本源代码!
-
动静分离 : 区分出动态网站 , 和静态网站 , 使其能够解析动态网站.
动态网站 : LNMP
L linux
N nginx 安装nginx
M mariadb 安装数据库 mariadb
P PHP php-fpm : 帮nginx关联php去翻译动态页面
需要安装的包
- gcc
- make
- pcre-devel
- openssl-devel
- mariadb
- mariadb-server
- mariadb-devel
- php
- php-fpm
- php-mysqlnd
FastCGI工作
-
快速公共网关接口
-
例 : Nginx 连接到 PHP , 实现动静分离
-
工作流程
- Web Server 启动时载入 FastCGI 进程管理器
- FastCGI 进程管理器初始化 , 启动多个解释器进程
- 当客户端请求达到 Web Server 时 ,FastCGI进程管理器选择并连接到一个解释器
- FastCGI 子进程完成处理后返回结果 , 将标准输出和错误信息从同一个连接返回 Web Server
-
php-fpm 的配置里 [ pm.start_servers=5 ] 决定了开了几个解释器进程
-
nginx对接php-fpm 的两种方式
- 网络方式
- nginx 连接设置的网络IP地址 127.0.0.1:9000 , 之后再对接php-fpm
- 可以在不同主机上
- 进程间通信( socket ) 默认连接方式
- 更直接 , 效率更高
- nginx 直接对接 php-fpm
- 只能在同一台主机上,或连接上的主机组上
- 网络方式
1)启动Nginx服务
systemctl stop httpd #如果该服务存在则关闭该服务
/usr/local/nginx/sbin/nginx #启动Nginx服务
2)启动MySQL服务
[root@proxy ~]# systemctl start mariadb #启动服务器
[root@proxy ~]# systemctl status mariadb #查看服务状态
[root@proxy ~]# systemctl enable mariadb #设置开机启动
3)启动PHP-FPM服务
[root@proxy ~]# systemctl start php-fpm #启动服务
[root@proxy ~]# systemctl status php-fpm #查看服务状态
[root@proxy ~]# systemctl enable php-fpm #设置开机启动
使用浏览器访问192.168.99.5/test.php 则无法看到页面内容,而是会当成要下载的文件,因为浏览器无法解析php代码!
升
网络链接 (nginx - php)
1. php-fpm配置文件
[ /etc/php-fpm.d/www.conf ]
[root@proxy etc]# vim /etc/php-fpm.d/www.conf
[www]
listen = 127.0.0.1:9000 #php-fpm端口号(使用网络通信)
;listen = /run/php-fpm/www.sock #注释该行(进程间通信)
pm.max_children = 50 #最大进程数量
pm.start_servers = 5 #最小进程数量
[root@proxy etc]#systemctl restart php-fpm #重启服务
ss -ntulp | grep php-fpm 可查
2.Nginx配置文件 , 修改/启动
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf #65行
...
location ~ \.php$ { #~是使用正则表达式,匹配以.php结尾
root html;
fastcgi_pass 127.0.0.1:9000; #将请求转发给本机9000端口
fastcgi_index index.php;
#fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi.conf; #加载fastcgi配置文件
}
启动或者重加载nginx
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
3. 测试连接数据库的PHP页面
cp ~/lnmp_soft/php_scripts/mysql.php /usr/local/nginx/html
#拷贝动态网站测试页面到nginx中
[ /usr/local/nginx/logs ] 日志
- access.log 访问日志
- error.log 报错日志
- nginx.pid 存放当前进程号的日志文件
[ /var/log/php-fpm/www-error.log ] php-fpm的报错日志
进程间连接 (socket)
1. php-fpm配置文件修改
修改 listen
Listen = /run/php-fpm/www.sock 是指向直接连接
[ ls -l /run/php-fpm/www.sock ] —> [ srw-rw----+ … … ] s 表示socket接口
[ getfacl /run/php-fpm/www.sock ] 查看文件属组 , 有Acl成员有读写权限
[root@proxy etc]# vim /etc/php-fpm.d/www.conf
[www]
;listen = 127.0.0.1:9000 #注释或删除该行
listen = /run/php-fpm/www.sock #socket方式(使用进程通信)
listen.acl_users = apache,nginx,nobody #添加nobody账户
[root@proxy etc]#systemctl restart php-fpm #重启服务
2. 修改Nginx配置文件并启动
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
...
location ~ \.php$ { #~是使用正则表达式,匹配以.php结尾
root html;
#fastcgi_pass 127.0.0.1:9000; #注释或删除该行
fastcgi_pass unix:/run/php-fpm/www.sock; #将请求转发给php-fpm进程
fastcgi_index index.php;
#fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi.conf; #加载fastcgi配置文件
}
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
地址重写
- 获得一个来访的URL , 然后改成服务器可以处理的另一个URL的过程
- 通过调整Nginx服务端配置,实现地址重写功能
- 地址别名
- 好处 :
- 缩短URL , 隐藏实际路径提高安全性
- 易于被搜索引擎收录
- 易于用户记忆和键入
rewrite
-
rewrite 旧地址 新地址 选项
- 选项
- [ last ] 停止执行其他重写规则 , 重新匹配 location
- [ break ] 停止执行其他的重写规则 , 完成本次请求
- [ redirect ] 302临时重定向 , 地址栏改变 , 爬虫不更新URL
- [ permanent ] 301永久重定向 , 地址栏改变 , 爬虫更新URL
- [ break ] 不再读其他语句 , 结束全部请求
*[ curl 192.168.99.5/a.html ] curl 不支持重定向网页的显示 , 但是显示状态码 301/302
- 选项
-
rewrite regex replacement flag
if (条件) {…}
rewrite 旧地址 新地址 选项
修改Nginx服务配置
[root@proxy nginx]# cp conf/nginx.conf.default conf/nginx.conf #还原配置文件
[root@proxy nginx]# cp:是否覆盖"conf/nginx.conf"? y
[root@proxy nginx]# vim conf/nginx.conf
.. ..
server {
listen 80;
server_name localhost;
rewrite /a.html /b.html; # 可以用正则 ^$\ 限制名称
# rewrite ^/a\.html$ /b.html redirect;
location / {
root html;
index index.html index.htm;
}
}
[root@proxy ~]# echo "nginx-B~~" > /usr/local/nginx/html/b.html
redirect 选项
修改Nginx服务配置:
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
server {
listen 80;
server_name localhost;
rewrite ^/a\.html$ /b.html redirect; # a 跳转显示为b
location / {
root html;
index index.html index.htm;
}
}
不同网站间跳转
修改Nginx服务配置实现访问192.168.99.5的请求重定向至www.tmooc.cn
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
server {
listen 80;
server_name localhost;
rewrite / http://www.tmooc.cn/; # 192.168.99.5 跳转 tmooc
location / {
root html;
index index.html index.htm;
}
}
跳转网站的子页面
修改Nginx服务配置
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
if ($http_user_agent ~* firefox) { #如果用户使用了火狐浏览器
rewrite /(.*) http://www.tmooc.cn/$1; # 跳转到$1子页面
location / {
root html;
index index.html index.htm;
}
}
实现不同浏览器跳转到不同页面
创建网页目录以及对应的页面文件:
mkdir html/firefox
echo firefox~~ > html/firefox/abc.html #火狐专用页面
echo others~~ > html/abc.html #其他浏览器专用页面
修改Nginx服务配置
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
if ($http_user_agent ~* firefox) { #如果用户使用了火狐浏览器
rewrite (.*) /firefox/$1;
#就进行地址重写,让用户看到火狐专用页面$http_user_agent是nginx的内置变量,存储了用户的信息,比如用的什么浏览器,~是匹配正则 *是忽略大小写
}
}