tomcat与nginx 📅 发布时间:2026/9/13 22:16:59 👁 浏览次数: nginx1、master进程和worker进程运行时master进程负责监控worker进程的状态若某个worker进程异常退出master进程会重新启动一个新的worker进程确保服务稳定运行两个进程之间通过信号进行通信。当nginx平滑重启时 master进程会重新检验新的配置文件检测语法语法正确后会根据配置生成新的worker进程接受新连接。2、nginx与apachenginxmaster进程仅负责管理worker进程、监听系统信号不直接处理客户请求worker进程共享监听socket通过accept锁争抢客户端连接采用异步非阻塞epoll事件驱动处理请求worker进程相互独立无共享资源可充分利用多核CPU高并发下性能稳定且资源消耗低。apache传统模式下parent进程负责管理子进程/线程子进程/线程同步阻塞处理请求子进程通过fork自parent进程初始有一定内存开销高并发下需要创建大量子进程导致内存占用高上下文切换损耗大。现代模式采用了异步非阻塞epoll事件驱动处理请求子进程可以同步处理大量连接高并发性能大幅提升接近nginx3、epoll模型、select模型、poll模型epoll模型性能远超select和poll是因为它避免了不必要的轮询只关注活跃的文件描述符。在文件描述符数量较少且都活跃的情况下select和poll性能会优于epoll4、nginx命令-s 发送信号-t 检查并测试配置文件-T 检查并测试配置文件并输出配置文件内容-c 指定配置文件-v 显示版本信息-V 显示版本信息及编译项5、在生产环境中worker_processes 默认是auto auto会自动根据逻辑CPU数量创建worker进程当主机还有其他业务进程运行auto会直接占满全部CPU引发CPU抢占资源配置 worker_cpu_affinity 可以手动规避进程争抢合理分配物理核心。在超卖严重的虚拟服务器上时可以关闭该配置 worker_cpu_affinity 可以手动配置worker_processe 的具体CPU数量来合理规划CPU。6、nginx中有三种常见的配置方式第一种多端口方式第二种不同IP地址第三种相同端口基于域名不同当客户端发送一个请求时nginx通过在server中配置location块进行请求分发location匹配规则优先级按照顺序是 ” “ ^~ ~* 或 ~ /str “通用匹配符/”7、源码编译安装nginx#准备编译安装环境yuminstallgccmakegcc-c glibc glibc-devel pcre2 pcre2-devel openssl openssl-devel systemd-devel zlib-devel-yyuminstalllibxml2 libxml2-devel libxslt libxslt-devel php-gd gd-devel-y# 创建安装包存放目录mkdir/data/softs-pcd/data/softs/# 获取软件安装包并解压wgethttps://nginx.org/download/nginx-1.26.3.tar.gztarxf nginx-1.26.3.tar.gz# 添加nginx用户useradd-r-s/usr/sbin/nologin nginx# 编译安装./configure--prefix/data/server/nginx--usernginx--groupnginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_modulemakemakeinstallchown-Rnginx:nginx /data/server/nginx/# 定制服务管理文件# 创建pid目录mkdir/data/server/nginx/runchown-Rnginx:nginx /data/server/nginx/run#修改nginx配置 pid目录指向正确路径vim/data/server/nginx/conf/nginx.conf# 定制nginx服务配置文件vim/usr/lib/systemd/system/nginx.service# 重载配置。启动服务并设置开机自启动systemctl daemon-reload systemctlenablenginx.service systemctl start nginx.service注意在rocky中安装好nginx在启动的时候会出现启动不起来的错误一般是由于rocky中防火墙没关闭或者SELinux不处于disable状态或者是文件目录权限不够# 查看目录权限和是否是指定特定用户身份运行ls-lh/data/server/nginx/sbin/nginx# 若不是指定用户或者权限不够需要操作授权和指定用户chown-Rnginx:nginx /data/server/nginx/runchmod755/data/server/nginx/sbin/nginx# 查看防火墙是否关闭不是的化关闭掉systemctl status firewalld.service systemctl disable--nowfirewalld.service# 查看SELinux值是否为disabled或者Permissive临时关闭状态不是的话需要关闭掉getenforce# 临时关闭SELinux 无需重启电脑setenforce0# 修改文件值disabledsed-is/^SELINUXenforcing/^SELINUXdisabled//etc/selinux/configreboot# 再重新启动nginx服务查看运行状态正常systemctl start nginx systemctl status nginx.service8、反向代理反向代理配置时proxy_pass指令在url路径末尾带/ 会把完整的url路径转发不带/转发的是剔除location前缀的路径例如转发http://backend 和http://backend/不带末尾斜杠带末尾斜杠9、nginx 四层代理工作在传输层七层代理工作在应用层在实际业务架构中若业务需要使用http协议则必须要用七层代理不是http协议的用四层代理10、php-fpm通信nginx本身不解析php代码通过FastCGI协议把请求交给php-fpm进程池处理nginx只负责接收http请求把php请求转发给fpm把结果返回给客户端。uds不走tcp协议cpu开销小无time_wait安全性高但是只能本机使用容易出现socket权限、文件丢失到导致502.tcp socket经过tcp协议栈性能略低它支持分布式部署、负载均衡调试方便高并发会产生time_wait单机部署优先选择uds若要做pfp集群运维优先选择tcp socket11、nginx二次开发版targent起源于淘宝网的内部需求在nginx基础上进行了一些列优化特别是针对高并发场景包括对外连接处理、负载均衡、静态文件服务等。支持动态模块加载使得用户可以根据具体需求在运行时加载和卸载模块不需编译和部署整个服务器openresty基于nginx和lua的高性能web平台其内部集成了大量精良的lua库、第三方模块以及大多数依赖项。用于方便的搭建能够处理超高并发、扩展性极高的动态web应用、web服务和动态网关12、nginx平滑升级# 查看当前nginx版本升级不能跨多个版本风险比较高一般选择较近版本nginx-vnginx-V# 下载新版本安装包wgethttps://nginx.org/download/nginx-1.25.0.tar.gztarxf nginx-1.25.0.tar.gzcdnginx-1.25.0/# 由于Ubuntu中perl环境都是带版本号的编译安装时是不带版本号的可以创建一个不带版本号的软链接指向源文件ln-s/usr/lib/x86_64-linux-gnu/libperl.so.5.38 /usr/lib/x86_64-linux-gnu/libperl.so# 基于原有版本的配置修改成新版本号进行编译./configure --with-cc-opt-g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map/build/nginx-HCDuKl/nginx-1.25.0. -fltoauto -ffat-lto-objects -fstack-protector-strong -fstack-clash-protection -Wformat -Werrorformat-security -fcf-protection -fdebug-prefix-map/build/nginx-HCDuKl/nginx-1.25.0/usr/src/nginx-1.25.0-2ubuntu7.17 -fPIC -Wdate-time -D_FORTIFY_SOURCE3--with-ld-opt-Wl,-Bsymbolic-functions -fltoauto -ffat-lto-objects -Wl,-z,relro -Wl,-z,now -fPIC--prefix/usr/share/nginx --conf-path/etc/nginx/nginx.conf --http-log-path/var/log/nginx/access.log --error-log-pathstderr --lock-path/var/lock/nginx.lock --pid-path/run/nginx.pid --modules-path/usr/lib/nginx/modules --http-client-body-temp-path/var/lib/nginx/body --http-fastcgi-temp-path/var/lib/nginx/fastcgi --http-proxy-temp-path/var/lib/nginx/proxy --http-scgi-temp-path/var/lib/nginx/scgi --http-uwsgi-temp-path/var/lib/nginx/uwsgi --with-compat --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_secure_link_module --with-http_sub_module --with-mail_ssl_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-stream_realip_module --with-http_geoip_moduledynamic --with-http_image_filter_moduledynamic --with-http_perl_moduledynamic --with-http_xslt_moduledynamic --with-maildynamic --with-streamdynamic --with-stream_geoip_moduledynamicmake# 备份旧文件 执行新文件mv/usr/sbin/nginx /usr/sbin/nginx-1.24.0# 查看是否有执行权没有加一下ls./objs/nginx-l# 新版本文件拷贝到目录 查看版本信息cp./objs/nginx /usr/sbin/ nginx-v# 检测服务发现会报错这是版本兼容性问题需要删除module-enabled目录下的文件重新检测即可成功rm-rf/etc/nginx/modules-enabled/* nginx-t# 这是我们curl以下IP会发现仍旧显示旧版本需要关闭旧版worker进程pstree-p|grepnginx# 查看旧master进程pidcat/var/run/nginx.pid.oldbin# 删除旧进程 重新curl即可更新kill-WINCH2322kill-QUIT2322当运行一段时间后发现新版本有问题需要回退# 备份新版本还原旧版本mv/usr/sbin/nginx /usr/sbin/nginx1.25.0mv/usr/sbin/nginx-1.24.0 /usr/sbin/nginx nginx-v# 查看现在运行的新版本master进程。停止掉重启nginx服务再查看curl已经回退psaux|grepnginxkill-QUIT17292systemctl start nginx13、当用户访问页面时出现502、504报错502 Bad Gateway :nginx无法和php-fpm建立连接504 Gateway Time-out nginx成功连接上fpm但php处理请求超时没有返回数据排查思路1、确认是静态请求报错还是动态请求报错检查服务器的CPU、内存、io、网络确认php-fpm节点负载均衡是否正确。2、检查nginx层查看fpm错误日志定位问题根源。3、查看fpm错误日志开启慢日志定位检查进程和队列状态4、排查tcp队列系统日志nginx日志方面查看nginx实时错误日志找关键字502/504关注$upstream_response_time 选项判断php后端耗费时长tail-f/var/log/nginx/error.log# 查看php-fpm进程数量和内存psaux|grepphp-fpm# 查看系统日志dmesg-T|grep-ikill# 看 php-fpm慢日志tail-f/var/log/php-fpm-slow.log优化方案 nginx 1、可以修改nginx参数worker_processos 、 worker_connections 把单进程连接数调高 2、upstream负载均衡中配置两台fpm后端增加keeplive 复用长连接 3、fastcgi超时参数fastcgi_connect_timeout、fastcgi_send_timeout、fastcgi_read_timeout 可以改为30s优化业务慢的问题 4、调整fastcgi缓冲区参数fastcgi_buffer_size fastcgi_buffers 5、对读多写少的页面开启fastcgi_cache登录等页面动态接口禁止缓存减轻php压力 php-fpm 1、pmstatic模式减少进程创建销毁开销 2、pm.max_children根据可用内存计算单进程内存*进程数服务器的可用内存进程耗尽会直接引发 502 3、增大listen.backlogFPM 监听队列防止队列满拒绝请求报 502 4、设置pm.max_requests单进程最大处理请求数自动重启缓解内存泄漏 5、开启慢日志request_slowlog_timeout记录执行过慢脚本 6、合理设置max_execution_time、memory_limit 内核参数 1、在文件/etc/sysctl.conf中添加参数 net.core.somaxconn 2048 # 不小于FPM listen.backlog net.core.rmem_max 16777216 net.core.wmem_max 16777216 net.ipv4.tcp_syncookies 1 net.ipv4.tcp_tw_reuse 1 net.ipv4.tcp_fin_timeout 30 fs.file‑max 655350 2、修改limits.conf调高 nofile 文件句柄 * soft nofile 65535 * hard nofile 6553514、JavaJava 先将源文件编译为和硬件、操作系统无关的字节码 (.class)运行时由JVMJava 虚拟机 把字节码转换为当前操作系统的机器码执行。不同操作系统提供对应版本的 JVM因此同一份字节码可以在多个平台运行实现跨平台JRE、JDK是java平台中两个不同但相关的组件JDK是java开发工具是java开发完整包包含了JRE以及用于java开发的一系列工具JRE包括了JVM如果用户只需要运行java程序了只安装jre就可以。在linux系统中部署java环境需要配置环境变量JAVA_HAME(指向jdk安装的根目录)PATH追加java二进制命令路径让系统任意位置可以识别java的命令两种配置方式全局配置所有用户生效在/etc/profile中编辑变量进去执行source 加载用户级别配置进当前用户生效在~/.bashrc中编辑环境变量进去15、tomcatServer (最顶层一个Tomcat只有1个Server) └── Service (一个Server包含1~多个Service) ├─ Connector (一个Service包含1~多个Connector对外接收网络请求) └─ Engine (一个Service仅有1个EngineServlet容器核心) └── Host (Engine下可以多个Host虚拟主机) └── Context (Host下多个Context对应一个Web应用)server负责管理所有 Service 组件监听关闭端口控制整个 Tomcat 的生命周期启动、停止Service把 Connector 接收到的请求交给 Engine 处理Connector 负责对外网络通信。监听端口如 8080接收客户端 TCP 请求解析 HTTP 协议把原始请求封装成 Request 对象把处理后的 Response 返回给浏览器Engine 接收来自 Connector 转发过来的请求。根据请求域名把请求分发到对应的 Host 虚拟主机管理所有 Host处理 Servlet 的整体请求调度host代表一台虚拟主机根据请求的域名将请求路由到该 Host 下对应的 Context web 应用context代表一个独立的 Web 应用WAR 包管理项目内部 Servlet、Filter、Listener读取 web.xml 配置处理该 web 应用的资源、会话是 Servlet 真正运行的容器16、webpass目录是tomcat的默认web应用程序部署目录主要用于存放和管理所有要部署在tomcat上的web应用程序root目录是webpass目录下的一个特殊子目录是tomcat的默认web应用程序的根目录用于存放默认的主页和静态资源文件当tomcat收到一个请求该请求没有指定具体web应用程序时tomcat会自动将请求映射到root目录下的文件由于在配置host参数的时候定制了unpack WARs“true”autoDeploy“true” 所以会自动解压包和部署到根目录17、18、jpress# 解压jpress软件包 编译tarxf jpress-v5.1.2.tar.gzcdjpress-v5.1.2/ mvn clean packagewar包方式部署cpstarter-tomcat-5.0.war /data/app/jpress/ROOT.war# 授权chowntomcat:tomcat-R/data/app/jpress修改jpress的server.xml 的host信息重启服务安装数据库修改数据库配置并重启服务进入数据库创建用户进入网址创建jpressnginx 配置19、当用户通过浏览器访问jpress时部分静态资源会报404的错误或者点击超链接会重定向到tomcat8080端口原因可能是因为nginx静态资源配置有误资源访问路径错误tomcat上下文路径不匹配修改nginx配置tomcat配置增加