Nginx 2(部署LNMP,组建网站集群)
接着上一篇随笔Nginx1继续记录相关操作
LNMP
静态网站 在不同情况下 访问网站的内容不会发生变化
动态网站 在不同情况下 访问网站的内容有可能发生变化 ,该种类网站显示内容效果更好,会让用户体验更好,更适合目前市场环境
部署LNMP环境,有了该环境,nginx就可以很便利的支持动态网站,这也是主流的企业网站平台之一
L linux系统
N nginx服务
M mariadb数据库(mysql)
p php网站开发语言
1,准备nginx以及相关软件包
cd ~/lnmp_soft/nginx-1.17.6/
killall nginx //杀掉nginx相关程序
rm -rf /usr/local/nginx/ //删除nginx原有目录
./configure --with-http_ssl_module //配置
make //编译
make install //安装
cd /usr/local/nginx/
sbin/nginx //开启服务
yum -y install mariadb mariadb-server mariadb-devel //安装
数据库的客户端、服务端、依赖包
yum -y install php //安装php程序包
yum -y install php-mysql //安装php与数据库关联的软件包
yum -y install php-fpm //安装可以让nginx具有动态网站解析
能力的软件包
如果yum的光盘镜像要实现自动挂载,要修改/etc/fstab文件最后一行添加
/dev/cdrom /mydvd iso9660 defaults 0 0
[root@proxy nginx]# systemctl start mariadb //开启数据库
[root@proxy nginx]# systemctl start php-fpm //开启php-fpm
netstat -ntulp | grep :3306 //检查数据库服务
netstat -ntulp | grep :9000 //检查php-fpm服务
2,修改nginx配置
打开nginx配置文件,第65到71行去掉注释,69行不用去
location ~ \.php$ { //~是使用正则表达式,匹配以.php结尾
root html;
fastcgi_pass 127.0.0.1:9000; //一旦用户访问了.php结尾的文件,就让nginx找后台的php-fpm(端口号9000)
fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf; //这里需要修改名称
}
sbin/nginx -s reload //重新加载nginx配置文件
3,测试效果
cd ~/lnmp_soft/php_scripts/
cp test.php /usr/local/nginx/html/ //拷贝动态网站页面到nginx中
http://192.168.2.5/test.php //浏览器测试
cp mysql.php /usr/local/nginx/html/
http://192.168.2.5/mysql.php //浏览器测试
mysql //进入数据库
create user dc@localhost identified by '123'; //创建账户配置密码
quit
http://192.168.2.5/mysql.php //刷新浏览器测试
-------------------------------------------------------
vim /etc/php-fpm.d/www.conf //与php-fpm相关的配置文件,此处
仅查看,无需修改
listen = 127.0.0.1:9000 //此处配置决定了php-fpm服务针对什么ip与
什么端口
pm.start_servers = 5 //一上来开启的进程数量,pstree可以查
看php-fpm(fastCGI)的进程数量,如果修改了需要重启php-fpm服务
pm.max_children = 50 //开启的fastCGI进程最大数量
---------------------------------------------------
四,地址重写,可以实现在用户访问特定地址后得到指定页面的功能
准备素材
[root@proxy nginx]# echo "nginx-A~~" > html/a.html
[root@proxy nginx]# echo "nginx-B~~" > html/b.html
cp conf/nginx.conf.default conf/nginx.conf
cp:是否覆盖"conf/nginx.conf"? y
地址重写语法格式:
rewrite 旧地址 新地址 选项
地址重写测试1:
vim conf/nginx.conf
rewrite ^/a.html$ /b.html; //打开nginx配置文件在42行添加
sbin/nginx -s reload
http://192.168.2.5/a.html //浏览器访问a页面但看到的是b页面内容
地址重写测试2:
rewrite ^/a.html$ /b.html redirect; //添加重定向
sbin/nginx -s reload
http://192.168.2.5/a.html //浏览器访问a页面时不但会跳转到b页面而且地址栏也发生变化
地址重写测试3:从老网站往新网站跳转
rewrite / http://www.tmooc.cn; //访问老网站,跳转到新的
sbin/nginx -s reload
使用火狐浏览器访问192.168.2.5 会跳到tmooc.cn
地址重写测试4:不同网站的相同页面的跳转
打开nginx主配置文件,在第42行添加
rewrite /(.*) http://www.tmooc.cn/$1; //访问老网站的某个页面时,跳转到
新网站对应的相同页面。前面使用正则表达式匹配用户输入的任意页面,并保存
起来(小括号在正则中的效果是保留,相当于复制),后面使用$1将之前保
存的页面地址粘贴到新网站
sbin/nginx -s reload //重加载配置文件
使用火狐浏览器访问192.168.2.5/a.html可以转到www.tmooc.cn/a.html (由于该网
站没有a.html页面,会出现404报错属于正常)
地址重写测试5
cd /usr/local/nginx
mkdir html/firefox //创建火狐浏览器专属目录
echo "proxy-firefox~~" > html/firefox/index.html //火狐浏览器专属页面
echo "proxy-other~~" > html/index.html //其他浏览器专属页面
修改nginx配置文件,将之前的rewrite语句删除,替换成以下内容
if ($http_user_agent ~* firefox) { //如果用户的浏览器使用了火狐,就执行
下面的rewrite任务,~代表匹配正则,*是不区分大小写,$http_user_agent是nginx
的内置变量,存储了用户的信息,比如用的什么浏览器
rewrite /index.html /firefox/index.html; //如果用户浏览器是火狐就跳转到火
狐专用目录的页面
}
sbin/nginx -s reload 重加载配置文件
分别使用火狐浏览器与其他浏览器访问192.168.2.5,可以得到两个不同页面内容
则成功
---------------------------------------------------------------------
二、地址重写的选项:
last 不再读其他rewrite
break 不再读其他语句
redirect 临时重定向 网站状态码是302
permanent 永久重定向 网站状态码是301
选项测试一:
修改配置文件,在42行、43行添加以下内容
rewrite /a.html /b.html last; //如果没有last,看a页面会得到c页面
的内容,加了last之后,就不会再读后面的rewrite了
rewrite /b.html /c.html;
sbin/nginx -s reload
[root@proxy nginx]# cat html/a.html //测试页面a,如果没有就创建
nginx-A~~
[root@proxy nginx]# cat html/b.html //测试页面b,如果没有就创建
nginx-B~~
[root@proxy nginx]# echo "nginx-C~~" > html/c.html //测试页面c
使用火狐访问192.168.2.5/a.html 看到的是b页面
192.168.2.5/index.html
break 不再读其他语句
按下列方式修改配置文件,将默认的location中加入rewrite语句,然后
再创建一个新的location也加入rewrite语句
vim conf/nginx.conf //打开配置文件,修改为以下状态,首先
在默认的location中添加rewrite,再新创建一个location也添加
rewrite语句。
location / { //此处为默认的
rewrite /a.html /b.html break; //如果这里的选项依然用last,则仅仅会阻止
该location之内的rewrite语句,换成break就可以阻止之后的所有rewrite语句
root html;
index index.html index.htm;
}
location /b.html { //这里是新添加的
rewrite /b.html /c.html;
}
---------------------------------------------------------------------------------
三,用nginx实现网站代理功能 (组建网站集群)
一台服务器的能力是有限的,如果客户访问量比较大,可以利用nginx的代理功能组建集群,集群中的服务器越多集群整体性能就越强
1,集群中服务器的准备工作
[root@web1 ~]# yum -y install vim
[root@web1 ~]# yum -y install bash-completion //tab键补全软件包
[root@web1 ~]# yum -y install net-tools //网络工具软件包,支持ifconfig等命令
[root@web1 ~]# yum -y install httpd
echo "web1-httpd~~" > /var/www/html/index.html //这里
如果是web2的话,要改成"web2-httpd~~"
systemctl start httpd
systemctl stop firewalld
之后web2的配置与web1基本一致
[root@proxy nginx]# curl 192.168.2.100 //配置好之后用proxy测试
web1-httpd~~
[root@proxy nginx]# curl 192.168.2.200
web2-httpd~~
2,在proxy主机修改配置实现集群效果
[root@proxy nginx]# cp conf/nginx.conf.default conf/nginx.conf
cp:是否覆盖"conf/nginx.conf"? y
[root@proxy nginx]# vim conf/nginx.conf
upstream web { //首先是34~37行,创建集群,集群名称叫web
server 192.168.2.100:80; //这里是集群中的服务器ip与端口
server 192.168.2.200:80; //第二台集群主机
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://web; //在第47行,调用集群
root html;
index index.html index.htm;
}
sbin/nginx -s reload //重加载nginx服务
curl 192.168.2.5 //看到的页面内容是web1与web2之间切换
-----------------------------------------------------
四,集群的优化:
1,任务量分配
server 192.168.2.200:80 weight=2; //设置权重,值越大,分配的
工作量越多
sbin/nginx -s reload
curl 192.168.2.5 //反复访问,可以看到web2工作量增加
2,健康检查
server 192.168.2.200:80 max_fails=2 fail_timeout=30; //检测两次如果失败
,则认为集群中的主机故障,之后等待30秒再次测试
sbin/nginx -s reload
测试时,先将web2的httpd服务关闭,回到proxy访问集群页面curl 192.168.2.5
只会显示web1的页面,此时即使将web2的httpd服务开启也无效,因为要等
待30秒
3,相同客户机访问相同服务器
upstream web {
ip_hash; //相同客户机访问相同服务器,让一个客户机访问集群时锁定
一个后台服务器,避免重复登陆的问题
server 192.168.2.100:80;
server 192.168.2.200:80 max_fails=2 fail_timeout=30;
}
sbin/nginx -s reload
curl 192.168.2.5 //反复访问不会再轮询访问后台集群主机了,只会咬住一台
4,添加down标记
server 192.168.2.100:80 down; //加down标记,使集群服务器暂时
不参与任务轮询
sbin/nginx -s reload
再次访问192.168.2.5,再也不会出现web1(即使删除ip_hash)
------------------------------------------------------------------------------------
五,使用nginx实现其他业务集群
通常情况下nginx是搭建网站的工具,还可以组建网站集群,但如果后端的集群服务器跑的不是网站业务,就可以利用--with-stream模块创建非网站业务的集群。--with-http_stub_status_module是之后实验需要的模块,可以查看网站内部数据。
[root@proxy nginx]# sbin/nginx -s stop
[root@proxy nginx]# cd ~/lnmp_soft/nginx-1.17.6/
[root@proxy nginx-1.17.6]# rm -rf /usr/local/nginx/
./configure --with-stream --with-http_stub_status_module
make
make install
cd /usr/local/nginx/
sbin/nginx -V
2,创建集群
打开nginx主配置文件,在16行左右(http上面),添加以下内容
stream { //创建新业务
upstream backend { //创建名叫backend的集群
server 192.168.2.100:22; //集群中的主机使用22端口对外提供服务
server 192.168.2.200:22;
}
server {
listen 12345; //监听端口号
proxy_pass backend; //调用集群
}
}
sbin/nginx //开启服务
ssh 192.168.2.5 -p 12345 //尝试远程登录,第一次可能会连接集群的某一台主机比如web1
exit //退出
rm -rf ~/.ssh/known_hosts //删除记录文件
ssh 192.168.2.5 -p 12345 //再次尝试登录,会连接到另外一台集群主机
ss命令可以查看系统中启动的端口信息,该命令常用选项如下:
-a显示所有端口的信息
-n以数字格式显示端口号
-t显示TCP连接的端口
-u显示UDP连接的端口
-l显示服务正在监听的端口信息,如httpd启动后,会一直监听80端口
-p显示监听端口的服务名称是什么(也就是程序名称)
注意:在RHEL7系统中可以使用ss命令替代netstat命令,功能一样,选
项一样。
----------------------------------------------
六,nginx 常见问题处理
1,404报错
客户访问网站时,如果看到了不存在的页面会有404报错的英文提示,这种
提示很不友好,可以通过自定义页面改善用户体验
首先修改配置文件 大概58~59行附近
error_page 404 /test.jpg;(图片名必须与修改的名一致) //如果客户访问了不存在的页面就显示test.jpg的内容
找一张图片,内容随意,比如用中文标注"抱歉!您访问的页面不存在" 然后保
存成test.jpg格式,然后拷贝到proxy主机的/usr/local/nginx/html目录下
重新加载nginx配置
使用浏览器虽随意访问不存在的页面192.168.2.5/XXXX.html 就可以看到之前
那张图片的内容

浙公网安备 33010602011771号