nginx+php,nginx+tomcat动静分离实战
1. 动静分离实战
1.1.1 nginx+tomcat 动静分离
主机 | 用途 |
---|---|
10.0.0.63 | tomcat服务器 |
10.0.0.64 | nginx服务器 |
1.1.2 安装 java+tomcat环境[10.0.0.63]
1.tomcat配置:
mkdir /server/tools
cd /server/tools
wget https://downloads.apache.org/tomcat/tomcat-9/v9.0.34/bin/apache-tomcat-9.0.34.tar.gz
tar xf apache-tomcat-9.0.34.tar.gz -C /application/
ln -s /application/apache-tomcat-9.0.34 /application/tomcat
2. java环境配置:
rpm -ivh https://www.chenleilei.net/soft/jdk-8u121-linux-x64.rpm [可能要等很久,可以先下载再安装]
[root@master tools]# rpm -ivh https://www.chenleilei.net/soft/jdk-8u121-linux-x64.rpm
Retrieving https://www.chenleilei.net/soft/jdk-8u121-linux-x64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:jdk1.8.0_121-2000:1.8.0_121-fcs ################################# [100%]
Unpacking JAR files...
tools.jar...
plugin.jar...
javaws.jar...
deploy.jar...
rt.jar...
jsse.jar...
charsets.jar...
localedata.jar...
3. 启动tomcat:
/application/tomcat/bin/startup.sh
#查看进程
[root@master tomcat]# ps -ef|grep java
root 4005 1 56 19:20 pts/0 00:00:02 /usr/bin/java -Djava.util.logging.config.file=/application/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/application/tomcat -Dcatalina.home=/application/tomcat -Djava.io.tmpdir=/application/tomcat/temp org.apache.catalina.startup.Bootstrap start
root 4036 1390 0 19:20 pts/0 00:00:00 grep --color=auto java
1.1.3 安装nginx环境[10.0.0.64]
useradd www -u 1200 -M -s /sbin/nologin
mkdir -p /var/log/nginx
yum install -y cmake pcre pcre-devel openssl openssl-devel gd-devel \
zlib-devel gcc gcc-c++ net-tools iproute telnet wget curl &&\
yum clean all && \
rm -rf /var/cache/yum/*
mkdir -p /server/tools
cd /server/tools
wget https://www.chenleilei.net/soft/nginx-1.16.1.tar.gz
tar xf nginx-1.16.1.tar.gz
cd nginx-1.16.1
./configure --prefix=/usr/local/nginx --with-http_image_filter_module --user=www --group=www \
--with-http_ssl_module --with-http_v2_module --with-http_stub_status_module \
--pid-path=/var/run/nginx/nginx.pid
make -j 4 && make install && \
rm -rf /usr/local/nginx/html/* && \
echo "nginx daemo hello" >/usr/local/nginx/html/index.html && \
echo "export PATH=$PATH:/usr/local/nginx/sbin" >>/etc/profile
chown -R www.www /var/log/nginx /usr/local/nginx
source /etc/profile
nginx -s reload
ps -ef|grep nginx
1.1.4 nfs配置[10.0.0.64]
[root@k8s-master2 webapps]# cat /etc/exports
/application/tomcat/webapps 10.0.0.0/24(rw,sync,no_root_squash)
#这里是配置任何人可读可写.
重新启动nfs服务
systemctl restart nfs.service rpcbind.service
1.1.5 tomcat服务器挂载NFS目录
本机挂载本机 没办法一样的目录挂载 所以改成了webapps1 然后挂载为网页目录 /application/tomcat/webapps
其他服务器同样的挂载方式
[]# mount -t nfs 10.0.0.64:/application/tomcat/webapps1 /application/tomcat/webapps
[root@master tools]# cd /application/tomcat/webapps/
[root@master webapps]# ls
docs examples host-manager manager ROOT
[root@master tools]# cd /application/tomcat/webapps1/
[root@master webapps1]# ls
docs examples host-manager manager ROOT
简单测试:
10.0.0.63:
[root@master webapps]# touch leilei
[root@master webapps]# ls
docs examples host-manager leilei manager ROOT
10.0.0.64:
[root@k8s-master2 webapps]# ls
docs examples host-manager leilei manager ROOT #看到创建成功就没什么问题了,说明现在两台服务器使用的都是一个共享目录 /application/tomcat/webapps/ROOT. 这里面就有jsp页面.用于测试tomcat.动态页面.
1.1.6 nginx反向代理tomcat,配置动静分离[10.0.0.64]
[root@k8s-master2 nginx]# egrep -v "#|^$" conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream tomcat {
server 10.0.0.63:8080;
}
server {
listen 80;
server_name 10.0.0.64;
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf)$ {
root /application/tomcat/webapps/ROOT/;
}
location ~ \.jsp$ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://tomcat;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
1.1.7 成功结果
1.2 nignx+php 通过TCP连接实现动静分离实验
实验环境:
主机 | 用途 |
---|---|
10.0.0.63 | nginx服务器 |
10.0.0.64 | php服务器 |
通过TCP连接实现动静分离 实际上就是通过9000端口解析php文件
1. 如果php和nginx不在同一台服务器,那么就需要双方都有nginx的用户,和用户uid,以及相同目录.这样才能够请求解析成功
2. 同时 www.conf 文件中的127.0.0.1:9000 需要改为 0.0.0.0:9000 用于监听所有,或者指定php服务器的ip地址.
useradd www -u 1200 -M -s
mkdir -p /usr/local/nginx/html
chown -R www.www /usr/local/nginx/html
chmod -R 755 /usr/local/nginx/html
这里我们规划网页: /usr/local/nginx/html
在php环境中也需要创建该目录,或者直接使用NFS来处理数据一致性问题.
1.2.1 安装PHP [10.0.0.64]
yum install -y curl && \
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo && \
yum clean all && \
yum remove oniguruma-devel -y && \
yum remove oniguruma -y && \
rpm -ivh https://www.chenleilei.net/soft/docker/oniguruma-6.7.0-1.el7.x86_64.rpm && \
rpm -ivh https://www.chenleilei.net/soft/docker/oniguruma-devel-6.7.0-1.el7.x86_64.rpm && \
yum install -y cmake pcre pcre-devel openssl openssl-devel gd-devel \
zlib-devel gcc gcc-c++ net-tools iproute telnet wget curl \
wget vim libxml2 libxml2-devel openssl openssl-devel libjpeg-turbo \
libjpeg-turbo-devel libpng-devel libpng freetype-devel freetype icu \
libicu-devel libicu libmcrypt libmcrypt-devel libxslt libxslt-devel php-mysql libsqlite3x-devel && \
rm -rf /var/cache/yum/*
useradd www -u 1200 -M -s /sbin/nologin && \
mkdir -p /usr/local/nginx/html && \
chown -R www.www /usr/local/nginx/html && chmod -R 755 /usr/local/nginx/html && \
wget https://www.chenleilei.net/soft/php-7.4.3.tar.gz && \
tar xf php-7.4.3.tar.gz && \
cd php-7.4.3 && \
./configure --prefix=/usr/local/php-7.4.3 \
--with-config-file-path=/usr/local/php-7.4.3/etc \
--with-config-file-scan-dir=/usr/local/php-7.4.3/conf.d \
--enable-fpm --with-fpm-user=www \
--with-fpm-group=www \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-iconv-dir \
--with-zlib \
--enable-xml \
--disable-rpath \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--enable-mbregex \
--enable-mbstring \
--enable-ftp \
--with-openssl \
--with-mhash \
--enable-pcntl \
--enable-sockets \
--with-xmlrpc \
--enable-soap \
--with-gettext \
--disable-fileinfo \
--enable-opcache \
--enable-intl \
--with-xsl && \
make -j 4 && make install && \
cp ./sapi/fpm/php-fpm.conf /usr/local/php-7.4.3/etc/ && \
cp php.ini-production /usr/local/php-7.4.3/etc/php.ini && \
cp /usr/local/php-7.4.3/etc/php-fpm.d/www.conf.default /usr/local/php-7.4.3/etc/php-fpm.d/www.conf && \
sed -i "s#127.0.0.1:9000#0.0.0.0:9000#g" /usr/local/php-7.4.3/etc/php-fpm.d/www.conf && \
sed -in '99idaemonize = yes' /usr/local/php-7.4.3/etc/php-fpm.conf && \
cp /php-7.4.3/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm && \
chmod a+x /etc/init.d/php-fpm && \
rm -rf ../php-7.4.3.tar.gz && \
/etc/init.d/php-fpm start
1.2.2 安装Nginx [10.0.0.65]
useradd www -u 1200 -M -s /sbin/nologin
mkdir -p /var/log/nginx
yum install -y cmake pcre pcre-devel openssl openssl-devel gd-devel \
zlib-devel gcc gcc-c++ net-tools iproute telnet wget curl &&\
yum clean all && \
rm -rf /var/cache/yum/*
mkdir -p /server/tools
cd /server/tools
wget https://www.chenleilei.net/soft/nginx-1.16.1.tar.gz
tar xf nginx-1.16.1.tar.gz
cd nginx-1.16.1
./configure --prefix=/usr/local/nginx --with-http_image_filter_module --user=www --group=www \
--with-http_ssl_module --with-http_v2_module --with-http_stub_status_module \
--pid-path=/var/run/nginx/nginx.pid
make -j 4 && make install && \
rm -rf /usr/local/nginx/html/* && \
echo "nginx daemo hello" >/usr/local/nginx/html/index.html && \
echo "export PATH=$PATH:/usr/local/nginx/sbin" >>/etc/profile
chown -R www.www /var/log/nginx /usr/local/nginx
source /etc/profile
nginx -s reload
ps -ef|grep nginx
1.2.3 TCP动静分离配置要点
nginx开启php解析配置:
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
注意: 如果nginx php不在同一台服务器,这里需要指向php服务器地址,并且 php服务器需要有nginx的html目录.
建议做 NFS,让php服务器nginx服务器的 html目录内容保持一致,这里还有个问题就是.php服务器也需要有nginx的运行用户
且他们的UID PID相同. 因为经过远程调用还是使用的nginx去请求的,对端如果没有nginx用户,则无法请求到资源.
所以php服务器需要执行: useradd www -u 1200 -M -s /sbin/nologin
1.2.4 安装NFS [做数据一致性]
在php nginx任意一台配置一个nfs都可以
这里就选择在 php [10.0.0.64]服务器上配置一个nfs 吧
1. 检查是否安装
rpm -aq nfs-utils rpcbind
2. 安装nfs服务
yum install nfs-utils rpcbind -y
3. 检查rcpbind状态
systemctl status rpcbind
4. 检查nfs状态
systemctl status nfs
5. 开机启动nfs
systemctl enabled nfs
6. 配置NFS
mkdir /usr/local/nginx/html -p
chown -R www.www /usr/local/nginx/html
编辑 /etc/exports 改为下面cat的内容
[root@k8s-master2 php-7.4.3]# cat /etc/exports
/usr/local/nginx/html 10.0.0.0/24(rw,sync,all_squash,anonuid=1200,anongid=1200)
7. 启动rpcbind,nfs
systemctl status rpcbind
systemctl start nfs
8. 检查是否能够获取到挂载:
[root@k8s-master2 php-7.4.3]# showmount -e 127.0.0.1
Export list for 127.0.0.1:
/usr/local/nginx/html 10.0.0.0/24
9. 由于我们是在 PHP服务器 上配置的NFS,我们还需要在nginx上挂载这个NFS磁盘.
安装相关软件: yum install nfs-utils rpcbind -y
检查是否检测到共享的目录:
[root@k8s-node1 html]# showmount -e 10.0.0.64
Export list for 10.0.0.64:
/usr/local/nginx/html 10.0.0.0/24
挂载nfs目录到本地:
mount -t nfs 10.0.0.64:/usr/local/nginx/html /usr/local/nginx/html
systemctl restart nfs rpcbind
10. 检查同步
10.0.0.64服务器 /usr/local/nginx/html 创建 chenleilei.txt
touch /usr/local/nginx/html/chenleilei.txt
10.0.0.65服务器检查 /usr/local/nginx/html 是否创建了 chenleilei.txt
[root@k8s-node1 html]# ls /usr/local/nginx/html
chenleilei.txt
检查无误.
1.2.5 php解析配置
echo '<?php phpinfo(); ?>' > /usr/local/nginx/html/index.php
1.2.6 nginx配置php解析
1. 添加php的默认页:
index index.php index.html index.htm;
2. 增加php解析:
location ~ \.php$ {
root html;
fastcgi_pass 10.0.0.64:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
1.2.7 成功的结果
访问 ip/index.php测试
1.3 ninx+php通过soket文件实现动静分离
通过soket实现动静分离,它没有网络开销,速度更快.
缺点: 通过socket的方式虽然可以实现更快的解析.但是,php和nginx必须在同一台服务器中.
所以这个实验都是在 10.0.0.64 服务器中配置完成.
1.3.1 安装php
1. 安装php
yum install -y curl
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
yum remove oniguruma-devel -y
yum remove oniguruma -y
rpm -ivh https://www.chenleilei.net/soft/docker/oniguruma-6.7.0-1.el7.x86_64.rpm
rpm -ivh https://www.chenleilei.net/soft/docker/oniguruma-devel-6.7.0-1.el7.x86_64.rpm
yum install -y cmake pcre pcre-devel openssl openssl-devel gd-devel \
zlib-devel gcc gcc-c++ net-tools iproute telnet wget curl \
wget vim libxml2 libxml2-devel openssl openssl-devel libjpeg-turbo \
libjpeg-turbo-devel libpng-devel libpng freetype-devel freetype icu \
libicu-devel libicu libmcrypt libmcrypt-devel libxslt libxslt-devel php-mysql libsqlite3x-devel && \
rm -rf /var/cache/yum/*
useradd www -u 1200 -M -s /sbin/nologin && mkdir -p /usr/local/nginx/html && chown -R www.www /usr/local/nginx/html && chmod -R 755 /usr/local/nginx/html
wget https://www.chenleilei.net/soft/php-7.4.3.tar.gz
tar xf php-7.4.3.tar.gz
WORKDIR php-7.4.3
./configure --prefix=/usr/local/php-7.4.3 \
--with-config-file-path=/usr/local/php-7.4.3/etc \
--with-config-file-scan-dir=/usr/local/php-7.4.3/conf.d \
--enable-fpm --with-fpm-user=www \
--with-fpm-group=www \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-iconv-dir \
--with-zlib \
--enable-xml \
--disable-rpath \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--enable-mbregex \
--enable-mbstring \
--enable-ftp \
--with-openssl \
--with-mhash \
--enable-pcntl \
--enable-sockets \
--with-xmlrpc \
--enable-soap \
--with-gettext \
--disable-fileinfo \
--enable-opcache \
--enable-intl \
--with-xsl
make -j 4 && make install
cp ./sapi/fpm/php-fpm.conf /usr/local/php-7.4.3/etc/php-fpm.conf && \
cp /php-7.4.3/php.ini-production /usr/local/php-7.4.3/etc/php.ini && \
cp /usr/local/php-7.4.3/etc/php-fpm.d/www.conf.default /usr/local/php-7.4.3/etc/php-fpm.d/www.conf && \
sed -i "s#127.0.0.1:9000#0.0.0.0:9000#g" /usr/local/php-7.4.3/etc/php-fpm.d/www.conf && \
sed -in '99idaemonize = yes' /usr/local/php-7.4.3/etc/php-fpm.conf && \
cp /php-7.4.3/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm && \
chmod a+x /etc/init.d/php-fpm
rm -rf /php-7.4.3.tar.gz
/etc/init.d/php-fpm start
2. 配置php socket : vim /usr/local/php-7.4.3/etc/php-fpm.d/www.conf 大约36行加入:
listen = /dev/shm/php-fpm.sock
listen.mode = 0660
3. 保存退出后重启php:
/etc/init.d/php-fpm restart
此时的php已经不再监听网卡了,而是通过 /dev/shm/php-fpm.sock 与nginx进行交互.
[root@k8s-master2 nginx-1.16.1]# ll /dev/shm/php-fpm.sock
srw-rw---- 1 root root 0 Apr 15 16:20 /dev/shm/php-fpm.sock
4. 让nginx的php解析也向 socket配置
location ~ \.php$ {
root html;
fastcgi_pass unix:/dev/shm/php-fpm.sock; #<<<--- 这里指定socket地址
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
5. 配置测试页面:
echo '<?php phpinfo(); ?>' > /usr/local/nginx/html/index.php
1.3.2. 安装nginx
useradd www -u 1200 -M -s /sbin/nologin
mkdir -p /var/log/nginx
yum install -y cmake pcre pcre-devel openssl openssl-devel gd-devel \
zlib-devel gcc gcc-c++ net-tools iproute telnet wget curl &&\
yum clean all && \
rm -rf /var/cache/yum/*
mkdir -p /server/tools
cd /server/tools
wget https://www.chenleilei.net/soft/nginx-1.16.1.tar.gz
tar xf nginx-1.16.1.tar.gz
cd nginx-1.16.1
./configure --prefix=/usr/local/nginx --with-http_image_filter_module --user=www --group=www \
--with-http_ssl_module --with-http_v2_module --with-http_stub_status_module \
--pid-path=/var/run/nginx/nginx.pid
make -j 4 && make install && \
rm -rf /usr/local/nginx/html/* && \
echo "nginx daemo hello" >/usr/local/nginx/html/index.html && \
echo "export PATH=$PATH:/usr/local/nginx/sbin" >>/etc/profile
chown -R www.www /var/log/nginx /usr/local/nginx
source /etc/profile
nginx -s reload
ps -ef|grep nginx
1.3.3 socket动静分离配置
1. php-fpm.conf配置文件修改:
vim /usr/local/php-7.4.3/etc/php-fpm.d/www.conf 大约36行添加或修改为如下:
listen = /dev/shm/php-fpm.sock
listen.mode = 0666
2.编辑 nginx.conf 配置文件添加或 "修改为" 如下行:
location ~ \.php$ {
root html;
fastcgi_pass unix:/dev/shm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
3. 重启php-fpm和nginx
nginx -s reload
/etc/init.d/php-fpm restart
1.3.4 成功结果

微信赞赏

支付宝赞赏

【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 开发的设计和重构,为开发效率服务
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· 从零开始开发一个 MCP Server!
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
2018-04-16 chkconfig的原理 和添加开机自启动的办法
2018-04-16 FPM包定制完成 (等待实现 里程碑 1 和 2) 2018年4月13日 2:18:32