nginx 和 apache 是并列的关系, 二选一, 用 nginx 就行了. 客户端会直接连到 nginx 进程上, 或者说由 nginx 处理客户端的连接, 并做转发. 比如
http://abc.com/list.js 是购物车列表页使用的 JS 文件, 它是一个静态内容, nginx 可以直接读对应的文件返回给客户端.
http://abc.com/cart.html 需要依据不同的登录用户, 展示不同的购物车中的产品, 这个需要转发到后端进程进行动态处理(需要你写 Java 程序处理的)
在 nginx 和 servlet 中间, 还有一个叫 servlet container, 例如 tomcat, jetty. 它们负责解析 http 请求, 将 http 请求变成 Java 中的 Request 对象(这样你才能在 Java 代码中直接拿到这个请求对象).
而你写的处理请求的代码, 叫 servlet, 其实就是你自己的业务逻辑代码.
servlet 会强制你实现一些接口, 这样你可以把你的代码包直接扔到 tomcat 中. 因为你实现了这些接口, tomcat 直接以接口规范调用你的代码, 完成动态内容的生成.
在生产环境中, nginx 主要作用是扛连接. 因为后端的 tomcat 的强项是解析 http 请求变成 Java 中的 Request 对象, 并调用你的业务代码(就是你写的 servlet), 所以它对于连接的处理, 静态内容的优化并不是很好(虽然能做). nginx 可以自己扛上万连接不费劲, 所以 nginx 挡在前面, 处理一些原生 http 请求相关的工作(TCP 连接, 静态内容, 还有一些过滤, 比如 request body 大于多少的就抛弃掉这种前期处理).