有关nginx Tornado tomcat apache<抄次网上>

本文深入探讨了Tornado作为异步Web框架的特性和Nginx作为高性能反向代理服务器的角色。阐述了如何在实际应用中利用Tornado构建动态web程序,并通过Nginx进行高效的负载均衡与资源分发,实现高性能与灵活性的完美结合。同时,对比了Apache与Nginx、Tomcat与Tornado在静态内容服务与动态应用运行上的区别与优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Tornado作为web server,提供了web framework的api,可以来直接构建自己的web程序。同时,Tornado支持WSGI ( http://www.python.org/dev/peps/pep-0333/ ),也就是说它可以有能力其它的一些python的框架一起使用,比如django, bottle, flask等。不妨看下bottle在不同server下的性能评测,其中就有tornado http://bottlepy.org/page/2009-12-19_Comparing_HelloWorld_Performance )。额外说的是,WSGI的框架是不支持异步的,所以如果有异步调用的逻辑的web程序,Tornado也是选择之一。

使用Nginx是因为一些单进程服务无法利用多核CPU,同时也会有单机的限制,所以通常会在多个服务器启动多个进程实例,使用Nginx在前端作为反向代理服务器来分发web请求,同时负载均衡。Nginx是C写的,有更好的并发性,可配置性,对静态文件也有更好的支持。当然这是Nginx的常用情景,其实也可以直接使用Nginx来构建web应用,可以参考OpenResty项目


Nginx的确是多进程的,但其实我想表达的是说Tornado这样的单进程服务无法利用多核CPU(全面点说,像Tornado自己也有multiple processes模式的,但它的进程管理的功能很弱,通常还是自己启动N个进程,而且不能拓展到多机


如果咬文嚼字的话,host静态文件的被称为web server,比如nginx和apache。动态的应该称为application server才对,比如tornado和tomcat


nginx常用做静态内容服务和代理服务器(不是你翻墙那个代理),直面外来请求转发给后面的应用服务tomcat,django什么的),tomcat更多用来做做一个应用容器,让java web app跑在里面的东西,对应同级别的有jboss,jetty等东西。但是事无绝对,nginx也可以通过模块开发来提供应用功能,tomcat也可以直接提供http服务,通常用在内网和不需要流控等小型服务的场景。
apache用的越来越少了,大体上和nginx功能重合的更多


apache和nginx可以归为一类,属于静态页面服务器。tomcat属于Java Servlet容器,用来生成动态页面的。

apache属于比较老的静态页面服务器,比较多现有插件,包括代理、SSL支持、动态编程语言处理等。
nginx和apache差不多,都有插件支持动态编程语言处理等、但nginx的IO模型比apache更适合跑代理。所以一般都作为前端缓冲代理。
tomcat就是Java Servlet容器,主要用来跑Java的Web功能,当然也提供一个简单静态页面转换。


严格的来说,Apache/Nginx 应该叫做「HTTP Server」;而 Tomcat 则是一个「Application Server」,或者更准确的来说,是一个「Servlet/JSP」应用的容器(Ruby/Python 等其他语言开发的应用也无法直接运行在 Tomcat 上)。
一个 HTTP Server 关心的是 HTTP 协议层面的传输和访问控制,所以在 Apache/Nginx 上你可以看到代理、负载均衡等功能。客户端通过 HTTP Server 访问服务器上存储的资源(HTML 文件、图片文件等等)。通过 CGI 技术,也可以将处理过的内容通过 HTTP Server 分发,但是一个 HTTP Server 始终只是把服务器上的文件如实的通过 HTTP 协议传输给客户端。

而应用服务器,则是一个应用执行的容器。它首先需要支持开发语言的 Runtime(对于 Tomcat 来说,就是 Java),保证应用能够在应用服务器上正常运行。其次,需要支持应用相关的规范,例如类库、安全方面的特性。对于 Tomcat 来说,就是需要提供 JSP/Sevlet 运行需要的标准类库、Interface 等。为了方便,应用服务器往往也会集成 HTTP Server 的功能,但是不如专业的 HTTP Server 那么强大,所以应用服务器往往是运行在 HTTP Server 的背后,执行应用,将动态的内容转化为静态的内容之后,通过 HTTP Server 分发到客户端。

一般的运用场景下,apache和nginx在负载均衡里是前端服务器,用来处理请求的转发(反向代理等);绝大部分时候他们本身并不会运行项目。tomcat和jetty,WebLogic是后端服务器,是直接用来运行项目的容器。


简单来说就是你发出一个请求,先经过apache或nginx,他们会合理地把请求分配到后台比较不忙的tomcat或jetty。tomcat或jetty会把请求处理好返回给apache或nginx,然后a或n会把最终的请求结果告诉你。当然,如果是一些静态的数据,a和n就可以直接返回给你了。
### HTTP 400 Bad Request 403 Forbidden 错误原因及解决方案(Nginx) #### HTTP 400 Bad Request HTTP 400 错误表示客户端发送的请求存在语法错误或无法被服务器正确解析。以下是一些常见的原因及解决方案: - **请求头格式不正确**:如果请求头中包含无效字符或超出长度限制,可能会导致此错误。确保所有请求头字段符合 HTTP 协议标准[^2]。 - **请求体格式错误**:对于 POST 请求,如果请求体中的数据格式不符合服务器预期(如 JSON 格式错误),也会触发 400 错误。验证请求体是否正确,并与服务器端要求一致[^2]。 - **URL 编码问题**:如果 URL 中包含未正确编码的特殊字符,可能会被视为无效请求。确保 URL 参数经过适当的编码处理。 在 Nginx 配置中,可以通过调整 `client_max_body_size` 参数来解决因请求体过大导致的 400 错误: ```nginx http { client_max_body_size 10M; # 设置允许的最大请求体大小为 10MB } ``` #### HTTP 403 Forbidden HTTP 403 错误表示服务器理解请求但拒绝执行,通常是因为客户端缺乏访问权限。以下是常见原因及解决方案: - **文件或目录权限不足**:如果 Nginx 无法读取目标文件或目录,可能会返回 403 错误。检查文件目录的权限设置,确保 Nginx 用户(通常是 `www-data` 或 `nginx`)具有足够的读取权限[^1]。 - **禁止访问特定资源**:某些配置可能明确禁止访问特定类型的文件或目录。检查 Nginx 配置文件中是否存在类似以下的规则: ```nginx location ~ /\. { deny all; } ``` 上述配置会禁止访问以点开头的隐藏文件。如果需要访问这些文件,可以修改或移除相关规则[^1]。 - **认证失败**:如果服务器启用了基本认证或其他形式的身份验证,而客户端未提供有效的凭据,也可能导致 403 错误。确保客户端请求中包含正确的认证信息。 #### 自定义错误页面 为了提升用户体验,可以为 400 403 错误配置自定义错误页面。以下是一个示例配置: ```nginx server { listen 80; server_name example.com; location / { try_files $uri $uri/ =404; } error_page 400 /custom_400.html; error_page 403 /custom_403.html; location = /custom_400.html { root /usr/share/nginx/html; internal; } location = /custom_403.html { root /usr/share/nginx/html; internal; } } ``` 确保自定义错误页面文件(如 `custom_400.html` `custom_403.html`)存在于指定路径下,并重新加载 Nginx 配置以应用更改[^3]。 #### 示例代码 以下是一个简单的 Java 客户端代码示例,展示如何正确设置请求头请求体以避免 400 错误: ```java import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; public class HttpClientExample { public static void main(String[] args) throws Exception { CloseableHttpClient httpClient = HttpClients.createDefault(); HttpPost postMethod = new HttpPost("http://example.com/api"); // 设置请求头 postMethod.addHeader("Content-Type", "application/json"); postMethod.addHeader("Authorization", "Bearer token12345"); // 设置请求体 String jsonBody = "{ \"key\": \"value\" }"; StringEntity entity = new StringEntity(jsonBody, "UTF-8"); entity.setContentType("application/json"); postMethod.setEntity(entity); try (CloseableHttpResponse response = httpClient.execute(postMethod)) { System.out.println(EntityUtils.toString(response.getEntity())); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值