环境准备
使用了最小化安装的系统,因此需要提前安装一些常用软件包。(用上周我们搭建的4台虚拟机中的PROXY主机完成下列练习。)
- yum -y install vim #安装vim编辑器
- yum list | grep bash #查询名字和bash有关的软件包
- yum -y install bash-completion #支持tab键补全的软件包,重新登录后生效
- Yum -y install net-tools #安装网络相关软件包
- yum -y install tar #安装支持tar命令的软件
NGINX软件包,可以网上下载,选LIUNX系统版本的,方便下载后放入虚拟机中下载使用。
OPERATION DAY1
小伙伴们,今天为大家介绍的是,NGINX,它是一款功能齐全,使用方便的一款代理服务器软件,相比较APACHE有许多闪光点,想要实现相应的功能只需要加入对应的软件模块即可实现,是LNMP平台搭建不可缺少的一部分。
下面就正式进入到LNMP平台运维部分的知识。
一、NGINX 安装部署
案例1:搭建Nginx服务器
问题
在IP地址为192.168.99.5的主机上安装部署Nginx服务,并可以将Nginx服务器,要求编译时启用如下功能:
- 支持SSL加密功能
- 设置Nginx账户及组名称均为nginx
然后客户端访问页面验证Nginx Web服务器:
- 使用火狐浏览器访问
- 使用curl访问 (虚拟机内访问)
方案
提前准备运维课程所需的所有虚拟机,为后续所有实验做准备
表-1 主机列表
其中PROXY 就是代理服务器,类似漫画死神的代理人。
第一天课程需要使用2台虚拟机,其中一台作为Nginx服务器(proxy)、另外一台作为测试用的客户机(client)
步骤
实现此案例需要按照如下步骤进行。
步骤一:构建Nginx服务器
1)使用源码包安装nginx软件包
- [root@proxy ~]# yum -y install gcc make #安装编译工具
- [root@proxy ~]# yum -y install pcre-devel #正则表达式依赖包
- [root@proxy ~]# yum -y install openssl-devel #SSL加密依赖包
- [root@proxy ~]# tar -xf nginx-1.22.1.tar.gz # 原地释放软件解压包
- [root@proxy ~]# cd nginx-1.22.1 #切换到软件路径
- [root@proxy nginx-1.22.1]# ./configure \
- --prefix=/usr/local/nginx \ #指定安装路径
- --user=nginx \ #指定用户 防止组/用户 失管失控,恶意破坏服务器
- --group=nginx \ #指定组
- --with-http_ssl_module #开启SSL加密功能
- [root@proxy nginx-1.22.1]# make #编译
- [root@proxy nginx-1.22.1]# make install #安装
- cd /usr/local/nginx/ #切换目录
- ls /usr/local/nginx/ #查看目录
下面这几个比较重要的文件
conf 配置文件 sbin 主程序
html 网站页面 logs 日志
2)nginx命令的用法
- [root@proxy nginx]# useradd -s /sbin/nologin nginx
- /usr/local/nginx/sbin/nginx #启动服务
- /usr/local/nginx/sbin/nginx -s stop #关闭服务
- /usr/local/nginx/sbin/nginx -s reload #重新加载配置文件
- /usr/local/nginx/sbin/nginx -V #查看软件信息
ss命令可以查看系统中启动的端口信息,该命令常用选项如下:
(这几个命令可以知道,那个用户IP 查看了你架设的网站)。
使用标准: -antpu 和 ss -nutlp | grep 服务名 的使用有一定区别,需要注意。
-a显示所有端口的信息
-n以数字格式显示端口号
-t显示TCP连接的端口
-u显示UDP连接的端口
-l显示服务正在监听的端口信息,如httpd启动后,会一直监听80端口
-p显示监听端口的服务名称是什么(也就是程序名称)
nginx服务默认通过TCP 80端口监听客户端请求:
- [root@proxy nginx]# ss -anptu | grep nginx
步骤二:客户端访问测试
Nginx服务默认首页文档存储目录为/usr/local/nginx/html/,在此目录下默认有一个名为index.html的文件,使用客户端访问测试页面:
- systemctl stop firewalld #关闭防火墙
- [root@client ~]# curl http://192.168.88.5 #如果没有client则访问192.168.99.5
- <html>
- <head>
- <title>Welcome to nginx!</title>
- </head>
- ...
另外使用火狐浏览器访问
测试页面
1)测试网站自定义页面:
注意:要在html 目录下新建 对应的测试网页文件。
- [root@proxy nginx]#echo "xixi-test~~~" > html/test.html #创建新页面
http://192.168.99.5/abc.html #访问新页面
火狐访问192.168.99.5/abc.html #如果无效,可以按ctrl+f5强制刷新
2)测试成品网站页面:
你可以网上下几个网站模版--》 然后放到真机桌面---》在拷贝到虚拟机中,创建的软件包文件夹中,然后解压(和上面方法同理)
模版内容包括:用户注册、用户登录主页。
- [root@proxy nginx]# yum -y install unzip #安装解压缩工具
- [root@proxy nginx]# unzip ~/自建软件存放文件夹/网站模版.zip #解压缩网站模板 lnmp_soift是你自己在虚拟机中创建的 软件存放文件夹,里面存放你下载的网站模版压缩包
- [root@proxy nginx]# cp -r 网站模版/* html/ #拷贝网站模板文件到nginx的网页目录,如果有覆盖提示就输入 y 回车 解压好模板后,才复制到 HTML目录下
最后火狐访问192.168.99.5
二、用户认证
案例2:用户认证
问题
沿用练习一,通过调整Nginx服务端配置,实现以下目标:
- 访问Web页面需要进行用户认证
- 用户名为:tom,密码为:123456
方案
通过Nginx实现Web页面的认证,需要修改Nginx配置文件,在配置文件中添加auth语句实现用户认证。最后使用htpasswd命令创建用户及密码即可,效果如图-1所示。
图-1
步骤
实现此案例需要按照如下步骤进行。
步骤一:修改Nginx配置文件
1)修改/usr/local/nginx/conf/nginx.conf
注意:如果配置文件已经被无意修改,自己不知道怎么拍错,这时候需要使用配置文件的模版来替换它。 用法: cp conf/nginx.conf.default conf/nginx.conf 恢复默认配置方法
- [root@proxy nginx]# vim /usr/local/nginx/conf/nginx.conf
- .. ..
- server {
- listen 80;
- server_name localhost;
- auth_basic "Input Password:"; #认证提示符信息
- auth_basic_user_file "/usr/local/nginx/pass"; #认证的密码文件
- location / {
- root html;
- index index.html index.htm;
- }
- }
2)生成密码文件,创建用户及密码
使用htpasswd命令创建账户文件,需要确保系统中已经安装了httpd-tools。
(使用了该模块,某某登录你的网站,就要实行用户认证,可以避免被它人随意访问)
- [root@proxy nginx]# yum -y install httpd-tools
- [root@proxy nginx]# htpasswd -c /usr/local/nginx/pass tom #创建密码文件
- New password:
- Re-type new password:
- Adding password for user tom
3)重新加载配置
- [root@proxy nginx]# /usr/local/nginx/sbin/nginx -s reload #重新加载配置文件
- #请先确保nginx是启动状态,否则运行该命令会报错,报错信息如下:
- #[error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
步骤二:客户端测试
打开浏览器访问http://192.168.99.5。
可以看到用户名与密码的对话框,需要通过认证才能看到网页内容
2)追加账户
- htpasswd /usr/local/nginx/pass jerry #追加用户,不使用-c选项
- New password:
- Re-type new password:
- Adding password for user jerry
- [root@proxy ~]# cat /usr/local/nginx/pass
三、WEB虚拟主机
案例3:基于域名的虚拟主机
问题
配置基于域名的虚拟主机,实现两个基于域名的虚拟主机,域名分别为www.a.com和www.b.com
步骤
实现此案例需要按照如下步骤进行。
步骤一:修改配置文件
1)修改Nginx服务配置,添加相关虚拟主机配置如下
- [root@proxy nginx]# vim /usr/local/nginx/conf/nginx.conf
- http { #最主要的配置服务,有多个小型服务组件组成。
- .. ..
- server { # server{ } 括号里存放监听的端口号和服务 网页、
- listen 80; #端口
- server_name www.b.com; #新虚拟主机定义域名
- location / {
- root html_b; #指定网站根路径
- index index.html index.htm; #默认页面 首先检查HTML格式,次要检查HTM格式网页文件。
- }
- }
- server {
- listen 80; #端口
- server_name www.a.com; #默认的虚拟主机,修改域名
- location / {
- root html; #指定网站根路径
- index index.html index.htm;
- }
- }
- }
2)创建网站根目录及对应首页文件
- sbin/nginx -s reload #之后重新加载配置文件,服务必须是开启状态
- [root@proxy nginx]# mkdir html_b #创建b网站的目录
- echo "nginx-A~~~" > html/index.html #创建a网站测试页
- echo "nginx-B~~~" > html_b/index.html #创建b网站测试页
- vim /etc/hosts #修改hosts文件添加ip和域名的映射关系
- 192.168.99.5 www.a.com www.b.com
- curl www.a.com #检测a网站或b网站都可以看到页面
另外:
windows环境配置hosts文件
C:\Windows\System32\drivers\etc\hosts
右键---属性---安全---编辑---users---完全控制打钩
过程中不要更改WINDOWS中存放的 网址。
然后用文本打开hosts,在最后添加,下面是测试网址。
192.168.99.5 www.a.com www.b.com
步骤三:其他类型的虚拟主机(选做)
1.基于端口的虚拟主机(参考模板)
- server {
- listen 8080; #端口
- server_name www.a.com; #域名
- ......
- }
- server {
- listen 8000; #端口
- server_name www.a.com; #域名
- .......
- }
2.基于IP的虚拟主机(参考模板)
- server {
- listen 192.168.88.5:80; #IP地址与端口
- server_name www.a.com; #域名
- ... ...
- }
- server {
- listen 192.168.99.5:80; #IP地址与端口
- server_name www.a.com;
- ... ...
- }
四、HTTPS 加密网址
SSL虚拟主机
问题
配置基于加密网站的虚拟主机,实现以下目标:
- 该站点通过https访问
- 通过私钥、证书对该站点所有数据加密
方案
源码安装Nginx时必须使用--with-http_ssl_module参数,启用加密模块,对于需要进行SSL加密处理的站点添加ssl相关指令(设置网站需要的私钥和证书)。
加密算法一般分为对称算法、非对称算法、信息摘要。
对称算法有:AES、DES,主要应用在单机数据加密。
非对称算法有:RSA、DSA,主要应用在网络数据加密。
(非对称不是黎明杀机也不是第5人格哈,是公钥加密,私钥解密)
信息摘要:MD5、sha256,主要应用在数据完整性校验。
(每一个重要功能的网站都会面临黑客的各种手段攻击和网络抓包数据后进行敲诈勒索,所以加密手段也随之产生。)
步骤
实现此案例需要按照如下步骤进行。
步骤一:配置SSL虚拟主机
1)修改Nginx配置文件,设置加密网站的虚拟主机
- [root@proxy nginx]#vim /usr/local/nginx/conf/nginx.conf
- … …
- server {
- listen 443 ssl; #配置文件最下面位置能找到,443是该服务的端口号。
- server_name localhost;
- ssl_certificate cert.pem; #这里是证书文件 两个文件都需要你在 conf目录下创建对应文件夹。 别忘记了
- ssl_certificate_key cert.key; #这里是私钥文件 两个文件都需要你在 conf目录下创建对应文件夹。 别忘记了 ^_^
- ssl_session_cache shared:SSL:1m;
- ssl_session_timeout 5m;
- ssl_ciphers HIGH:!aNULL:!MD5; #MD5是一种验证密码完整性的方式
- ssl_prefer_server_ciphers on;
- location / {
- root https; #加密网站根目录
- index index.html index.htm;
- }
- }
2)生成私钥与证书
(下面的选项因为是练习,你可以随意回答。正式上网时需要正确填写)
- [root@proxy nginx]#openssl genrsa > conf/cert.key #生成私钥
- [root@proxy nginx]#openssl req -x509 -key conf/cert.key > conf/cert.pem #生成证书,生成过程会询问诸如你在哪个国家之类的问题,可以随意回答
- Country Name (2 letter code) [XX]:dc 国家名
- State or Province Name (full name) []:dc 省份
- Locality Name (eg, city) [Default City]:dc 城市
- Organization Name (eg, company) [Default Company Ltd]:dc 公司
- Organizational Unit Name (eg, section) []:dc 部门
- Common Name (eg, your name or your server's hostname) []:dc 服务器名称
- Email Address []:dc@dc.com 电子邮件
3)重新加载配置
步骤二:客户端验证
- [root@proxy nginx]# mkdir https #创建安全网站的目录
- [root@proxy nginx]# echo "https~~~~ " > https/index.html #创建安全网站的页面
- [root@proxy nginx]# sbin/nginx #服务没开的话开服务
- [root@proxy nginx]# sbin/nginx -s reload #已经开了的话重加载配置
- [root@proxy nginx]# curl -k https://192.168.99.5 #检验,-k是忽略安全风险
- https~~~~ #看到这个内容就说明实验成功
- [root@proxy nginx]# systemctl stop firewalld #如果用真机的火狐浏览器测试需要
- 关闭防火墙,然后输入https://192.168.99.5 进行测试
OPERATION DAY2
一、部署LNMP 平台环境
LANMP含义:
网站服务软件还有 Apache。
部署LNMP环境
目的:
安装部署LNMP环境实现动态网站解析
静态网站 在不同环境下访问,网站内容不会变化
动态网站 在不同环境下访问,网站内容有可能发生变化
- 安装部署Nginx、MariaDB、PHP、PHP-FPM;
- 启动Nginx、MariaDB、FPM服务;
- 并测试LNMP是否工作正常。
方案
目前的网站一般都会有动态和静态数据,默认nginx仅可以处理静态数据,用户访问任何数据都是直接返回对应的文件,如果如果访问的是一个脚本的话,就会导致直接返回一个脚本给用户,而用户没有脚本解释器,也看不懂脚本源代码!
因此需要整合LNMP(Linux、Nginx、MySQL、PHP)实现动态网站效果。
合理配置才能实现网站动态效果哦
操作过程中需要安装的软件列表如下:
- nginx
- mariadb、mariadb-server、mariadb-devel
- php、php-fpm、php-mysqlnd
备注:mariadb(数据库客户端软件)、mariadb-server(数据库服务器软件)、mariadb-devel(其他客户端软件的依赖包)、php(解释器)、php-fpm(进程管理器服务)、php-mysqlnd(PHP的数据库扩展包)。
步骤
实现此案例需要按照如下步骤进行。
步骤一:安装软件
1)使用yum安装基础依赖包
为了不受到之前实验的影响,可以先删除nginx,重安装
(主要怕你配置文件写的东西冲突,次要是为了练习该服务的安装与配置)
- [root@proxy nginx]#killall nginx #停止nginx程序
- [root@proxy nginx]#cd /root/lnmp_soft/nginx-1.22.1
- [root@proxy nginx-1.22.1]#rm -rf /usr/local/nginx #删除nginx原有目录
- [root@proxy nginx-1.22.1]# yum -y install gcc make openssl-devel pcre-devel
- [root@proxy nginx-1.22.1]# ./configure \
- > --user=nginx --group=nginx \
- > --with-http_ssl_module
- [root@proxy nginx-1.22.1]# make && make install
- .. ..
3)安装MariaDB
- [root@proxy ~]# yum -y install mariadb mariadb-server mariadb-devel
4)php和php-fpm
- [root@proxy ~]# yum -y install php php-mysqlnd
- [root@proxy ~]# yum -y install php-fpm
步骤二:启动服务
1)启动Nginx服务
如果服务器上已经启动了其他监听80端口的服务(如httpd),则需要先关闭该服务。
- [root@proxy ~]# systemctl stop httpd #如果该服务存在则关闭该服务
- [root@proxy ~]# /usr/local/nginx/sbin/nginx #启动Nginx服务
- [root@proxy ~]# ss -utnlp | grep :80
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 #设置开机启动
4)使用PHP测试页面
准备:网上下载一个PHP格式的测试页面———放到软件包文件中,再创建一个存放PHP文件的文件夹,存放它———拷贝到相关网页目录下。
- cp ~/lnmp_soft/php_scripts/test.php /usr/local/nginx/html #拷贝动态网站测试页面到nginx中
使用浏览器访问192.168.99.5/test.php 则无法看到页面内容,而是会当成要下载的文件,因为浏览器无法解析php代码!
案例2:构建LNMP平台
问题
沿用练习一,通过调整Nginx服务端配置,实现以下目标:
- 配置Fast-CGI支持PHP网页解析
Fast-CGI是快速公共(通用)网关接口,可以连接如nginx等网站程序到网站的语言解释器(比如php) ,php-fpm进程使用了Fast-CGI解析动态网站页面
- 创建PHP测试页面,测试使用PHP连接数据库的效果
方案
需要延续练习一的实验内容,通过修改Nginx及php-fpm配置文件实现对PHP页面的支持。
步骤
实现此案例需要按照如下步骤进行。
步骤一: php-fpm配置文件
1)打开php-fpm配置文件,注意该配置文件中;(分号)是注释
- [root@proxy etc]# vim /etc/php-fpm.d/www.conf
- [www]
- listen = 127.0.0.1:9000 #php-fpm端口号(使用网络通信这是真机本地IP地址)
- ;listen = /run/php-fpm/www.sock #注释该行
- pm.max_children = 50 #最大进程数量
- pm.start_servers = 5 #最小进程数量
- [root@proxy etc]#systemctl restart php-fpm #重启服务
步骤二:修改Nginx配置文件并启动服务
- [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
- ...
- 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配置文件
- }
步骤三:测试LNMP架构能否解析PHP页面
启动或者重加载nginx
- [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
- #请先确保nginx是启动状态,否则运行该命令会报错,报错信息如下:
- #[error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
再次使用浏览器访问192.168.99.5/test.php 可以看到页面内容!
2)再测试连接数据库的PHP页面
可以参考lnmp_soft/php_scripts/mysql.php
- cp ~/lnmp_soft/php_scripts/mysql.php /usr/local/nginx/html #拷贝动态网站测试页面到nginx中
3)客户端使用浏览器访问服务器PHP首页文档,检验是否成功
http://192.168.99.5/mysql.php
然后修改数据库内容进行测试
- mysql #进入数据库
- create user dc@localhost identified by '123'; #创建测试账户
- quit; #退出
再刷新192.168.99.5/mysql.php 可以看到新创建的用户
LNMP常见问题
如果仅访问ip就能看到动态网站的默认页,可以按下列方法配置
- ...
- location / {
- root html;
- index index.php index.html index.htm;
- #设置默认首页为index.php,当用户在浏览器地址栏中只写域名或IP,不说访问什么页面时,服务器会把默认首页index.php返回给用户
- }
- ...
Nginx的默认访问日志文件为/usr/local/nginx/logs/access.log
Nginx的默认错误日志文件为/usr/local/nginx/logs/error.log
PHP默认错误日志文件为/var/log/php-fpm/www-error.log
如果动态网站访问失败,可用参考错误日志,查找错误信息。
看到以上test.php、mysql.php两个页面说明nginx不但能支持静态网站,也能解析动态网站了,这种情况也可以记作nginx实现了动静分离
使用socket方式连接php-fpm
实现此案例需要按照如下步骤进行。
步骤一: php-fpm配置文件
1)打开php-fpm配置文件
- [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 #重启服务
步骤二:修改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
二、FastCGI 模块
两种配置方法,都在上面练习中。需要哪种方式就注释相反的连接方式即可。
三、NGINX 高级技术应用
案例3:地址重写
问题
- 通过调整Nginx服务端配置,实现地址重写功能
方案
关于Nginx服务器的地址重写,主要用到的配置参数是rewrite
- rewrite regex replacement flag
- rewrite 旧地址 新地址 [选项] #用法
步骤
实现此案例需要按照如下步骤进行。
步骤一:修改配置文件(访问a.html重定向到b.html)
1)修改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;
- location / {
- root html;
- index index.html index.htm;
- }
- }
- [root@proxy ~]# echo "nginx-B~~" > /usr/local/nginx/html/b.html
2)重新加载配置文件
- [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
3)客户端测试
http://192.168.99.5/a.html
步骤二:测试redirect选项
1)修改Nginx服务配置:
- [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
- .. ..
- server {
- listen 80;
- server_name localhost;
- rewrite ^/a.html$ /b.html redirect; #重定向功能
- location / {
- root html;
- index index.html index.htm;
- }
- }
2)重新加载配置文件
- [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
3)客户端测试,地址栏同时发生变化
http://192.168.99.5/a.html
步骤三:不同网站间跳转
修改Nginx服务配置实现访问192.168.99.5的请求重定向至www.abc.com #这里只是举例子,别在真机上重定向别人或企业的域名,尽量重定向自己写的。(*^▽^*)
# 好的网站域名是需要很多 MONEY才能买到的,但是一个公司一个企业开头就必须买个好域名,才会更加有辨识度,吸引更多的访客驻足。 对域名感兴趣的可以去搜索看看。(* ̄︶ ̄)
- [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
- .. ..
- server {
- listen 80;
- server_name localhost;
- rewrite / http://www.abc.com/;
- location / {
- root html;
- index index.html index.htm;
- }
- }
2)重新加载配置文件
- [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
3)客户端测试
http://192.168.99.5
步骤四:修改配置文件(访问192.168.99.5/下面子页面,重定向至www.abc.com/下相同的子页面)
1) 修改Nginx服务配置
- [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
- .. ..
- server {
- listen 80;
- server_name localhost;
- rewrite /(.*) http://www.abc.com/$1;
- location / {
- root html;
- index index.html index.htm;
- }
- }
2)重新加载配置文件
- [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
3)客户端测试
http://192.168.99.5/test
步骤五:实现不同浏览器跳转到不同页面
1) 创建网页目录以及对应的页面文件:
- [root@proxy nginx]# mkdir html/firefox
- [root@proxy nginx]# echo firefox~~ > html/firefox/abc.html #火狐专用页面
- [root@proxy nginx]# echo others~~ > html/abc.html #其他浏览器专用页面
火狐访问192.168.99.5/abc.html时可以看到html/firefox/abc.html里面内容
其他浏览器访问192.168.99.5/abc.html时可以看到html/abc.html里面内容
2) 修改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的内置变量,存储了用户的信息,比如用的什么浏览器,~是匹配正则 *是忽略大小写
- }
- }
3)重新加载配置文件
- [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
4)客户端测试
- 分别用火狐浏览器与其他浏览器访问相同地址http://192.168.99.5/abc.html,可以得到不同结果
地址重写的选项
redirect 临时重定向,状态码302,爬虫不更新URI
permanent 永久重定向,状态码301,爬虫更新URI
last 不再读其他语句,但还会继续匹配其他location语句
- echo "nginx-c~~" > html/c.html #准备素材c页面
- rewrite /a.html /b.html last; #没有其他location语句时,打开b页面
- rewrite /b.html /c.html ;
break 不再读其他语句,结束请求
- location / { #此处为默认的location
- rewrite /a.html /b.html break; #break可以阻止后面的语句
- root html;
- index index.html index.htm;
- }
- location /b.html { #这里是新添加的location
- rewrite /b.html /c.html;
- }
OPERATION DAY3
注意:此次练习会使用到PROXY 与 WEB1 ,2 ,client 虚拟机。
一、NGINX 调度器
1 案例1:Nginx反向代理
1.1 问题
使用Nginx实现Web反向代理功能,实现如下功能:
- 后端Web服务器两台,可以使用httpd实现
- Nginx采用轮询的方式调用后端Web服务器
- 两台Web服务器的权重要求设置为不同的值
- 最大失败次数为2,失败超时时间为30秒
1.2 方案
使用4台虚拟机,其中一台作为Nginx代理服务器,该服务器需要配置两块网卡,IP地址分别为192.168.88.5和192.168.99.5,两台Web服务器IP地址分别为192.168.99.100和192.168.99.200。客户端测试主机IP地址为192.168.88.10。如图-1所示。
图-1
1.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:部署实施后端Web服务器
环境准备,同网段要互通,检查yum
1)部署后端Web1服务器
后端Web服务器可以简单使用yum方式安装httpd实现Web服务,为了可以看出后端服务器的不同,可以将两台后端服务器的首页文档内容设置为不同的内容。
- [root@web1 ~]#yum -y install vim net-tools bash-completion psmisc httpd
- [root@web1 ~]# echo "web1" > /var/www/html/index.html
- [root@web1 ~]# systemctl restart httpd
- systemctl stop firewalld #关闭防火墙
2)部署后端Web2服务器
- [root@web2 ~]#yum -y install vim net-tools bash-completion psmisc httpd
- [root@web2 ~]# echo "web2" > /var/www/html/index.html
- [root@web2 ~]# systemctl restart httpd
- systemctl stop firewalld #关闭防火墙
3)到proxy主机测试
- [root@proxy nginx]# curl 192.168.99.100
- web1~~
- [root@proxy nginx]# curl 192.168.99.200
- web2~~
步骤二:配置Nginx服务器,添加服务器池,实现反向代理功能
如果需要可以先还原proxy主机的nginx
- [root@proxy nginx]# cd ~/lnmp_soft/
- [root@proxy lnmp_soft]# killall nginx
- [root@proxy lnmp_soft]# rm -rf /usr/local/nginx/
- [root@proxy lnmp_soft]# rm -rf nginx-1.22.1
- [root@proxy lnmp_soft]# tar -xf nginx-1.22.1.tar.gz
- [root@proxy lnmp_soft]# cd nginx-1.22.1/
- [root@proxy lnmp_soft]#yum -y install gcc make pcre-devel openssl-devel
- [root@proxy nginx-1.22.1]# ./configure
- [root@proxy nginx-1.22.1]#make
- [root@proxy nginx-1.22.1]#make install
1)修改/usr/local/nginx/conf/nginx.conf配置文件
- [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
- .. ..
- http {
- .. ..
- #使用upstream定义后端服务器集群,集群名称任意(如webserver)
- #使用server定义集群中的具体服务器和端口
- upstream webserver {
- server 192.168.99.100:80;
- server 192.168.99.200:80;
- }
- .. ..
- server {
- listen 80;
- server_name localhost;
- location / {
- #通过proxy_pass将用户的请求转发给webserver集群
- proxy_pass http://webserver;
- }
- }
- .. ..
- }
2)重新加载配置
- [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
- #请先确保nginx是启动状态,否则运行该命令会报错,报错信息如下:
- #[error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
3)客户端使用火狐浏览器或curl多次访问proxy主机可以看到网站的轮询效果
步骤二:配置upstream服务器集群池属性
1)设置权重
weight可以设置后台服务器的权重,权重越大任务的分配量就越大
(能力越大,责任越大,能力越小,责任越小。bushi)
- [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
- upstream webserver {
- server 192.168.99.100 weight=2;
- server 192.168.99.200;
- }
重新加载配置并访问,可以看到web1的任务量增加
设置健康检查,max_fails可以设置后台服务器的失败次数,fail_timeout可以设置后台服务器的失败超时时间。
- [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
- upstream webserver {
- server 192.168.99.100;
- server 192.168.99.200 max_fails=2 fail_timeout=30;
- }
重新加载配置并访问,
sbin/nginx -s reload
测试时,先将web2的httpd服务关闭,回到proxy访问集群页面curl 192.168.99.5
只会显示web1的页面,此时即使将web2的httpd服务开启也无效,因为要等
待30秒
步骤三:配置upstream服务器集群的调度算法
1)设置相同客户端访问相同Web服务器
- [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
- upstream webserver {
- ip_hash;
- server 192.168.99.100 ;
- server 192.168.99.200 ;
- }
2)重新加载配置
- [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
客户端使用浏览器访问代理服务器测试只会见到一个页面
步骤四:添加down标记
down标记可以让集群主机暂时不参与集群活动
- [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
- upstream webserver {
- server 192.168.99.100 ;
- server 192.168.99.200 down;
- }
重新加载配置
- [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
客户端使用浏览器访问代理服务器测试只会见到99.100
2 案例2:Nginx的TCP/UDP调度器
2.1 问题
使用Nginx实现TCP/UDP调度器功能,实现如下功能:
- 后端SSH服务器两台
- Nginx编译安装时需要使用--with-stream,开启ngx_stream_core_module模块
- Nginx采用轮询的方式调用后端SSH服务器
2.2 方案
使用4台虚拟机,其中一台作为Nginx代理服务器,该服务器需要配置两块网卡,IP地址分别为192.168.88.5和192.168.99.5,两台SSH服务器IP地址分别为192.168.99.100和192.168.99.200。客户端测试主机IP地址为192.168.88.10。如图-2所示。
图-2
2.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:部署支持4层TCP/UDP代理的Nginx服务器
1)部署nginx服务器
编译安装必须要使用--with-stream参数开启4层代理模块。
- [root@proxy nginx]# cd ~/lnmp_soft/nginx-1.22.1/
- [root@proxy nginx-1.22.1]# killall nginx
- [root@proxy nginx-1.22.1]# rm -rf /usr/local/nginx/
- [root@proxy nginx-1.22.1]# ./configure \
- > --with-stream #开启4层代理功能
- [root@proxy nginx-1.22.1]# make && make install #编译并安装
- [root@proxy nginx-1.22.1]# /usr/local/nginx/sbin/nginx -V #查看安装模块情况
步骤二:配置Nginx服务器,添加服务器池,实现TCP/UDP代理功能
1)修改/usr/local/nginx/conf/nginx.conf配置文件
- [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
- stream {
- upstream backend {
- server 192.168.99.100:22; #后端SSH服务器的IP和端口
- server 192.168.99.200:22;
- }
- server {
- listen 12345; #Nginx监听的端口
- proxy_pass backend;
- }
- }
- http {
- .. ..
- }
2)重新加载配置
- [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
- #请先确保nginx是启动状态,否则运行该命令会报错,报错信息如下:
- #[error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
3)客户端使用访问代理服务器测试轮询效果
- [root@client ~]# ssh 192.168.88.5 -p 12345 #使用该命令多次访问查看效果
注意:如果配置没有错误,但无法反复登陆web1与web2,可以按下列方式解决
- rm -rf ~/.ssh/known_hosts #在proxy中删除记录文件
- ssh 192.168.99.5 -p 12345 #再次尝试登录,会连接到另外一台集群主机
如果你是克隆WEB1,2。CLIENT虚拟机,可能会出现报错情况。因为集群代码编写时,会监测远程登录的主机IP,默生或错误时就会自动断开SSH远程连接。
应对方法:需要删除 已经读取的HOSTS 文件内容。
rm -rf ~/.ssh/known-hosts
3 案例3:Nginx常见问题处理
3.1 问题
本案例要求对Nginx服务器进行适当优化,解决如下问题,以提升服务器的处理性能:
- 如何自定义返回给客户端的404错误页面
- 如何查看服务器状态信息
- 如果客户端访问服务器提示“Too many open files”如何解决
- 如何解决客户端访问头部信息过长的问题
- 如何让客户端浏览器缓存数据
客户机访问此Web服务器验证效果:
- 使用ab压力测试软件测试并发量
- 编写测试脚本生成长头部信息的访问请求
- 客户端访问不存在的页面,测试404错误页面是否重定向
3.2 步骤
实现此案例需要按照如下步骤进行。
步骤一:自定义报错页面
HTTP常见状态码列表:
200 正常
301 & 302 重定向
400 请求语法错误
401 访问被拒绝
403 禁止访问
404 资源找不到
414 请求URI头部太长
500 服务器内部错误
502 代理服务器无法正常获取下一个服务器正常的应答
1)优化前,客户端使用浏览器访问不存在的页面,会提示404文件未找到
2)修改Nginx配置文件,自定义报错页面
QQ很早就用到了这个功能,当时取得了不错的市场反响。
- [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
- .. ..
- charset utf-8; #仅在需要中文时修改该选项
- error_page 404 /test.jpg; #自定义错误页面为一张图片,图片可以从真机拷入
- .. ..
- [root@proxy ~]# nginx -s reload
二、NGINX优化
如何查看服务器状态信息(非常重要的功能)
编译安装时使用--with-http_stub_status_module开启状态页面模块
如果要添加模块,但不想删除之前nginx数据,可以将nginx源码目录下的objs目录中的nginx文件拷贝到nginx的sbin目录下替代现有主程序,然后killall nginx 再重启即可
- [root@proxy nginx]# cd ~/lnmp_soft/nginx-1.22.1/
- [root@proxy nginx-1.22.1]# ./configure \
- > --with-stream #开启4层代理模块
- > --with-http_stub_status_module #开启status状态页面
- [root@proxy nginx-1.22.1]# make #编译
- [root@proxy nginx-1.22.1]# killall nginx
- [root@proxy nginx-1.22.1]# cp objs/nginx /usr/local/nginx/sbin/ #覆盖原文件
- [root@proxy nginx-1.22.1]# /usr/local/nginx/sbin/nginx #开启nginx
2)修改Nginx配置文件,定义状态页面
- [root@proxy ~]# cat /usr/local/nginx/conf/nginx.conf
- … …
- location /status {
- stub_status on;
- #allow IP地址;
- #deny all;
- }
- … …
- [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
4)优化后,查看状态页面信息
- [root@proxy ~]# curl http://192.168.99.5/status
- Active connections: 1
- server accepts handled requests
- 10 10 3
- Reading: 0 Writing: 1 Waiting: 0
Active connections:当前活动的连接数量。
Accepts:已经接受客户端的连接总数量。
Handled:已经处理客户端的连接总数量。
Requests:客户端发送的请求数量。
Reading:当前服务器正在读取客户端请求头的数量。
Writing:当前服务器正在写响应信息的数量。
Waiting:当前多少客户端在等待服务器的响应。
补充知识:
PV(Page View):页面浏览量,即网站页面在一定时间内被访问的页面总次数,相同用户刷新相同页面也被计算一次,反映了用户对网站内容的浏览情况,可以通过访问日志得到。
UV(Unique Visitor):独立访客数,统计一定周期内,访问网站的独立用户数量,不重复计算同一用户的多次访问。可以通过访问日志或根据用户的唯一标识去重得到
PV与UV都是衡量业务活跃度的重要指标,尤其网站改版升级后,可以进行对比来判断业务情况
优化Nginx并发量
1)优化前使用ab高并发测试,使用web1或proxy自己作为海量客户(防火墙与selinux都关闭
- [root@proxy ~]# ab -n 100 -c 100 http://192.168.99.5/ #-n任务量,-c是连接数
- ...
- ...
- 100% #成功
- [root@proxy ~]# ab -n 2000 -c 2000 http://192.168.99.5/
- Benchmarking 192.168.99.5 (be patient)
- socket: Too many open files (24) #失败
2)修改Nginx配置文件,增加并发量
- [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
- .. ..
- worker_processes 2; #与CPU核心数量一致
- events {
- worker_connections 50000; #每个worker最大并发连接数
- }
- .. ..
- [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
3)优化Linux内核参数(最大文件数量)
- [root@proxy ~]# ulimit -n #查看最大文件数量
- [root@proxy ~]# ulimit -n 100000 #临时设置最大文件数量
- [root@proxy ~]# vim /etc/security/limits.conf
- .. ..
- * soft nofile 100000
- * hard nofile 100000
- #该配置文件分4列,分别如下:
- #用户或组 硬限制或软限制 需要限制的项目 限制的值
4)优化后测试服务器并发量
- [root@proxy ~]# ab -n 2000 -c 2000 http://192.168.99.5/
优化Nginx数据包头缓存,支持超长地址
优化前,使用脚本测试超长头部请求是否能获得响应
默认情况下nginx无法支持长地址栏,会报414错误
- [root@proxy ~]# cat lnmp_soft/buffer.sh
- #!/bin/bash
- URL=http://192.168.99.5/index.html?
- for i in {1..5000}
- do
- URL=${URL}v$i=$i
- done
- curl $URL #经过5000次循环后,生成一个超长的URL地址
- [root@proxy ~]# ./buffer.sh
- .. ..
- <center><h1>414 Request-URI Too Large</h1></center> #访问失败
2)修改Nginx配置文件,增加数据包头部缓存大小
- [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
- .. ..
- http {
- client_header_buffer_size 200k; #请求包头信息的缓存大小
- large_client_header_buffers 4 200k; #大请求包头部信息的缓存个数与容量
- .. ..
- }
- [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
3)优化后,使用脚本测试超长头部请求是否能获得响应
- [root@proxy ~]# ./buffer.sh
浏览器本地缓存静态数据
1)使用Firefox浏览器查看缓存
2)清空firefox本地缓存数据
3)修改Nginx配置文件,定义对静态页面的缓存时间
- [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
- server {
- listen 80;
- server_name localhost;
- location / {
- root html;
- index index.html index.htm;
- }
- location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
- expires 30d; #定义客户端缓存时间为30天
- }
- }
- [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
4)优化后,使用Firefox浏览器访问图片,再次查看缓存信息
http://192.168.99.5/day.jpg #图片可以用之前测试404自定义显示网页的图片。
在firefox地址栏内输入about:cache,查看本地缓存数据,查看是否有图片以及过期时间是否正确。
OPERATION DAY4
一、uWSGI
1 案例1:部署Python网站项目 (类似于前面课程中的PHP模块)
1.1 问题
配置Nginx使其可以将动态访问转交给uWSGI:
1.2 方案
安装Python工具及依赖
安装uWSGI并编写配置文件
1.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:首先练习目录中古关于python的tar 包 拷贝到虚拟机
想要尝试下载PYTHON 关于LIUNX版本的tar 包,
1)安装python依赖软件
- [root@proxy python]# yum -y install gcc make python3 python3-devel
2)安装项目依赖
- [root@proxy python]# pip3 install pytz-2022.6-py2.py3-none-any.whl
- [root@proxy python]# pip3 install Django-1.11.8-py2.py3-none-any.whl
- [root@proxy python]# pip3 install django-bootstrap3-11.0.0.tar.gz
3)测试项目
- [root@proxy python]# tar -xf python-project-demo.tar.gz
- [root@proxy python]# cd python-project-demo/
- [root@proxy python-project-demo]# python3 manage.py runserver 0.0.0.0:8000
之后可在浏览器访问192.168.99.5:8000,测试完毕后按ctrl + c
注意:测试时如果无法连接外网,可能需要将python-project-demo/learning_logs/templates/base.html文件中的特效注释
- <!-- {% bootstrap_css %}
- {% bootstrap_javascript %}
- -->
步骤二:
1)安装uWSGI
- [root@proxy python-project-demo]# cd ..
- [root@proxy python]# pip3 install uWSGI-2.0.21.tar.gz
- [root@proxy python]# vim myproject.ini
- [uwsgi]
- socket=127.0.0.1:8000 #与web服务(nginx)通信的接口
- chdir=/root/python/python-project-demo #项目的工作目录
- wsgi-file=learning_log/wsgi.py #指定项目中的wsgi.py配置文件
- daemonize=/var/log/uwsgi.log #指定日志文件位置
- #processes=4 #指定启动进程的数目
- #master=true #开启主进程管理模式
2)运行uWSGI
- [root@proxy python]# uwsgi --ini myproject.ini #读取myproject.ini运行uWSGI
3)修改nginx配置文件,添加uWSGI转发
- [root@proxy python]# vim /usr/local/nginx/conf/nginx.conf
- ...
- location / {
- uwsgi_pass 127.0.0.1:8000; #动态页面交给uWSGI
- include uwsgi_params; #调用uWSGI配置文件
- root html;
- index index.html index.htm;
- }
- ...
- [root@proxy python]# /usr/local/nginx/sbin/nginx
测试
使用浏览器访问192.168.99.5
二、灰度发布(金丝雀发布)
矿井中的金丝雀
17世纪,英国矿井工人发现,金丝雀对瓦斯这种气体十分敏感。空气中哪怕有极其微量的瓦斯,金丝雀也会停止歌唱;而当瓦斯含量超过一定限度时,虽然鲁钝的人类毫无察觉,金丝雀却早已毒发身亡。当时在采矿设备相对简陋的条件下,工人们每次下井都会带上一只金丝雀作为“瓦斯检测指标”,以便在危险状况下紧急撤离。
文本来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:财富自由
链接:https://www.zhihu.com/question/335832790/answer/2429023328
作用:1.及时发现问题。2.获取反馈,改进产品。3.及时控制问题影响范围。
就像游戏里的测试服,软件里的BAT版本,都是软件测试的前沿阵地。
2 案例2:配置Nginx实现用IP测试灰度发布
2.1 问题
本案例要求不同IP的客户访问相同代理时,可以看到不同集群主机的内容
2.2 方案
创建不同集群,准备多台集群主机,通过$remote_addr变量识别不同客户机
2.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:
1)使用proxy主机在nginx配置中创建集群
- [root@proxy nginx]# vim /usr/local/nginx/conf/nginx.conf
- http {
- ...
- upstream s8001 { #测试集群1
- server 192.168.99.100:8001;
- }
- upstream default { #正常业务集群
- server 192.168.99.100:80;
- server 192.168.99.200:80;
- }
- server {
- listen 80;
- server_name localhost;
- ...
- set $group "default"; #定义变量$group,默认值default
- if ($remote_addr ~ "192.168.99.1"){ #如果客户机ip是包含99.1就访问集群1
- set $group s8001;
- }
- location / {
- proxy_pass http://$group; #调用集群
- root html;
- index index.html index.htm;
- }
- ...
- }
- [root@proxy nginx]# sbin/nginx -s reload
为web1新建nginx虚拟主机
- [root@web1 nginx]# vim /usr/local/nginx/conf/nginx.conf
- http {
- ...
- server {
- listen 8001;
- server_name localhost;
- root html8001;
- index index.html;
- }
- ...
- }
- [root@web1 nginx]# sbin/nginx -s reload
- [root@web1 nginx]# mkdir html8001
- [root@web1 nginx]# echo web1-8001 > html8001/index.html
为web2新建nginx虚拟主机
- [root@web2 nginx]# vim /usr/local/nginx/conf/nginx.conf
- http {
- ...
- server {
- listen 8002;
- server_name localhost;
- root html8002;
- index index.html;
- }
- ...
- }
- [root@web2 nginx]# sbin/nginx -s reload
- [root@web2 nginx]# mkdir html8002
- [root@web2 nginx]# echo web2-8002 > html8002/index.html
4)测试
192.168.99.100访问192.168.99.5
其他ip访问192.168.99.5
步骤二:
1)继续添加集群2测试
- [root@proxy nginx]# vim /usr/local/nginx/conf/nginx.conf
- http {
- ...
- upstream s8001 { #测试集群1
- server 192.168.99.100:8001;
- }
- upstream s8002 { #测试集群2
- server 192.168.99.200:8002;
- }
- upstream default { #正常业务集群
- server 192.168.99.100:80;
- server 192.168.99.200:80;
- }
- server {
- listen 80;
- server_name localhost;
- ...
- set $group "default"; #定义变量$group,默认值default
- if ($remote_addr ~ "192.168.99.1"){ #如果客户机ip是99.1就访问集群1
- set $group s8001;
- }
- if ($remote_addr ~ "192.168.99.2"){ #如果客户机ip是99.2就访问集群2
- set $group s8002;
- }
- location / {
- proxy_pass http://$group; #调用集群
- root html;
- index index.html index.htm;
- }
- ...
- }
- [root@proxy nginx]# sbin/nginx -s reload
2)测试
192.168.99.100访问192.168.99.5
192.168.99.200访问192.168.99.5
其他ip访问192.168.99.5
3 案例3:通过不同用户ID测试灰度发布
3.1 问题
不同ID的客户访问相同代理时,可以看到不同集群主机的内容
3.2 方案
使用php页面,定义不同匹配语句
3.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:部署LNMP服务器相关软件
1)使用yum安装基础依赖包
- [root@proxy ~]# yum -y install gcc openssl-devel pcre-devel
- .. ..
2)源码安装Nginx (从真机拷贝到虚拟机)
- [root@proxy ~]# tar -xf nginx-1.22.1.tar.gz
- [root@proxy ~]# cd nginx-1.22.1
- [root@proxy nginx-1.22.1]# ./configure
- [root@proxy nginx-1.22.1]# make && make install
3)安装MariaDB数据库
- [root@proxy ~]# yum -y install mariadb mariadb-server mariadb-devel
4)安装PHP
- [root@proxy ~]# yum -y install php php-mysqlnd
- [root@proxy ~]# yum -y install php-fpm
5)修改Nginx配置文件(修改默认首页与动静分离)
- [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
- location / {
- root html;
- index index.php index.html index.htm;
- }
- location ~ \.php$ {
- root html;
- fastcgi_pass unix:/run/php-fpm/www.sock;
- fastcgi_index index.php;
- # fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
- include fastcgi.conf;
- }
- [root@proxy ~]# vim /etc/php-fpm.d/www.conf #打开php-fpm配置文件
- [www]
- ;listen = 127.0.0.1:9000 #注释或删除该行
- listen = /run/php-fpm/www.sock #socket方式(使用进程通信)
- listen.acl_users = apache,nginx,nobody #添加nobody账户
- [root@proxy ~]#systemctl restart php-fpm #重启服务
步骤二:启动LNMP服务器相关的服务
1)启动Nginx服务
这里需要注意的是,如果服务器上已经启动了其他监听80端口的服务软件(如httpd),则需要先关闭该服务,否则会出现冲突。
- [root@proxy ~]# systemctl stop httpd #如果该服务存在,则关闭该服务
- [root@proxy ~]# /usr/local/nginx/sbin/nginx
- [root@proxy ~]# ss -utnlp | grep :80
2)启动MySQL服务
- [root@proxy ~]# systemctl start mariadb
- [root@proxy ~]# systemctl status mariadb
3)启动PHP-FPM服务
- [root@proxy ~]# systemctl start php-fpm
- [root@proxy ~]# systemctl status php-fpm
4) 配置好lnmp之后,拷贝带登录效果的测试页面 (想要测试,可以真机下载PHP格式网页文件查看)
- cd ~/lnmp_soft/php_scripts/
- tar -xf php-session-demo.tar.gz #释放带登录功能的网页
- cp -r php-session-demo/* /usr/local/nginx/html/ #拷贝页面到nginx中使用火狐浏览器访问http://192.168.99.200/index.php 可以看到有登录界面的网页
注:这里index.php是登录前页面 ,home.php是登录后才能看的页面
步骤三:
1)修改home.php页面
- [root@proxy nginx]# vim html/home.php #修改php页面,将原有Welcome那行修改成以下状态
- Welcome : <?php
- if(preg_match("/^abc/",$_SESSION['login_user'])) { #preg_match匹配正则,如果登录账号是以abc开头,就连接99.100,否则连接99.200
- echo "<a href='http://192.168.99.100'>开始</a>";
- }
- else
- {
- echo "<a href='http://192.168.99.200'>开始</a>";
- }
- ?>
2)测试
浏览器访问192.168.99.5/index.php分别输入不同名称的账户,可以看到"开始"连接的是不同的地址,效果如图-1所示。
图-1
虚拟机中需要在加上 charset utf8; 才可以显示中文,下面练习有配置位置。
三、访问限制
4 案例4:配置网站限流限速
限流限速你可能一时弄不清楚,但是百度网盘你总知道了吧。一手限速玩的很6。每种VIP对应相应的下载速率。(⊙o⊙)…
这种技术你可以不用,但是你不能没有
4.1 问题
本案例要求配置nginx限流限速,效果如下:
- 使用Nginx配置全局限速100k
- 配置虚拟主机www.b.com限速200k,该网站根目录下的file_a目录中的所有数据限速300k,file_b目录中的所有数据不限速
4.2 方案
使用limit_rate指令限制速度
4.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:
1)定义limit_rate限制
- [root@web1 nginx]# vim /usr/local/nginx/conf/nginx.conf
- http {
- ...
- limit_rate 100k; #全局限速
- server {
- limit_rate 200k; #虚拟主机限速
- listen 80;
- server_name www.b.com;
- root html;
- index index.html;
- location /file_a {
- limit_rate 300k; #file_a目录限速300k
- }
- location /file_b {
- limit_rate 0k; #file_b目录不限速
- }
- }
2)创建测试目录
- [root@web1 nginx]# mkdir html/file_a
- [root@web1 nginx]# mkdir html/file_b
3)创建测试文件
- [root@web1 nginx]# dd if=/dev/zero of=html/test.img bs=100M count=1
- [root@web1 nginx]# dd if=/dev/zero of=html/file_a/test.img bs=100M count=1
- [root@web1 nginx]# dd if=/dev/zero of=html/file_b/test.img bs=100M count=1
下载测试
- wget www.a.com/test.img
- wget www.b.com/test.img
- wget www.b.com/file_a/test.img
- wget www.b.com/file_b/test.img
连接限制(非必须配置)
修改用户访问连接限制,使一个客户同时打开多个连接也无法突破限制
首先安装ngx_http_limit_conn_module模块
- http {
- limit_conn_zone $binary_remote_addr zone=addr:10m;
- server {
- location /app {
- limit_rate 30k;
- limit_conn addr 1 ;
- }
5 案例5:Nginx实现跨域
5.1 问题
网站中通过脚本调用不同端口、域名、协议的数据时被浏览器阻拦:
- 比如一个80端口的网站,无法访问同网站下8080端口的数据
5.2 方案
默认情况下,浏览器根据同源策略,会拦截非本网站端口、域名、协议的数据,通过配置Nginx跨域指令即可解决
5.3 步骤
实现此案例需要按照如下步骤进行。
创建2个虚拟主机,一个80端口(这个用默认配置即可),一个8080端口
1)为proxy主机的添加8080虚拟主机
- [root@proxy nginx]# vim conf/nginx.conf
- server {
- listen 8080;
- charset utf8;
- location / {
- root html;
- index index.html;
- }
- }
- [root@proxy nginx]# sbin/nginx -s reload
2)创建2个测试页面 (直接创建对应文件,再把内容拷贝进入相应文件中测试)
- [root@proxy nginx]# cat html/press.html
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>API-test</title>
- <script>
- var xhr = new XMLHttpRequest();
- xhr.open('GET', 'http://192.168.99.5:8080/api.html',true);
- xhr.send();
- function change(){
- if(xhr.readyState==4 && xhr.status==200){
- alert(xhr.responseText);
- }
- }
- </script>
- </head>
- <body>
- <input id="button" type="button" value="测试" οnclick="change();">
- </body>
- [root@proxy nginx]# cat html/api.html
- 8080虚拟主机测试页面
3)打开浏览器,访问http://192.168.99.5/press.html,点击按钮无反应,此时在8080虚拟主机中添加即可允许从任意地址请求8080的数据
- [root@proxy nginx]# vim conf/nginx.conf
- server {
- listen 8080;
- charset utf8;
- location / {
- add_header 'Access-Control-Allow-Origin' '*'; #服务器响应数据中添加允许跨域访问
- root html;
- index index.html;
- }
- }
- [root@proxy nginx]# sbin/nginx -s reload
再次访问http://192.168.99.5/press.html,点击按钮即可看到8080端口的页面
4)修改具体允许请求的地址,增加安全
- [root@proxy nginx]# vim conf/nginx.conf
- server {
- listen 8080;
- charset utf8;
- location / {
- add_header 'Access-Control-Allow-Origin' 'http://192.168.99.5';
- root html;
- index index.html;
- }
- }
- [root@proxy nginx]# sbin/nginx -s reload