搜索词>>MIME 耗时0.0020
  • MIME 参考手册/HTTP文件上传格式过滤

    MIME 参考手册/HTTP文件上传格式过滤MIME 参考手册/HTTP文件上传格式过滤​​​​​​​
  • spring boot整合Jersey2.x实现JAX-RS webservice

    spring boot整合Jersey2.x实现JAX-RS webservicespring boot整合Jersey2.x实现JAX-RS webservice<br /> <br /> jersey常用注解解释: <table class="table table-bordered table-hover"> <tbody> <tr> <td>Annotation</td> <td>作用</td> <td>说明</td> </tr> <tr> <td>@GET</td> <td>查询请求</td> <td>相当于数据库的查询数据操作</td> </tr> <tr> <td>@POST</td> <td>插入请求</td> <td>相当于数据库的插入数据操作</td> </tr> <tr> <td>@PUT</td> <td>更新请求</td> <td>相当于数据库的更新数据操作</td> </tr> <tr> <td>@DELETE</td> <td>删除请求</td> <td>相当于数据的删除数据操作</td> </tr> <tr> <td>@Path</td> <td>uri路径</td> <td>定义资源的访问路径,client通过这个路径访问资源。比如:@Path("user")</td> </tr> <tr> <td>@Produces</td> <td>指定返回MIME格式</td> <td>资源按照那种数据格式返回,可取的值有:MediaType.APPLICATION_XXX。比如:@Produces(MediaType.APPLICATION_XML)</td> </tr> <tr> <td>@Consumes</td> <td>接受指定的MIME格式</td> <td>只有符合这个参数设置的请求再能访问到这个资源。比如@Consumes("application/x-www-form-urlencoded")</td> </tr> <tr> <td>@PathParam</td> <td>uri路径参数</td> <td>写在方法的参数中,获得请求路径参数。比如:@PathParam("username") String userName</td> </tr> <tr> <td>@QueryParam</td> <td>uri路径请求参数</td> <td>写在方法的参数中,获得请求路径附带的参数。比如:@QueryParam("desc") String desc</td> </tr> <tr> <td>@DefaultValue</td> <td>设置@QueryParam参数的默认值</td> <td>如果@QueryParam没有接收到值,就使用默认值。比如:@DefaultValue("description") @QueryParam("desc") String desc</td> </tr> <tr> <td>@FormParam</td> <td>form传递的参数</td> <td>接受form传递过来的参数。比如:@FormParam("name") String userName</td> </tr> <tr> <td>@BeanParam</td> <td>通过Bena的形式传递参数</td> <td>接受client传递的bean类型的参数,同时这个bean可以在属性上配置@FormParam用以解决client的属性名称和bean的属性名称不一致的问题。比如:@BeanParam User user</td> </tr> <tr> <td>@Context</td> <td>获得一些系统环境信息</td> <td>通过@Context可以获得以下信息:UriInfo、ServletConfig、ServletContext、HttpServletRequest、HttpServletResponse和HttpHeaders等</td> </tr> <tr> <td>@XmlRootElement</td> <td>将bean转换为xml</td> <td>如果要讲bean以xml或json的格式返回,必须要这个注解。比如:<br /> @XmlRootElement<br /> public class User{...}</td> </tr> </tbody> </table> <br /> 项目文件清单<br /> pom.xml <pre> <code class="language-xml"><?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.leftso</groupId> <artifactId>demo-webservice-jersey</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>demo-webservice-jersey</name> <description>demo-webservice-jersey</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jersey</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> </code></pre> <br /> JerseyResourceConfig.java <pre> <code class="language-java">package com.leftso.config; import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.server.spring.scope.RequestContextFilter; /** * 继承ResourceConfig,并添加一些配置信息 * * @author leftso * */ public class JerseyResourceConfig extends ResourceConfig { public JerseyResourceConfig() { register(RequestContextFilter.class); // 配置那个包下面的会被Jersey扫描 packages("com.leftso.rest"); } } </code></pre> <br /> JerseyConfig.java <pre> <code class="language-java">package com.leftso.config; import org.glassfish.jersey.servlet.ServletContainer; import org.glassfish.jersey.servlet.ServletProperties; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * 配置Jersey * * @author leftso * */ @Configuration public class JerseyConfig { @Bean public ServletRegistrationBean jerseyServlet() { ServletRegistrationBean registration = new ServletRegistrationBean(new ServletContainer(), "/rest/*"); // our rest resources will be available in the path /rest/* registration.addInitParameter(ServletProperties.JAXRS_APPLICATION_CLASS, JerseyResourceConfig.class.getName()); return registration; } } </code></pre> <br /> RestResource.java(测试资源类) <pre> <code class="language-java">package com.leftso.rest; import java.util.HashMap; import java.util.Map; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @Path("/") public class RestResource { @Path("/hello") // 具体路径 @GET // 请求方式 @Produces(MediaType.APPLICATION_JSON) // 返回的格式 // @Consumes()//接受指定的MIME格式 public Map<String, Object> hello() { Map<String, Object> map = new HashMap<String, Object>(); map.put("code", "1"); map.put("codeMsg", "success"); return map; } } </code></pre> <br /> Application.java <pre> <code class="language-java">package com.leftso; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } </code></pre> <br /> 启动项目,访问地址:http://127.0.0.1:8080/rest/hello<br /> <br /> 显示内容: <pre> <code>{"code":"1","codeMsg":"success"}</code></pre> <br /> 项目下载:<br /> GITHUB:<a href="https://github.com/leftso/demo-webservice-jersey" rel="external nofollow" target="_blank">https://github.com/leftso/demo-webservice-jersey</a><br />  
  • Spring 5 WebClient和WebTestClient使用教程

    1.引言Spring开发人员,您是否曾经觉得需要一个易于使用且高效的流畅功能样式 API 的异步/非阻塞 HTTP客户端?如果是,那么我欢迎您阅读关于WebClient的文章,WebClient是Spring 5中引入的新的被动HTTP客户1.引言Spring开发人员,您是否曾经觉得需要一个易于使用且高效的流畅功能样式 API 的异步/非阻塞 HTTP客户端?如果是,那么我欢迎您阅读关于WebClient的文章,WebClient是Spring 5中引入的新的被动HTTP客户端。2.如何使用WebClientWebClient是Spring 5的反应性Web框架Spring WebFlux的一部分。要使用WebClient,您需要将spring-webflux模块包含在您的项目中。在现有的Spring Boot项目中添加依赖项如果您有一个现有的Spring Boot项目,则可以spring-webflux通过在该pom.xml文件中添加以下依赖项来添加该模块-<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency>请注意,您需要Spring Boot 2.xx版本才能使用Spring WebFlux模块。从Scratch创建一个新项目如果您从头开始创建项目,那么您可以使用Spring Initializr网站的spring-webflux模块生成初始项目-转到http://start.spring.io。选择弹簧引导版本2.xx的。在依赖项部分添加反应性Web依赖项。如果需要,请更改组和工件的详细信息,然后单击生成工程下载项目。3.使用WebClient消费远程API让我们做一些有趣的事情,并使用WebClient来使用Real World API。在本文中,我们将使用WebClient来使用Github的API。我们将使用WebClient在用户的Github存储库上执行CRUD操作。创建WebClient的一个实例1.使用该create()方法创建WebClient您可以使用create()工厂方法创建WebClient的实例-WebClient webClient = WebClient.create();如果您只使用特定服务的API,那么您可以使用该服务的baseUrl来初始化WebClientWebClient webClient = WebClient.create("https://api.github.com");2.使用WebClient构建器创建WebClientWebClient还附带了一个构建器,它为您提供了一些自定义选项,包括过滤器,默认标题,cookie,客户端连接器等 -WebClient webClient = WebClient.builder() .baseUrl("https://api.github.com") .defaultHeader(HttpHeaders.CONTENT_TYPE, "application/vnd.github.v3+json") .defaultHeader(HttpHeaders.USER_AGENT, "Spring 5 WebClient") .build();使用WebClient发出请求并检索响应以下是如何使用WebClient GET向Github的List Repositories API发出请求-public Flux<GithubRepo> listGithubRepositories(String username, String token) { return webClient.get() .uri("/user/repos") .header("Authorization", "Basic " + Base64Utils .encodeToString((username + ":" + token).getBytes(UTF_8))) .retrieve() .bodyToFlux(GithubRepo.class); }了解API调用的简单性和简洁性!假设我们有一个名为类GithubRepo,确认到GitHub的API响应,上面的函数会返回一个Flux的GithubRepo对象。请注意,我使用Github的基本认证机制来调用API。它需要您的github用户名和个人访问令牌,您可以从https://github.com/settings/tokens中生成该令牌。使用exchange()方法来检索响应该retrieve()方法是获取响应主体的最简单方法。但是,如果您希望对响应拥有更多的控制权,那么您可以使用可exchange()访问整个ClientResponse标题和正文的方法 -public Flux<GithubRepo> listGithubRepositories(String username, String token) { return webClient.get() .uri("/user/repos") .header("Authorization", "Basic " + Base64Utils .encodeToString((username + ":" + token).getBytes(UTF_8))) .exchange() .flatMapMany(clientResponse -> clientResponse.bodyToFlux(GithubRepo.class)); }在请求URI中使用参数您可以在请求URI中使用参数,并在uri()函数中分别传递它们的值。所有参数都被花括号包围。在提出请求之前,这些参数将被WebClient自动替换 -public Flux<GithubRepo> listGithubRepositories(String username, String token) { return webClient.get() .uri("/user/repos?sort={sortField}&direction={sortDirection}", "updated", "desc") .header("Authorization", "Basic " + Base64Utils .encodeToString((username + ":" + token).getBytes(UTF_8))) .retrieve() .bodyToFlux(GithubRepo.class); }使用URIBuilder构造请求URI您也可以使用UriBuilder类似的方法获取对请求URI的完全程序控制,public Flux<GithubRepo> listGithubRepositories(String username, String token) { return webClient.get() .uri(uriBuilder -> uriBuilder.path("/user/repos") .queryParam("sort", "updated") .queryParam("direction", "desc") .build()) .header("Authorization", "Basic " + Base64Utils .encodeToString((username + ":" + token).getBytes(UTF_8))) .retrieve() .bodyToFlux(GithubRepo.class); }在WebClient请求中传递Request Body如果你有一个Mono或一个形式的请求体Flux,那么你可以直接将它传递给body()WebClient中的方法,否则你可以从一个对象中创建一个单声道/通量并像这样传递 -public Mono<GithubRepo> createGithubRepository(String username, String token, RepoRequest createRepoRequest) { return webClient.post() .uri("/user/repos") .body(Mono.just(createRepoRequest), RepoRequest.class) .header("Authorization", "Basic " + Base64Utils .encodeToString((username + ":" + token).getBytes(UTF_8))) .retrieve() .bodyToMono(GithubRepo.class); }如果您具有实际值而不是Publisher(Flux/ Mono),则可以使用syncBody()快捷方式传递请求正文 -public Mono<GithubRepo> createGithubRepository(String username, String token, RepoRequest createRepoRequest) { return webClient.post() .uri("/user/repos") .syncBody(createRepoRequest) .header("Authorization", "Basic " + Base64Utils .encodeToString((username + ":" + token).getBytes(UTF_8))) .retrieve() .bodyToMono(GithubRepo.class); } 最后,你可以使用BodyInserters类提供的各种工厂方法来构造一个BodyInserter对象并将其传递给该body()方法。本BodyInserters类包含的方法来创建一个BodyInserter从Object,Publisher,Resource,FormData,MultipartData等-public Mono<GithubRepo> createGithubRepository(String username, String token, RepoRequest createRepoRequest) { return webClient.post() .uri("/user/repos") .body(BodyInserters.fromObject(createRepoRequest)) .header("Authorization", "Basic " + Base64Utils .encodeToString((username + ":" + token).getBytes(UTF_8))) .retrieve() .bodyToMono(GithubRepo.class); }添加过滤器功能WebClient支持使用ExchangeFilterFunction。您可以使用过滤器函数以任何方式拦截和修改请求。例如,您可以使用过滤器函数为Authorization每个请求添加一个标头,或记录每个请求的详细信息。这ExchangeFilterFunction需要两个参数 -在ClientRequest与ExchangeFilterFunction过滤器链中的下一个。它可以修改ClientRequest并调用ExchangeFilterFucntion过滤器链中的下一个来继续下一个过滤器或ClientRequest直接返回修改以阻止过滤器链。1.使用过滤器功能添加基本认证在上面的所有示例中,我们都包含一个Authorization用于使用Github API进行基本身份验证的标头。由于这是所有请求共有的内容,因此您可以在创建过滤器函数时将此逻辑添加到过滤器函数中WebClient。该ExchaneFilterFunctionsAPI已经为基本认证提供了一个过滤器。你可以像这样使用它 -WebClient webClient = WebClient.builder() .baseUrl(GITHUB_API_BASE_URL) .defaultHeader(HttpHeaders.CONTENT_TYPE, GITHUB_V3_MIME_TYPE) .filter(ExchangeFilterFunctions .basicAuthentication(username, token)) .build();现在,您不需要Authorization在每个请求中添加标题。过滤器函数将拦截每个WebClient请求添加此标头。2.使用过滤器功能记录所有请求我们来看一个习惯的例子ExchangeFilterFunction。我们将编写一个过滤器函数来拦截并记录每个请求 -WebClient webClient = WebClient.builder() .baseUrl(GITHUB_API_BASE_URL) .defaultHeader(HttpHeaders.CONTENT_TYPE, GITHUB_V3_MIME_TYPE) .filter(ExchangeFilterFunctions .basicAuthentication(username, token)) .filter(logRequest()) .build(); 这里是logRequest()过滤器功能的实现-private ExchangeFilterFunction logRequest() { return (clientRequest, next) -> { logger.info("Request: {} {}", clientRequest.method(), clientRequest.url()); clientRequest.headers() .forEach((name, values) -> values.forEach(value -> logger.info("{}={}", name, value))); return next.exchange(clientRequest); }; }3.使用ofRequestProcessor()和ofResponseProcessor()工厂方法来创建过滤器ExchangeFilterFunction API提供两个名为工厂方法ofRequestProcessor()和ofResponseProcessor()用于创建分别截获该请求和响应滤波器的功能。logRequest()我们在前一节中创建的过滤器函数可以使用ofRequestProcessor()这种工厂方法创建-private ExchangeFilterFunction logRequest() { ExchangeFilterFunction.ofRequestProcessor(clientRequest -> { logger.info("Request: {} {}", clientRequest.method(), clientRequest.url()); clientRequest.headers() .forEach((name, values) -> values.forEach(value -> logger.info("{}={}", name, value))); return Mono.just(clientRequest); }); } 如果您想拦截WebClient响应,则可以使用该ofResponseProcessor()方法创建像这样的过滤器功能 -private ExchangeFilterFunction logResposneStatus() { return ExchangeFilterFunction.ofResponseProcessor(clientResponse -> { logger.info("Response Status {}", clientResponse.statusCode()); return Mono.just(clientResponse); }); }处理WebClient错误只要接收到状态码为4xx或5xx的响应retrieve(),WebClient中的方法WebClientResponseException就会抛出一个。您可以使用onStatus()像这样的方法来自定义,public Flux<GithubRepo> listGithubRepositories() { return webClient.get() .uri("/user/repos?sort={sortField}&direction={sortDirection}", "updated", "desc") .retrieve() .onStatus(HttpStatus::is4xxClientError, clientResponse -> Mono.error(new MyCustomClientException()) ) .onStatus(HttpStatus::is5xxServerError, clientResponse -> Mono.error(new MyCustomServerException()) ) .bodyToFlux(GithubRepo.class); }请注意,与retrieve()方法不同,该exchange()方法在4xx或5xx响应的情况下不会引发异常。您需要自己检查状态代码,并以您想要的方式处理它们。使用@ExceptionHandler控制器内部的WebClientResponseExceptions处理您可以@ExceptionHandler在控制器内部使用这种方式来处理WebClientResponseException并返回适当的响应给客户端 -@ExceptionHandler(WebClientResponseException.class) public ResponseEntity<String> handleWebClientResponseException(WebClientResponseException ex) { logger.error("Error from WebClient - Status {}, Body {}", ex.getRawStatusCode(), ex.getResponseBodyAsString(), ex); return ResponseEntity.status(ex.getRawStatusCode()).body(ex.getResponseBodyAsString()); }使用Spring 5 WebTestClient测试Rest APIWebTestClient包含类似于WebClient的请求方法。另外,它还包含检查响应状态,标题和正文的方法。您也可以像AssertJ使用WebTestClient 一样使用断言库。查看以下示例以了解如何使用WebTestClient执行其他API测试 -提示:项目源码下载spring-webclient-webtestclient-demo-master.zip
  • jQuery的$.ajax()使用及API文档

    jQuery的$.ajax()使用及API文档,jQuery,ajax,$.ajax()jQuery的$.ajax()使用及API文档 <h2>定义和用法</h2> <p>ajax() 方法通过 HTTP 请求加载远程数据。</p> <p>该方法是 jQuery 底层 AJAX 实现。简单易用的高层实现见 $.get, $.post 等。$.ajax() 返回其创建的 XMLHttpRequest 对象。大多数情况下你无需直接操作该函数,除非你需要操作不常用的选项,以获得更多的灵活性。</p> <p>最简单的情况下,$.ajax() 可以不带任何参数直接使用。</p> <p>注意:所有的选项都可以通过 $.ajaxSetup() 函数来全局设置。</p> <h3>语法</h3> <pre> <code class="language-javascript">jQuery.ajax([settings])</code></pre> <table class="table table-hover"> <tbody> <tr> <th>参数</th> <th>描述</th> </tr> <tr> <td><em>settings</em></td> <td> <p>可选。用于配置 Ajax 请求的键值对集合。</p> <p>可以通过 $.ajaxSetup() 设置任何选项的默认值。</p> </td> </tr> </tbody> </table>   <h3>参数</h3> <strong>options</strong> <p>类型:Object</p> <p>可选。AJAX 请求设置。所有选项都是可选的。</p> <br /> <strong>async</strong> <p>类型:Boolean</p> <p>默认值: true。默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false。</p> <p>注意,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。</p> <br /> <strong>beforeSend</strong>(XHR) <p>类型:Function</p> <p>发送请求前可修改 XMLHttpRequest 对象的函数,如添加自定义 HTTP 头。</p> <p>XMLHttpRequest 对象是唯一的参数。</p> <p>这是一个 Ajax 事件。如果返回 false 可以取消本次 ajax 请求。</p> <br /> <strong>cache</strong> <p>类型:Boolean</p> <p>默认值: true,dataType 为 script 和 jsonp 时默认为 false。设置为 false 将不缓存此页面。</p> <p>jQuery 1.2 新功能。</p> <br /> <strong>complete</strong>(XHR, TS) <p>类型:Function</p> <p>请求完成后回调函数 (请求成功或失败之后均调用)。</p> <p>参数: XMLHttpRequest 对象和一个描述请求类型的字符串。</p> <p>这是一个 Ajax 事件。</p> <br /> <strong>contentType</strong> <p>类型:String</p> <p>默认值: "application/x-www-form-urlencoded"。发送信息至服务器时内容编码类型。</p> <p>默认值适合大多数情况。如果你明确地传递了一个 content-type 给 $.ajax() 那么它必定会发送给服务器(即使没有数据要发送)。</p> <br /> <strong>context</strong> <p>类型:Object</p> <p>这个对象用于设置 Ajax 相关回调函数的上下文。也就是说,让回调函数内 this 指向这个对象(如果不设定这个参数,那么 this 就指向调用本次 AJAX 请求时传递的 options 参数)。比如指定一个 DOM 元素作为 context 参数,这样就设置了 success 回调函数的上下文为这个 DOM 元素。</p> <p>就像这样:<br />  </p> <pre> <code class="language-javascript">$.ajax({ url: "test.html", context: document.body, success: function(){ $(this).addClass("done"); }});</code></pre> <strong>data</strong> <p>类型:String</p> <p>发送到服务器的数据。将自动转换为请求字符串格式。GET 请求中将附加在 URL 后。查看 processData 选项说明以禁止此自动转换。必须为 Key/Value 格式。如果为数组,jQuery 将自动为不同值对应同一个名称。如 {foo:["bar1", "bar2"]} 转换为 '&foo=bar1&foo=bar2'。</p> <br /> <strong>dataFilter</strong> <p>类型:Function</p> <p>给 Ajax 返回的原始数据的进行预处理的函数。提供 data 和 type 两个参数:data 是 Ajax 返回的原始数据,type 是调用 jQuery.ajax 时提供的 dataType 参数。函数返回的值将由 jQuery 进一步处理。</p> <br /> <strong>dataType</strong> <p>类型:String</p> <p>预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,比如 XML MIME 类型就被识别为 XML。在 1.4 中,JSON 就会生成一个 JavaScript 对象,而 script 则会执行这个脚本。随后服务器端返回的数据会根据这个值解析后,传递给回调函数。可用值:</p> <ul> <li>"xml": 返回 XML 文档,可用 jQuery 处理。</li> <li>"html": 返回纯文本 HTML 信息;包含的 script 标签会在插入 dom 时执行。</li> <li>"script": 返回纯文本 JavaScript 代码。不会自动缓存结果。除非设置了 "cache" 参数。注意:在远程请求时(不在同一个域下),所有 POST 请求都将转为 GET 请求。(因为将使用 DOM 的 script标签来加载)</li> <li>"json": 返回 JSON 数据 。</li> <li>"jsonp": JSONP 格式。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。</li> <li>"text": 返回纯文本字符串</li> </ul> <br /> <strong>error</strong> <p>类型:Function</p> <p>默认值: 自动判断 (xml 或 html)。请求失败时调用此函数。</p> <p>有以下三个参数:XMLHttpRequest 对象、错误信息、(可选)捕获的异常对象。</p> <p>如果发生了错误,错误信息(第二个参数)除了得到 null 之外,还可能是 "timeout", "error", "notmodified" 和 "parsererror"。</p> <p>这是一个 Ajax 事件。</p> <br /> <strong>global</strong> <p>类型:Boolean</p> <p>是否触发全局 AJAX 事件。默认值: true。设置为 false 将不会触发全局 AJAX 事件,如 ajaxStart 或 ajaxStop 可用于控制不同的 Ajax 事件。</p> <br /> <strong>ifModified</strong> <p>类型:Boolean</p> <p>仅在服务器数据改变时获取新数据。默认值: false。使用 HTTP 包 Last-Modified 头信息判断。在 jQuery 1.4 中,它也会检查服务器指定的 'etag' 来确定数据没有被修改过。</p> <br /> <strong>jsonp</strong> <p>类型:String</p> <p>在一个 jsonp 请求中重写回调函数的名字。这个值用来替代在 "callback=?" 这种 GET 或 POST 请求中 URL 参数里的 "callback" 部分,比如 {jsonp:'onJsonPLoad'} 会导致将 "onJsonPLoad=?" 传给服务器。</p> <br /> <strong>jsonpCallback</strong> <p>类型:String</p> <p>为 jsonp 请求指定一个回调函数名。这个值将用来取代 jQuery 自动生成的随机函数名。这主要用来让 jQuery 生成度独特的函数名,这样管理请求更容易,也能方便地提供回调函数和错误处理。你也可以在想让浏览器缓存 GET 请求的时候,指定这个回调函数名。</p> <br /> <strong>password</strong> <p>类型:String</p> <p>用于响应 HTTP 访问认证请求的密码</p> <br /> <strong>processData</strong> <p>类型:Boolean</p> <p>默认值: true。默认情况下,通过data选项传递进来的数据,如果是一个对象(技术上讲只要不是字符串),都会处理转化成一个查询字符串,以配合默认内容类型 "application/x-www-form-urlencoded"。如果要发送 DOM 树信息或其它不希望转换的信息,请设置为 false。</p> <br /> <strong>scriptCharset</strong> <p>类型:String</p> <p>只有当请求时 dataType 为 "jsonp" 或 "script",并且 type 是 "GET" 才会用于强制修改 charset。通常只在本地和远程的内容编码不同时使用。</p> <br /> <strong>success</strong> <p>类型:Function</p> <p>请求成功后的回调函数。</p> <p>参数:由服务器返回,并根据 dataType 参数进行处理后的数据;描述状态的字符串。</p> <p>这是一个 Ajax 事件。</p> <br /> <strong>traditional</strong> <p>类型:Boolean</p> <p>如果你想要用传统的方式来序列化数据,那么就设置为 true。请参考工具分类下面的 jQuery.param 方法。</p> <br /> <strong>timeout</strong> <p>类型:Number</p> <p>设置请求超时时间(毫秒)。此设置将覆盖全局设置。</p> <br /> <strong>type</strong> <p>类型:String</p> <p>默认值: "GET")。请求方式 ("POST" 或 "GET"), 默认为 "GET"。注意:其它 HTTP 请求方法,如 PUT 和 DELETE 也可以使用,但仅部分浏览器支持。</p> <br /> <strong>url</strong> <p>类型:String</p> <p>默认值: 当前页地址。发送请求的地址。</p> <br /> username <p>类型:String</p> <p>用于响应 HTTP 访问认证请求的用户名。</p> <br /> xhr <p>类型:Function</p> <p>需要返回一个 XMLHttpRequest 对象。默认在 IE 下是 ActiveXObject 而其他情况下是 XMLHttpRequest 。用于重写或者提供一个增强的 XMLHttpRequest 对象。这个参数在 jQuery 1.3 以前不可用。<br /> <br />  </p> <h2>回调函数</h2> <p>如果要处理 $.ajax() 得到的数据,则需要使用回调函数:beforeSend、error、dataFilter、success、complete。</p> <h3>beforeSend</h3> <p>在发送请求之前调用,并且传入一个 XMLHttpRequest 作为参数。</p> <h3>error</h3> <p>在请求出错时调用。传入 XMLHttpRequest 对象,描述错误类型的字符串以及一个异常对象(如果有的话)</p> <h3>dataFilter</h3> <p>在请求成功之后调用。传入返回的数据以及 "dataType" 参数的值。并且必须返回新的数据(可能是处理过的)传递给 success 回调函数。</p> <h3>success</h3> <p>当请求之后调用。传入返回后的数据,以及包含成功代码的字符串。</p> <h3>complete</h3> <p>当请求完成之后调用这个函数,无论成功或失败。传入 XMLHttpRequest 对象,以及一个包含成功或错误代码的字符串。</p> <h2><strong>数据类型</strong></h2> <p>$.ajax() 函数依赖服务器提供的信息来处理返回的数据。如果服务器报告说返回的数据是 XML,那么返回的结果就可以用普通的 XML 方法或者 jQuery 的选择器来遍历。如果见得到其他类型,比如 HTML,则数据就以文本形式来对待。</p> <p>通过 dataType 选项还可以指定其他不同数据处理方式。除了单纯的 XML,还可以指定 html、json、jsonp、script 或者 text。</p> <p>其中,text 和 xml 类型返回的数据不会经过处理。数据仅仅简单的将 XMLHttpRequest 的 responseText 或 responseHTML 属性传递给 success 回调函数。</p> <p>注意:我们必须确保网页服务器报告的 MIME 类型与我们选择的 dataType 所匹配。比如说,XML的话,服务器端就必须声明 text/xml 或者 application/xml 来获得一致的结果。</p> <p>如果指定为 html 类型,任何内嵌的 JavaScript 都会在 HTML 作为一个字符串返回之前执行。类似地,指定 script 类型的话,也会先执行服务器端生成 JavaScript,然后再把脚本作为一个文本数据返回。</p> <p>如果指定为 json 类型,则会把获取到的数据作为一个 JavaScript 对象来解析,并且把构建好的对象作为结果返回。为了实现这个目的,它首先尝试使用 JSON.parse()。如果浏览器不支持,则使用一个函数来构建。</p> <p>JSON 数据是一种能很方便通过 JavaScript 解析的结构化数据。如果获取的数据文件存放在远程服务器上(域名不同,也就是跨域获取数据),则需要使用 jsonp 类型。使用这种类型的话,会创建一个查询字符串参数 callback=? ,这个参数会加在请求的 URL 后面。服务器端应当在 JSON 数据前加上回调函数名,以便完成一个有效的 JSONP 请求。如果要指定回调函数的参数名来取代默认的 callback,可以通过设置 $.ajax() 的 jsonp 参数。</p> <p>注意:JSONP 是 JSON 格式的扩展。它要求一些服务器端的代码来检测并处理查询字符串参数。</p> <p>如果指定了 script 或者 jsonp 类型,那么当从服务器接收到数据时,实际上是用了 <script> 标签而不是 XMLHttpRequest 对象。这种情况下,$.ajax() 不再返回一个 XMLHttpRequest 对象,并且也不会传递事件处理函数,比如 beforeSend。</p> <h2><strong>发送数据到服务器</strong></h2> <p>默认情况下,Ajax 请求使用 GET 方法。如果要使用 POST 方法,可以设定 type 参数值。这个选项也会影响 data 选项中的内容如何发送到服务器。</p> <p>data 选项既可以包含一个查询字符串,比如 key1=value1&key2=value2 ,也可以是一个映射,比如 {key1: 'value1', key2: 'value2'} 。如果使用了后者的形式,则数据再发送器会被转换成查询字符串。这个处理过程也可以通过设置 processData 选项为 false 来回避。如果我们希望发送一个 XML 对象给服务器时,这种处理可能并不合适。并且在这种情况下,我们也应当改变 contentType 选项的值,用其他合适的 MIME 类型来取代默认的 application/x-www-form-urlencoded 。</p> <h2><strong>高级选项</strong></h2> <p>global 选项用于阻止响应注册的回调函数,比如 .ajaxSend,或者 ajaxError,以及类似的方法。这在有些时候很有用,比如发送的请求非常频繁且简短的时候,就可以在 ajaxSend 里禁用这个。</p> <p>如果服务器需要 HTTP 认证,可以使用用户名和密码可以通过 username 和 password 选项来设置。</p> <p>Ajax 请求是限时的,所以错误警告被捕获并处理后,可以用来提升用户体验。请求超时这个参数通常就保留其默认值,要不就通过 jQuery.ajaxSetup 来全局设定,很少为特定的请求重新设置 timeout 选项。</p> <p>默认情况下,请求总会被发出去,但浏览器有可能从它的缓存中调取数据。要禁止使用缓存的结果,可以设置 cache 参数为 false。如果希望判断数据自从上次请求后没有更改过就报告出错的话,可以设置 ifModified 为 true。</p> <p>scriptCharset 允许给 <script> 标签的请求设定一个特定的字符集,用于 script 或者 jsonp 类似的数据。当脚本和页面字符集不同时,这特别好用。</p> <p>Ajax 的第一个字母是 asynchronous 的开头字母,这意味着所有的操作都是并行的,完成的顺序没有前后关系。$.ajax() 的 async 参数总是设置成true,这标志着在请求开始后,其他代码依然能够执行。强烈不建议把这个选项设置成 false,这意味着所有的请求都不再是异步的了,这也会导致浏览器被锁死。</p> <p>$.ajax 函数返回它创建的 XMLHttpRequest 对象。通常 jQuery 只在内部处理并创建这个对象,但用户也可以通过 xhr 选项来传递一个自己创建的 xhr 对象。返回的对象通常已经被丢弃了,但依然提供一个底层接口来观察和操控请求。比如说,调用对象上的 .abort() 可以在请求完成前挂起请求。</p> <p> </p>
  • Apache配置worker模式_Apache配置worker模式调优

    Apache配置worker模式_Apache配置worker模式调优1.通过yum安装Apache(安装版本为:2.4.6)<br /> <br /> 2.查看默认的工作模式 <pre> <code class="language-html">[root@VM_26_67_centos ~]# httpd -V AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message Server version: Apache/2.4.6 (CentOS) Server built:   Oct 19 2017 20:39:16 Server's Module Magic Number: 20120211:24 Server loaded:  APR 1.4.8, APR-UTIL 1.5.2 Compiled using: APR 1.4.8, APR-UTIL 1.5.2 Architecture:   64-bit Server MPM:     prefork   threaded:     no     forked:     yes (variable process count) Server compiled with....  -D APR_HAS_SENDFILE  -D APR_HAS_MMAP  -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)  -D APR_USE_SYSVSEM_SERIALIZE  -D APR_USE_PTHREAD_SERIALIZE  -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT  -D APR_HAS_OTHER_CHILD  -D AP_HAVE_RELIABLE_PIPED_LOGS  -D DYNAMIC_MODULE_LIMIT=256  -D HTTPD_ROOT="/etc/httpd"  -D SUEXEC_BIN="/usr/sbin/suexec"  -D DEFAULT_PIDLOG="/run/httpd/httpd.pid"  -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"  -D DEFAULT_ERRORLOG="logs/error_log"  -D AP_TYPES_CONFIG_FILE="conf/mime.types</code></pre> <br /> 3.切换到Apache的配置目录 <pre> <code class="language-html">#cd /etc/httpd/</code></pre> <br /> 这里有三个配置目录<br /> conf->核心配置<br /> conf.d->在conf中的http.conf会引入该目录下的其他配置<br /> conf.modules.d->Apache 的模块配置<br /> <br /> 还有个模块的安装存放目录的链接目录<br /> modules->模块存放目录<br /> 查看安装的工作模式模块 <pre> <code class="language-html">[root@VM_26_67_centos httpd]# ll modules/mod_mpm_* -rwxr-xr-x 1 root root 61040 Oct 20 04:40 modules/mod_mpm_event.so -rwxr-xr-x 1 root root 31872 Oct 20 04:40 modules/mod_mpm_prefork.so -rwxr-xr-x 1 root root 48520 Oct 20 04:40 modules/mod_mpm_worker.so [root@VM_26_67_centos httpd]# </code></pre> <br /> 4.修改加载模式模块<br /> 切换至模块加载配置文件目录 <pre> <code class="language-html">[root@VM_26_67_centos httpd]# cd /etc/httpd/conf.modules.d/ [root@VM_26_67_centos conf.modules.d]# ls 00-base.conf  00-dav.conf  00-lua.conf  00-mpm.conf  00-proxy.conf  00-systemd.conf  01-cgi.conf  10-php.conf [root@VM_26_67_centos conf.modules.d]#</code></pre> <br /> 修改配置文件00-mpm.conf <pre> <code class="language-bash"># Select the MPM module which should be used by uncommenting exactly # one of the following LoadModule lines: # prefork MPM: Implements a non-threaded, pre-forking web server # See: http://httpd.apache.org/docs/2.4/mod/prefork.html #注释默认工作模式模块 #LoadModule mpm_prefork_module modules/mod_mpm_prefork.so # worker MPM: Multi-Processing Module implementing a hybrid # multi-threaded multi-process web server # See: http://httpd.apache.org/docs/2.4/mod/worker.html #启用worker工作模式模块 LoadModule mpm_worker_module modules/mod_mpm_worker.so # event MPM: A variant of the worker MPM with the goal of consuming # threads only for connections with active processing # See: http://httpd.apache.org/docs/2.4/mod/event.html # #LoadModule mpm_event_module modules/mod_mpm_event.so </code></pre> <br /> <br /> 5.在Apache得核心配置文件httpd.conf中添加以下配置模块 <pre> <code class="language-html">cd /etc/httpd/conf <IfModule mpm_worker_module>     StartServers             3     MinSpareThreads         75     MaxSpareThreads        250     ThreadsPerChild         25     MaxRequestWorkers      400     MaxConnectionsPerChild   0 </IfModule></code></pre> 建议配置: <pre> <code class="language-bash">#mpm_worker模块 <IfModule mpm_worker_module> StartServers 2 #推荐设置:小=默认 中=3~5 大=5~10 MaxClients 150 #推荐设置:小=500 中=500~1500 大型=1500~3000 MinSpareThreads 25 #推荐设置:小=默认 中=50~100 大=100~200 MaxSpareThreads 75 #推荐设置:小=默认 中=80~160 大=200~400 ThreadsPerChild 25 #推荐设置:小=默认 中=50~100 大型=100~200 MaxRequestsPerChild 0 #推荐设置:小=10000 中或大=10000~50000 #(此外,如果MaxClients/ThreadsPerChild大于16,还需额外设置ServerLimit参数,ServerLimit必须大于等于 MaxClients/ThreadsPerChild 的值。) </IfModule></code></pre> <p>对应的配置参数作用如下:</p> StartServers<br /> 启动Apache时创建的子进程数。<br /> MinSpareServers<br /> 处于空闲状态的最小子进程数。 <p>所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于<code>MinSpareServers</code>,那么Apache将以最大每秒一个的速度产生新的子进程。只有在非常繁忙机器上才需要调整这个参数。此值不宜过大。</p> <br /> MaxSpareServers<br /> 处于空闲状态的最大子进程数。 <p>只有在非常繁忙机器上才需要调整这个参数。此值不宜过大。如果你将该指令的值设置为比<code>MinSpareServers</code>小,Apache将会自动将其修改成<code>MinSpareServers+1</code>。</p> <br /> MaxClients<br /> 允许同时连接的最大请求数量。 <p>任何超过<code>MaxClients</code>限制的请求都将进入等待队列,直到达到<code>ListenBacklog</code>指令限制的最大值为止。</p> <p>对于非线程型的MPM(也就是<code>mpm_prefork</code>),<code>MaxClients</code>表示可以用于处理客户端请求的最大子进程数量,默认值是256。要增大这个值,你必须同时增大<code>ServerLimit</code>。</p> <p>对于线程型或者混合型的MPM(也就是<code>mpm_beos</code>或<code>mpm_worker</code>),<code>MaxClients</code>表示可以用于处理客户端请求的最大线程数量。线程型的<code>mpm_beos</code>的默认值是50。对于混合型的MPM默认值是16(<code>ServerLimit</code>)乘以25(<code>ThreadsPerChild</code>)的结果。因此要将<code>MaxClients</code>增加到超过16个进程才能提供的时候,你必须同时增加<code>ServerLimit</code>的值。</p> <br /> MinSpareThreads<br /> 处于空闲状态的最小线程数。 <p>不同的MPM对这个指令的处理是不一样的:</p> <p><code>mpm_worker</code>的默认值是75。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太少,子进程将产生新的空闲线程。<code>mpm_netware</code>的默认值是10。既然这个MPM只运行单独一个子进程,此MPM当然亦基于整个服务器监视空闲线程数。<code>mpm_beos</code>和<code>mpmt_os2</code>的工作方式与<code>mpm_netware</code>差不多,<code>mpm_beos</code>的默认值是1;<code>mpmt_os2</code>的默认值是5。</p> <br /> MaxSpareThreads<br /> 处于空闲状态的最大线程数。 <p>不同的MPM对这个指令的处理是不一样的:</p> <p><code>mpm_worker</code>的默认值是250。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太多,子进程将杀死多余的空闲线程。<code>mpm_netware</code>的默认值是100。既然这个MPM只运行单独一个子进程,此MPM当然亦基于整个服务器监视空闲线程数。<code>mpm_beos</code>和<code>mpmt_os2</code>的工作方式与<code>mpm_netware</code>差不多,<code>mpm_beos</code>的默认值是50;<code>mpmt_os2</code>的默认值是10。</p> <p><em>备注</em>:<code>ServerLimit</code>表示Apache允许创建的最大进程数。 值得注意的是,Apache在编译时内部有一个硬限制<code>ServerLimit 20000</code>(对于<code>mpm_prefork</code>模块为<code>ServerLimit 200000</code>)。你不能超越这个限制。<br /> 使用这个指令时要特别当心。如果将<code>ServerLimit</code>设置成一个高出实际需要许多的值,将会有过多的共享内存被分配。如果将<code>ServerLimit</code>和<code>MaxClients</code>设置成超过系统的处理能力,Apache可能无法启动,或者系统将变得不稳定。</p> <p><em>注意</em>:在配置相关参数时,请先保证服务器具备<em>足够</em>的硬件性能(例如:CPU、内存等)。 如果发现自启动后,随着服务器的运行时间增加,服务器的内存占用也随之增加,可能是程序中出现内存泄露,请向下调整参数<code>MaxRequestsPerChild</code>的值以降低内存泄露带来的影响,然后尽快找出程序中的问题之所在。</p> <br /> 6.重启httpd服务 <pre> <code class="language-html">[root@VM_26_67_centos httpd]# service httpd restart</code></pre> <br /> <br /> 7.查看工作模式 <pre> <code class="language-html">[root@VM_26_67_centos httpd]# httpd -V AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message Server version: Apache/2.4.6 (CentOS) Server built:   Oct 19 2017 20:39:16 Server's Module Magic Number: 20120211:24 Server loaded:  APR 1.4.8, APR-UTIL 1.5.2 Compiled using: APR 1.4.8, APR-UTIL 1.5.2 Architecture:   64-bit Server MPM:     worker   threaded:     yes (fixed thread count)     forked:     yes (variable process count) Server compiled with....  -D APR_HAS_SENDFILE  -D APR_HAS_MMAP  -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)  -D APR_USE_SYSVSEM_SERIALIZE  -D APR_USE_PTHREAD_SERIALIZE  -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT  -D APR_HAS_OTHER_CHILD  -D AP_HAVE_RELIABLE_PIPED_LOGS  -D DYNAMIC_MODULE_LIMIT=256  -D HTTPD_ROOT="/etc/httpd"  -D SUEXEC_BIN="/usr/sbin/suexec"  -D DEFAULT_PIDLOG="/run/httpd/httpd.pid"  -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"  -D DEFAULT_ERRORLOG="logs/error_log"  -D AP_TYPES_CONFIG_FILE="conf/mime.types"  -D SERVER_CONFIG_FILE="conf/httpd.conf"</code></pre>
  • Linux yum nginx安装和nginx入门配置方法

    Linux(centos) nginx安装和nginx入门配置方法,centos yum 安装nginxLinux(centos) nginx安装和nginx入门配置方法<br /> <br /> 1.切换至root用户 <pre> <code>$su -</code></pre> 2.执行在线安装命令 <pre> <code class="language-html">#yum install nginx -y</code></pre> 如果上面提示以下内容 <pre> <code class="language-html">[root@template ~]# yum install nginx -y Loaded plugins: fastestmirror, security Setting up Install Process Loading mirror speeds from cached hostfile * base: mirrors.cqu.edu.cn * extras: mirror.bit.edu.cn * updates: mirrors.tuna.tsinghua.edu.cn No package nginx available. Error: Nothing to do [root@template ~]# yum install nginx -y Loaded plugins: fastestmirror, security Setting up Install Process Loading mirror speeds from cached hostfile * base: mirrors.cqu.edu.cn * extras: mirror.bit.edu.cn * updates: mirrors.tuna.tsinghua.edu.cn No package nginx available. </code></pre> 则需要配置nginx的源,如果直接安装则忽略这里的配置源步骤。<br /> <br /> <strong>配置yum的nginx源</strong><br /> <code>/etc/yum.repos.d/</code>目录下创建一个源配置文件<code>nginx.repo</code><br /> 命令: <pre> <code>cd /etc/yum.repos.d/</code></pre>   <pre> <code>vim nginx.repo</code></pre> <br /> nginx.repo内容输入: <pre> <code class="language-html">[nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/6/$basearch/ gpgcheck=0 enabled=1</code></pre> 一般情况centos7会自带源的,只有部分centos6没有。所以配置源。配置完成后再执行安装命令 <pre> <code>yum install nginx -y</code></pre> <br /> <br /> 3.安装完成,启动nginx命令 <pre> <code class="language-html">#nginx</code></pre> 4.启动后在浏览器输入刚才安装好nginx的服务器IP地址<br /> <img alt="nginx" class="img-thumbnail" src="/assist/images/blog/d26591d7-3032-44ee-8352-3d55fdcbe4de.png" style="height:375px; width:900px" /><br /> 出现上面的页面标识安装和启动成功<br /> 5.nginx停止 <pre> <code class="language-html">#nginx -s stop</code></pre> <br /> 6.nginx通用配置文件nginx.conf配置说明<br />   <pre> <code class="language-html">#指定nginx进程运行用户及用户组(默认nginx)(动静分离时候需要。注意权限否则静态文件可能访问不到。) user nginx; #nginx要开启的进程数,建议按照cpu数目来指定,一般跟cpu核数相同或为它的倍数 #推荐最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了 worker_processes 8; #为每个进程分配cpu,上例中将8个进程分配到8个cpu worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; #worker_processes 4;#4个进程配置 #worker_cpu_affinity 0001 0010 0100 1000 error_log /var/log/nginx/error.log warn;#错误日志存放路径,以及日志级别默认warn pid /var/run/nginx.pid;#默认存放nginx进程id文件 #当一个nginx进程打开的最多文件描述符数目,理论值应该是系统的最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致 #[注]文件资源限制的配置可以在/etc/security/limits.conf设置,针对root/user等各个用户或者*代表所有用户来设置。 worker_rlimit_nofile 65535; events { #使用epoll的I/O模型,用这个模型来高效处理异步事件,epoll是linux平台下的高效模式 use epoll; #每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections #定义nginx每个进程的最大连接数为51200,一般网上都配置65535,根据张宴大神的建议51200即可 worker_connections 51200;#默认1024 } http { include /etc/nginx/mime.types;#实现对配置文件所包含的文件的设定 default_type application/octet-stream;#设置默认类型为二进制流 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; #http连接超时时间,默认是60s,功能是使客户端到服务器端的连接在设定的时间内持续有效,当出现对服务器的后继请求时,该功能避免了建立或者重新建立连接。切记这个参数也不能设置过大!否则会导致许多无效的http连接占据着nginx的连接数,终nginx崩溃! keepalive_timeout 65; #客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。 client_header_buffer_size 4K; #############下面部分为动静分离需要nginx代理文件时候使用,仅做Tomcat分发则不需要启用############ #下面这个参数将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。 #open_file_cache max=102400 inactive=20s; #下面这个是指多长时间检查一次缓存的有效信息。 #open_file_cache_valid 30s; #open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。 #open_file_cache_min_uses 1; ############上面面部分为动静分离需要nginx代理文件时候使用,仅做Tomcat分发则不需要启用############ #隐藏响应头中的有关操作系统和web server(Nginx)版本号的信息,这样对于安全性是有好处的。 server_tokens off; #gzip on; include /etc/nginx/conf.d/*.conf; }</code></pre> <br /> 7.新增一个nginx解析<br /> 切换目录至配置目录 <pre> <code>#cd /etc/nginx/conf.d/</code></pre> 新建一个解析配置文件test.conf <pre> <code class="language-html">#server {###配置虚拟机 # listen 80;#配置监听端口 # server_name zhljc.com www.zhljc.com srv.gift www.srv.gift 127.0.0.1; #配置访问域名,可以有多个[127.0.0.1/localhost表示任何] # location / {#对所有地址进行负载均衡 # root html;##定义服务器的默认网站根目录位置 # index index.html index.htm;##定义首页索引文件的名称 # # #以下三行,目的是将代理服务器收到的用户的信息传到真实服务器上 # proxy_set_header Host $host; # proxy_set_header X-Real-IP $remote_addr; # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # # #websocket # proxy_http_version 1.1; # proxy_set_header Upgrade $http_upgrade; # proxy_set_header Connection "upgrade"; # # proxy_pass http://localhost:8080/bamboo; # }#end location # if ($host = 'www.xqlee.net'){ # rewrite ^/(.*)$ http://xqlee.net/$1 permanent; # } # #}#end server #upstream tomcats-webservice {#设定负载均衡的服务器列表,注意多个负载时候这里的名字必须唯一 #upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。 #负载方式,默认 #1.轮询[每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除] #2.weight 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 #3.ip_hash 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 #server localhost:8000 weight=1 max_fails=3 fail_timeout=60s; #第一台机器 #server localhost:8080 weight=1 max_fails=3 fail_timeout=60s; #第二台机器 #ip_hash; #server localhost:8000; #}#end upstream </code></pre> <br /> <br />  
  • FastDFS5.10卸载,centos卸载FastDFS(二)

    FastDFS5.10卸载,在centos6系统中卸载FastDFS(二),FastDFS卸载,FastDFS<p><span style="font-family:宋体">由于</span>FastDFS<span style="font-family:宋体">软件并未提供直接的一键卸载,所以卸载有点麻烦</span>,FastDFS<span style="font-family:宋体">卸载步骤如下</span>:</p> <p><strong><em><span style="font-family:宋体"><span style="color:red">注意</span></span><span style="color:red">:</span></em></strong><strong><em><span style="font-family:宋体"><span style="color:red">所有删除操作请务必先查看是否存在文件文件是否为</span></span><span style="color:red">FastDFS</span></em></strong><strong><em><span style="font-family:宋体"><span style="color:red">相关</span></span></em></strong></p> <h3 style="margin-left:18.0pt">1) <span style="font-family:宋体">停止服务</span></h3> <p><strong>[root@bogon fdfs]#service fdfs_trackerd stop</strong></p> <p><strong>[root@bogon fdfs]#service fdfs_storaged stop</strong></p> <p style="margin-left:18.0pt"> </p> <h3 style="margin-left:18.0pt">2) <span style="font-family:宋体">通过</span>storage.conf<span style="font-family:宋体">找到</span>base_path<span style="font-family:宋体">和</span>store_path<span style="font-family:宋体">然后删除</span></h3> <p><strong>[root@bogon fdfs]# cat /etc/fdfs/storage.conf |grep base_path</strong></p> <p>base_path=<strong><span style="color:red">/opt/fastdfs_storage</span></strong></p> <p># store_path#, based 0, if store_path0 not exists, it's value is base_path</p> <p>[root@bogon fdfs]#</p> <p>[root@bogon fdfs]# cat /etc/fdfs/storage.conf |grep store_path</p> <p>store_path_count=1</p> <p># store_path#, based 0, if store_path0 not exists, it's value is base_path</p> <p>store_path0=<strong><span style="color:red">/opt/fastdfs_storage_data</span></strong></p> <p>#store_path1=/home/yuqing/fastdfs2</p> <p># store_path (disk), value can be 1 to 256, default value is 256</p> <p>[root@bogon fdfs]#</p> <p> </p> <p><span style="font-family:宋体">删除上面标红的路径</span>,</p> <p><strong><span style="font-family:宋体"><span style="color:red">注意</span></span><span style="color:red">,</span></strong><strong><span style="font-family:宋体"><span style="color:red">如果有未备份的文件,请先备份再删除</span></span></strong></p> <p> </p> <p><strong>[root@bogon fdfs]# rm -rf /opt/fastdfs_storage</strong></p> <p><strong>[root@bogon fdfs]# rm -rf /opt/fastdfs_storage_data</strong></p> <p> </p> <h3 style="margin-left:18.0pt">3) <span style="font-family:宋体">通过</span>tracker.conf<span style="font-family:宋体">找到</span>base_path<span style="font-family:宋体">然后删除</span></h3> <p><strong>[root@bogon fdfs]# cat /etc/fdfs/tracker.conf |grep base_path</strong></p> <p>base_path=/opt/fastdfs_tracker</p> <p><strong>[root@bogon fdfs]#rm –rf /opt/fastdfs_tracker</strong></p> <h3 style="margin-left:18.0pt">4) <span style="font-family:宋体">删除配置文件目录</span></h3> <p><strong>[root@bogon ~]# pwd</strong></p> <p>/root</p> <p><strong>[root@bogon ~]# rm -rf /etc/fdfs/</strong></p> <p>[root@bogon ~]#</p> <p> </p> <h3 style="margin-left:18.0pt">5) <span style="font-family:宋体">删除链接文件</span></h3> <p><span style="font-family:宋体">删除</span>tracker<span style="font-family:宋体">的链接文件</span></p> <p><strong>#rm –rf /usr/local/bin/fdfs_trackerd</strong></p> <p><strong>#rm –rf /usr/local/bin/stop.sh</strong></p> <p><strong>#rm –rf /usr/local/bin/restart.sh</strong></p> <p><span style="font-family:宋体">删除</span>storage<span style="font-family:宋体">的链接文件</span></p> <p><strong>#rm –rf /usr/local/bin/fdfs_storaged</strong></p> <h3 style="margin-left:18.0pt">6) <span style="font-family:宋体">删除</span>/usr/bin<span style="font-family:宋体">目录下</span>FastDFS<span style="font-family:宋体">的可执行文件</span></h3> <p><span style="font-family:宋体">首先通过</span>ls<span style="font-family:宋体">命令查看文件</span>,<span style="font-family:宋体">然后删除</span></p> <p>[root@bogon ~]# ll /usr/bin/fdfs_*</p> <p>-rwxr-xr-x. 1 root root 262099 Jul 27 03:01 /usr/bin/fdfs_appender_test</p> <p>-rwxr-xr-x. 1 root root 261796 Jul 27 03:01 /usr/bin/fdfs_appender_test1</p> <p>-rwxr-xr-x. 1 root root 252140 Jul 27 03:01 /usr/bin/fdfs_append_file</p> <p>-rwxr-xr-x. 1 root root 251274 Jul 27 03:01 /usr/bin/fdfs_crc32</p> <p>-rwxr-xr-x. 1 root root 252223 Jul 27 03:01 /usr/bin/fdfs_delete_file</p> <p>-rwxr-xr-x. 1 root root 253062 Jul 27 03:01 /usr/bin/fdfs_download_file</p> <p>-rwxr-xr-x. 1 root root 252756 Jul 27 03:01 /usr/bin/fdfs_file_info</p> <p>-rwxr-xr-x. 1 root root 265444 Jul 27 03:01 /usr/bin/fdfs_monitor</p> <p>-rwxr-xr-x. 1 root root 878573 Jul 27 03:01 /usr/bin/fdfs_storaged</p> <p>-rwxr-xr-x. 1 root root 268499 Jul 27 03:01 /usr/bin/fdfs_test</p> <p>-rwxr-xr-x. 1 root root 267636 Jul 27 03:01 /usr/bin/fdfs_test1</p> <p>-rwxr-xr-x. 1 root root 374059 Jul 27 03:01 /usr/bin/fdfs_trackerd</p> <p>-rwxr-xr-x. 1 root root 253166 Jul 27 03:01 /usr/bin/fdfs_upload_appender</p> <p>-rwxr-xr-x. 1 root root 254296 Jul 27 03:01 /usr/bin/fdfs_upload_file</p> <p>[root@bogon ~]#</p> <p><img alt="1" class="img-thumbnail" src="/assist/images/blog/38e2e3de419d45fa9a13c58310f08be4.png" /></p> <p><span style="font-family:宋体">看到全是</span>FastDFS<span style="font-family:宋体">的文件,删除</span>:</p> <p><strong>[root@bogon ~]# rm -rf  /usr/bin/fdfs_*</strong></p> <p>[root@bogon ~]#</p> <h3 style="margin-left:18.0pt">7) <span style="font-family:宋体">删除</span>/usr/include/<span style="font-family:宋体">目录下</span>FastDFS<span style="font-family:宋体">相关的</span>shell<span style="font-family:宋体">脚本</span></h3> <p><span style="font-family:宋体">首先查看文件</span>:</p> <p>[root@bogon ~]# ll /usr/include/fastdfs/*</p> <p>-rw-r--r--. 1 root root  3752 Jul 27 03:01 /usr/include/fastdfs/client_func.h</p> <p>-rw-r--r--. 1 root root   794 Jul 27 03:01 /usr/include/fastdfs/client_global.h</p> <p>-rw-r--r--. 1 root root   531 Jul 27 03:01 /usr/include/fastdfs/fdfs_client.h</p> <p>-rw-r--r--. 1 root root   946 Jul 27 03:01 /usr/include/fastdfs/fdfs_define.h</p> <p>-rw-r--r--. 1 root root  1005 Jul 27 03:01 /usr/include/fastdfs/fdfs_global.h</p> <p>-rw-r--r--. 1 root root  3117 Jul 27 03:01 /usr/include/fastdfs/fdfs_http_shared.h</p> <p>-rw-r--r--. 1 root root  2699 Jul 27 03:01 /usr/include/fastdfs/fdfs_shared_func.h</p> <p>-rw-r--r--. 1 root root   990 Jul 27 03:01 /usr/include/fastdfs/mime_file_parser.h</p> <p>-rw-r--r--. 1 root root 20104 Jul 27 03:01 /usr/include/fastdfs/storage_client1.h</p> <p>-rw-r--r--. 1 root root 21755 Jul 27 03:01 /usr/include/fastdfs/storage_client.h</p> <p>-rw-r--r--. 1 root root 11555 Jul 27 03:01 /usr/include/fastdfs/tracker_client.h</p> <p>-rw-r--r--. 1 root root 11983 Jul 27 03:01 /usr/include/fastdfs/tracker_proto.h</p> <p>-rw-r--r--. 1 root root 14349 Jul 27 03:01 /usr/include/fastdfs/tracker_types.h</p> <p>-rw-r--r--. 1 root root  6945 Jul 27 03:01 /usr/include/fastdfs/trunk_shared.h</p> <p>[root@bogon ~]#</p> <p><img alt="2" class="img-thumbnail" src="/assist/images/blog/325929d5f44c4e49bc2b4d35495e05cd.png" /></p> <p><span style="font-family:宋体">删除</span>:</p> <p><strong>[root@bogon ~]# rm -rf /usr/include/fastdfs/</strong></p> <p>[root@bogon ~]#</p> <p> </p> <h3 style="margin-left:18.0pt">8) <span style="font-family:宋体">删除</span>/usr/lib64<span style="font-family:宋体">目录下的库文件</span></h3> <p><span style="font-family:宋体">查看</span>:</p> <p>[root@bogon lib64]# ll libfdfsclient*</p> <p>-rwxr-xr-x. 1 root root 255538 Jul 27 03:01 libfdfsclient.so</p> <p><span style="font-family:宋体">删除</span>:</p> <p><strong>[root@bogon lib64]# rm -rf libfdfsclient*</strong></p> <p> </p> <h3 style="margin-left:18.0pt">9) <span style="font-family:宋体">删除</span>/usr/lib/<span style="font-family:宋体">目录下的库</span></h3> <p><span style="font-family:宋体">查看</span>:</p> <p>[root@bogon lib64]# ll libfdfsclient*</p> <p>-rwxr-xr-x. 1 root root 255538 Jul 27 03:01 libfdfsclient.so</p> <p><span style="font-family:宋体">删除</span>:</p> <p><strong>[root@bogon lib64]# rm -rf libfdfsclient*</strong></p> <p> </p> <p> </p> <h3><span style="font-family:宋体">经过以上步骤</span>,FastDFS<span style="font-family:宋体">已经卸载。</span></h3>
  • FastDFS安装配置,fastDFS分布式文件系统(一)

    FastDFS分布式文件系统的下载和安装配置,FastDFS,FastDFS安装配置,分布式文件系统<h2><span style="font-family:宋体">什么是FastDFS?</span></h2>   FastDFS的开发者是这样介绍的:<br />   FastDFS is an open source high performance distributed file system (DFS). It's major functions include: file storing, file syncing and file accessing, and design for high capacity and load balance.<br />   FastDFS是一个开源高性能分布式文件系统(DFS)。它的主要功能包括:文件存储、文件同步和文件访问,以及高容量和负载平衡的设计。 <h2><br /> <span style="font-family:宋体">一、获取需要的安装文件</span></h2> <h3>1.1<span style="font-family:宋体">获取安装</span>FastDFS<span style="font-family:宋体">依赖的公共函数库</span></h3> <p><span style="font-family:宋体">下载地址</span>: <a href="https://github.com/happyfish100/libfastcommon/archive/V1.0.35.tar.gz" rel="external nofollow" target="_blank">https://github.com/happyfish100/libfastcommon/archive/V1.0.35.tar.gz</a></p> <p><span style="font-family:宋体">系统中执行命令</span>:</p> <p><strong>[root@localhost fastdfs-libs]# wget https://github.com/happyfish100/libfastcommon/archive/V1.0.35.tar.gz</strong></p> <p>--2017-07-20 09:03:34--  https://github.com/happyfish100/libfastcommon/archive/V1.0.35.tar.gz</p> <p>Resolving github.com... 192.30.255.113, 192.30.255.112</p> <p>Connecting to github.com|192.30.255.113|:443... connected.</p> <p>HTTP request sent, awaiting response... 302 Found</p> <p>Location: https://codeload.github.com/happyfish100/libfastcommon/tar.gz/V1.0.35 [following]</p> <p>--2017-07-20 09:03:36--  https://codeload.github.com/happyfish100/libfastcommon/tar.gz/V1.0.35</p> <p>Resolving codeload.github.com... 192.30.255.121, 192.30.255.120</p> <p>Connecting to codeload.github.com|192.30.255.121|:443... connected.</p> <p>HTTP request sent, awaiting response... 200 OK</p> <p>Length: 434734 (425K) [application/x-gzip]</p> <p>Saving to: “V1.0.35”</p> <p> </p> <p>100%[====================================================================================================================================================================================================================================>] 434,734     47.0K/s   in 9.7s   </p> <p>2017-07-20 09:03:47 (44.0 KB/s) - “V1.0.35” saved [434734/434734]</p> <p>[root@localhost fastdfs-libs]#</p> <h3>1.2<span style="font-family:宋体">获取</span>FastDFS<span style="font-family:宋体">安装文件</span></h3> <p><span style="font-family:宋体">下载地址</span>: https://github.com/happyfish100/fastdfs/archive/V5.10.tar.gz</p> <p><span style="font-family:宋体">下载命令</span>:</p> <p><strong>[root@localhost fastdfs-libs]# wget https://github.com/happyfish100/fastdfs/archive/V5.10.tar.gz</strong></p> <p>--2017-07-20 09:06:41--  https://github.com/happyfish100/fastdfs/archive/V5.10.tar.gz</p> <p>Resolving github.com... 192.30.255.112, 192.30.255.113</p> <p>Connecting to github.com|192.30.255.112|:443... connected.</p> <p>HTTP request sent, awaiting response... 302 Found</p> <p>Location: https://codeload.github.com/happyfish100/fastdfs/tar.gz/V5.10 [following]</p> <p>--2017-07-20 09:06:43--  https://codeload.github.com/happyfish100/fastdfs/tar.gz/V5.10</p> <p>Resolving codeload.github.com... 192.30.255.120, 192.30.255.121</p> <p>Connecting to codeload.github.com|192.30.255.120|:443... connected.</p> <p>HTTP request sent, awaiting response... 200 OK</p> <p>Length: unspecified [application/x-gzip]</p> <p>Saving to: “V5.10”</p> <p> </p> <p>    [                                        <=>                                                                                                                                                                                          ] 336,589     15.5K/s   in 15s    </p> <p> </p> <p>2017-07-20 09:06:59 (22.5 KB/s) - “V5.10” saved [336589]</p> <p>[root@localhost fastdfs-libs]#</p> <h3>1.3<span style="font-family:宋体">解压安装包</span></h3> <p>1.3.1<span style="font-family:宋体">查看刚才下载的两个文件</span></p> <p>[root@localhost fastdfs-libs]# ll</p> <p>total 760</p> <p>-rw-r--r--. 1 root root 434734 Jul 20 09:03 V1.0.35</p> <p>-rw-r--r--. 1 root root 336589 Jul 20 09:06 V5.10</p> <p>[root@localhost fastdfs-libs]#</p> <p><span style="font-family:宋体">说明</span>:<span style="font-family:宋体">由于</span>wget<span style="font-family:宋体">工具去掉了文件格式</span>,<span style="font-family:宋体">所以文件名就成上面这个样子了。其中</span></p> <p>V1.0.35<span style="font-family:宋体">是</span>libfastcommon<span style="font-family:宋体">公共函数库安装包</span></p> <p>V5.10<span style="font-family:宋体">是</span>FastDFS<span style="font-family:宋体">安装包</span></p> <p><span style="font-family:宋体">解压命令</span>:</p> <p><strong>[root@localhost fastdfs-libs]# tar -xzvf V5.10</strong></p> <p><strong>[root@localhost fastdfs-libs]# tar -xzvf V1.0.35</strong></p> <p><span style="font-family:宋体">解压后目录中的文件</span>:</p> <p>[root@localhost fastdfs-libs]# ll</p> <p>total 768</p> <p><strong>drwxrwxr-x. 10 root root   4096 Apr  5 18:38 fastdfs-5.10</strong></p> <p><strong>drwxrwxr-x.  5 root root   4096 Jul 20 09:23 libfastcommon-1.0.35</strong></p> <p>-rw-r--r--.  1 root root 434734 Jul 20 09:03 V1.0.35</p> <p>-rw-r--r--.  1 root root 336589 Jul 20 09:06 V5.10</p> <p>[root@localhost fastdfs-libs]#</p> <h2><span style="font-family:宋体">二、安装</span>libfastcommon<span style="font-family:宋体">函数库</span></h2> <p><em><strong><span style="font-family:宋体">注意</span>:FastDFS<span style="font-family:宋体">版本</span>5.05<span style="font-family:宋体">以前不需要安装</span>,<span style="font-family:宋体">如果版本低于</span>5.05<span style="font-family:宋体">则忽略该步骤</span></strong></em></p> <p><span style="font-family:宋体">切换至</span>libfastcommon<span style="font-family:宋体">目录内</span></p> <p><span style="font-family:宋体">命令</span>:</p> <p>[root@localhost fastdfs-libs]# ll</p> <p>total 764</p> <p>drwxrwxr-x. 5 root root   4096 Mar  2 18:47 libfastcommon-1.0.35</p> <p>-rw-r--r--. 1 root root 434734 Jul 20 09:03 V1.0.35</p> <p>-rw-r--r--. 1 root root 336589 Jul 20 09:06 V5.10</p> <p><strong>[root@localhost fastdfs-libs]# cd libfastcommon-1.0.35/</strong></p> <p>[root@localhost libfastcommon-1.0.35]#</p> <p><span style="font-family:宋体">编译文件</span></p> <p><span style="font-family:宋体">命令</span></p> <p><strong>[root@localhost libfastcommon-1.0.35]# ./make.sh</strong></p> <p>o fast_task_queue.lo fast_timer.lo process_ctrl.lo fast_mblock.lo connection_pool.lo fast_mpool.lo fast_allocator.lo fast_buffer.lo multi_skiplist.lo flat_skiplist.lo system_info.lo fast_blocked_queue.lo id_generator.lo char_converter.lo char_convert_loader.lo -lm -lpthread</p> <p>ar rcs libfastcommon.a hash.o chain.o shared_func.o ini_file_reader.o logger.o sockopt.o base64.o sched_thread.o http_func.o md5.o pthread_func.o local_ip_func.o avl_tree.o ioevent.o ioevent_loop.o fast_task_queue.o fast_timer.o process_ctrl.o fast_mblock.o connection_pool.o fast_mpool.o fast_allocator.o fast_buffer.o multi_skiplist.o flat_skiplist.o system_info.o fast_blocked_queue.o id_generator.o char_converter.o char_convert_loader.o</p> <p>[root@localhost libfastcommon-1.0.35]#</p> <p><span style="font-family:宋体">注意</span>,<span style="font-family:宋体">这里的并不是通用的系统</span>make<span style="font-family:宋体">命令</span>,<span style="font-family:宋体">而是执行目录里面的</span>make.sh<span style="font-family:宋体">脚本</span></p> <p><span style="font-family:宋体">安装文件</span></p> <p><span style="font-family:宋体">命令</span>:</p> <p><strong>[root@localhost libfastcommon-1.0.35]# ./make.sh install</strong></p> <p>mkdir -p /usr/lib64</p> <p>mkdir -p /usr/lib</p> <p>install -m 755 libfastcommon.so /usr/lib64</p> <p>install -m 755 libfastcommon.so /usr/lib</p> <p>mkdir -p /usr/include/fastcommon</p> <p>install -m 644 common_define.h hash.h chain.h logger.h base64.h shared_func.h pthread_func.h ini_file_reader.h _os_define.h sockopt.h sched_thread.h http_func.h md5.h local_ip_func.h avl_tree.h ioevent.h ioevent_loop.h fast_task_queue.h fast_timer.h process_ctrl.h fast_mblock.h connection_pool.h fast_mpool.h fast_allocator.h fast_buffer.h skiplist.h multi_skiplist.h flat_skiplist.h skiplist_common.h system_info.h fast_blocked_queue.h php7_ext_wrapper.h id_generator.h char_converter.h char_convert_loader.h /usr/include/fastcommon</p> <p>[root@localhost libfastcommon-1.0.35]#</p> <p><span style="font-family:宋体">如果安装提示缺少</span>gcc<span style="font-family:宋体">编译器,使用</span>yum<span style="font-family:宋体">安装</span>,</p> <p><span style="font-family:宋体">命令</span>:</p> <p><strong><span style="font-family:"Courier New""><span style="color:#333333">yum -y install gcc-c</span></span></strong><strong><span style="font-family:"Courier New""><span style="color:black">++</span></span></strong></p> <h2><span style="font-family:宋体">三、安装</span>FastDFS</h2> <p><span style="font-family:宋体">切换至</span>FastDFS<span style="font-family:宋体">安装文件目录</span></p> <p><span style="font-family:宋体">命令</span>:</p> <p><strong>[root@localhost fastdfs-libs]# cd fastdfs-5.10/</strong></p> <p><strong>[root@localhost fastdfs-5.10]# </strong></p> <h3>3.1<span style="font-family:宋体">编译</span>FastDFS</h3> <p><span style="font-family:宋体">命令</span>:</p> <p><strong>[root@localhost fastdfs-5.10]# ./make.sh</strong></p> <h3>3.2<span style="font-family:宋体">安装</span>FastDFS</h3> <p><span style="font-family:宋体">命令</span>:</p> <p><strong>[root@localhost fastdfs-5.10]# ./make.sh install</strong></p> <p>mkdir -p /usr/bin</p> <p>mkdir -p /etc/fdfs</p> <p>cp -f fdfs_trackerd /usr/bin</p> <p>if [ ! -f /etc/fdfs/tracker.conf.sample ]; then cp -f ../conf/tracker.conf /etc/fdfs/tracker.conf.sample; fi</p> <p>if [ ! -f /etc/fdfs/storage_ids.conf.sample ]; then cp -f ../conf/storage_ids.conf /etc/fdfs/storage_ids.conf.sample; fi</p> <p>mkdir -p /usr/bin</p> <p>mkdir -p /etc/fdfs</p> <p>cp -f fdfs_storaged  /usr/bin</p> <p>if [ ! -f /etc/fdfs/storage.conf.sample ]; then cp -f ../conf/storage.conf /etc/fdfs/storage.conf.sample; fi</p> <p>mkdir -p /usr/bin</p> <p>mkdir -p /etc/fdfs</p> <p>mkdir -p /usr/lib64</p> <p>mkdir -p /usr/lib</p> <p>cp -f fdfs_monitor fdfs_test fdfs_test1 fdfs_crc32 fdfs_upload_file fdfs_download_file fdfs_delete_file fdfs_file_info fdfs_appender_test fdfs_appender_test1 fdfs_append_file fdfs_upload_appender /usr/bin</p> <p>if [ 0 -eq 1 ]; then cp -f libfdfsclient.a /usr/lib64; cp -f libfdfsclient.a /usr/lib/;fi</p> <p>if [ 1 -eq 1 ]; then cp -f libfdfsclient.so /usr/lib64; cp -f libfdfsclient.so /usr/lib/;fi</p> <p>mkdir -p /usr/include/fastdfs</p> <p>cp -f ../common/fdfs_define.h ../common/fdfs_global.h ../common/mime_file_parser.h ../common/fdfs_http_shared.h ../tracker/tracker_types.h ../tracker/tracker_proto.h ../tracker/fdfs_shared_func.h ../storage/trunk_mgr/trunk_shared.h tracker_client.h storage_client.h storage_client1.h client_func.h client_global.h fdfs_client.h /usr/include/fastdfs</p> <p>if [ ! -f /etc/fdfs/client.conf.sample ]; then cp -f ../conf/client.conf /etc/fdfs/client.conf.sample; fi</p> <p><img alt="1" class="img-thumbnail" src="/assist/images/blog/073c74afb6a846de851922001fd0ce8f.png" /></p> <p><span style="font-family:宋体">上方没有报错则安装成功。</span></p> <p> </p> <h3>3.3sample</h3> <p><span style="font-family:宋体">切换至目录</span>/etc/fast/<span style="font-family:宋体">查看</span></p> <p><span style="font-family:宋体">命令</span>:</p> <p>[root@localhost fastdfs-5.10]# cd /etc/fdfs</p> <p>[root@localhost fdfs]# ll</p> <p>total 24</p> <p>-rw-r--r--. 1 root root 1461 Jul 20 09:29 client.conf.sample</p> <p>-rw-r--r--. 1 root root 7927 Jul 20 09:29 storage.conf.sample</p> <p>-rw-r--r--. 1 root root  105 Jul 20 09:29 storage_ids.conf.sample</p> <p>-rw-r--r--. 1 root root 7389 Jul 20 09:29 tracker.conf.sample</p> <p>[root@localhost fdfs]#</p> <p> </p> <p><span style="background-color:white"><span style="font-family:宋体"><span style="color:#555555">如上,安装成功后就会生成如上的</span></span></span><span style="background-color:white"><span style="font-family:"微软雅黑",sans-serif"><span style="color:#555555">4</span></span></span><span style="background-color:white"><span style="font-family:宋体"><span style="color:#555555">个</span></span></span><span style="background-color:white"><span style="font-family:"微软雅黑",sans-serif"><span style="color:#555555">.sample</span></span></span><span style="background-color:white"><span style="font-family:宋体"><span style="color:#555555">文件(示例配置文件),我们再分别拷贝出</span></span></span><span style="background-color:white"><span style="font-family:"微软雅黑",sans-serif"><span style="color:#555555">4</span></span></span><span style="background-color:white"><span style="font-family:宋体"><span style="color:#555555">个后面用的正式的配置文件:</span></span></span></p> <p>[root@localhost fdfs]# cp client.conf.sample client.conf</p> <p>[root@localhost fdfs]# cp storage.conf.sample storage.conf</p> <p>[root@localhost fdfs]# cp tracker.conf.sample tracker.conf</p> <p>[root@localhost fdfs]# ll</p> <p>total 44</p> <p>-rw-r--r--. 1 root root 1461 Jul 20 09:37 client.conf</p> <p>-rw-r--r--. 1 root root 1461 Jul 20 09:29 client.conf.sample</p> <p>-rw-r--r--. 1 root root 7927 Jul 20 09:37 storage.conf</p> <p>-rw-r--r--. 1 root root 7927 Jul 20 09:29 storage.conf.sample</p> <p>-rw-r--r--. 1 root root  105 Jul 20 09:29 storage_ids.conf.sample</p> <p>-rw-r--r--. 1 root root 7389 Jul 20 09:37 tracker.conf</p> <p>-rw-r--r--. 1 root root 7389 Jul 20 09:29 tracker.conf.sample</p> <p>[root@localhost fdfs]#</p> <p> </p> <p><span style="font-family:宋体">至此</span>FastDFS<span style="font-family:宋体">已经安装完毕</span>,<span style="font-family:宋体">接下来就是相关配置</span></p> <p> </p> <h2><span style="font-family:宋体">四、</span>FastDFS<span style="font-family:宋体">配置</span></h2> <h3>4.1<span style="font-family:宋体">配置</span>Tracker</h3> <p><span style="font-family:宋体">在配置</span>Tracker<span style="font-family:宋体">之前,首先需要创建</span>Tracker<span style="font-family:宋体">服务器的文件路径,即用于存储</span>Tracker<span style="font-family:宋体">的数据文件和日志文件等,我这里选择在</span>/opt<span style="font-family:宋体">目录下创建一个</span>fastdfs_tracker<span style="font-family:宋体">目录用于存放</span>Tracker<span style="font-family:宋体">服务器的相关文件:</span></p> <p><span style="font-family:宋体">命令</span>:</p> <p><strong>[root@localhost opt]# mkdir -p  /opt/fastdfs_tracker</strong></p> <p><span style="font-family:宋体">接下来就要重新编辑上一步准备好的</span>/etc/fdfs<span style="font-family:宋体">目录下的</span>tracker.conf<span style="font-family:宋体">配置文件,打开文件后依次做以下修改:</span></p> <ol> <li style="text-align:left"><span style="background-color:white"><span style="color:#555555"><span style="font-family:"微软雅黑",sans-serif">disabled=false #</span><span style="font-family:宋体">启用配置文件(默认启用)</span></span></span></li> <li style="text-align:left"><span style="background-color:white"><span style="color:#555555"><span style="font-family:"微软雅黑",sans-serif">port=22122 #</span><span style="font-family:宋体">设置</span><span style="font-family:"微软雅黑",sans-serif">tracker</span><span style="font-family:宋体">的端口号,通常采用</span><span style="font-family:"微软雅黑",sans-serif">22122</span><span style="font-family:宋体">这个默认端口</span></span></span></li> <li style="text-align:left"><span style="background-color:white"><span style="color:red"><span style="font-family:"微软雅黑",sans-serif">base_path=/opt/fastdfs_tracker #</span><span style="font-family:宋体">设置</span><span style="font-family:"微软雅黑",sans-serif">tracker</span><span style="font-family:宋体">的数据文件和日志目录</span></span></span></li> <li style="text-align:left"><span style="background-color:white"><span style="color:red"><span style="font-family:"微软雅黑",sans-serif">http.server_port=8800 #</span><span style="font-family:宋体">设置</span><span style="font-family:"微软雅黑",sans-serif">http</span><span style="font-family:宋体">端口号,默认为</span><span style="font-family:"微软雅黑",sans-serif">8080</span></span></span></li> </ol> <p><img alt="2" class="img-thumbnail" src="/assist/images/blog/63d30e78854041649c34056f79717844.png" /></p> <p><span style="font-family:宋体">配置完成后就可以启动</span>Tracker<span style="font-family:宋体">服务器了,但首先依然要为启动脚本创建软引用,因为</span>fdfs_trackerd<span style="font-family:宋体">等命令在</span>/usr/local/bin<span style="font-family:宋体">中并没有,而是在</span>/usr/bin<span style="font-family:宋体">路径下:</span></p> <p>[root@localhost fdfs]# ln -s /usr/bin/fdfs_trackerd /usr/local/bin</p> <p>[root@localhost fdfs]# ln -s /usr/bin/stop.sh /usr/local/bin</p> <p>[root@localhost fdfs]# ln -s /usr/bin/restart.sh /usr/local/bin</p> <p>[root@localhost fdfs]#</p> <p><img alt="3" class="img-thumbnail" src="/assist/images/blog/eb79dbf97c5f4f20b976391e6d56277e.png" /></p> <p><span style="font-family:宋体">最后通过命令启动</span>Tracker<span style="font-family:宋体">服务器:</span></p> <p><strong>[root@localhost fdfs]# service fdfs_trackerd start</strong></p> <p>Starting FastDFS tracker server:</p> <p>[root@localhost fdfs]# ps -ef|grep tracker</p> <p>root       8649      1  0 09:44 ?        00:00:00 /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf</p> <p>root       8657   2652  0 09:44 pts/0    00:00:00 grep tracker</p> <p>[root@localhost fdfs]#</p> <p><span style="font-family:宋体">如果启动命令执行成功,那么同时在刚才创建的</span>tracker<span style="font-family:宋体">文件目录</span>/opt/fastdfs_tracker<span style="font-family:宋体">中就可以看到启动后新生成的</span>data<span style="font-family:宋体">和</span>logs<span style="font-family:宋体">目录,</span>tracker<span style="font-family:宋体">服务的端口也应当被正常监听,最后再通过</span>netstat<span style="font-family:宋体">命令查看一下端口监听情况:</span></p> <p><img alt="4" class="img-thumbnail" src="/assist/images/blog/938bbff4b35649f582476f2705a86c1a.png" /></p> <p>[root@localhost fdfs]# netstat -unltp|grep fdfs</p> <p>tcp        0      0 0.0.0.0:22122               0.0.0.0:*                   LISTEN      8649/fdfs_trackerd </p> <p>[root@localhost fdfs]#</p> <p><span style="font-family:宋体">可以看到</span>tracker<span style="font-family:宋体">服务运行的</span>22122<span style="font-family:宋体">端口正常被监听</span></p> <p><span style="font-family:宋体">确认</span>tracker<span style="font-family:宋体">正常启动后可以将</span>tracker<span style="font-family:宋体">设置为开机启动,打开</span>/etc/rc.d/rc.local<span style="font-family:宋体">并在其中加入以下配置</span></p> <p>service fdfs_trackerd start</p> <p><span style="font-family:宋体">如果重启后发现未能自动启动则通过命令</span>ll /etc/rc.d/rc.local<span style="font-family:宋体">检查一下</span>rc.local<span style="font-family:宋体">是否具备可执行权限,若是无可执行权限则通过</span>chmod +x /etc/rc.d/rc.local<span style="font-family:宋体">进行授权</span></p> <p><span style="background-color:white"><span style="font-family:"微软雅黑",sans-serif"><span style="color:#555555">Tracker</span></span></span><span style="background-color:white"><span style="font-family:宋体"><span style="color:#555555">至此就配置好了</span></span></span></p> <h3>4.2<span style="font-family:宋体">配置</span>Storage</h3> <p><span style="font-family:宋体">同理,步骤基本与配置</span>Tracker<span style="font-family:宋体">一致,首先是创建</span>Storage<span style="font-family:宋体">服务器的文件目录,需要注意的是同</span>Tracker<span style="font-family:宋体">相比我多建了一个目录,因为</span>Storage<span style="font-family:宋体">还需要一个文件存储路径,用于存放接收的文件:</span></p> <p><span style="font-family:宋体">创建目录命令</span>:</p> <p>[root@localhost fdfs]# mkdir /opt/fastdfs_storage</p> <p>[root@localhost fdfs]# mkdir /opt/fastdfs_storage_data</p> <p><span style="font-family:宋体">接下来修改</span>/etc/fdfs<span style="font-family:宋体">目录下的</span>storage.conf<span style="font-family:宋体">配置文件,打开文件后依次做以下修改:</span></p> <ol> <li style="text-align:left"><span style="background-color:white"><span style="color:#555555"><span style="font-family:"微软雅黑",sans-serif">disabled=false #</span><span style="font-family:宋体">启用配置文件(默认启用)</span></span></span></li> <li style="text-align:left"><span style="background-color:white"><span style="color:#555555"><span style="font-family:"微软雅黑",sans-serif">group_name=group1 #</span><span style="font-family:宋体">组名,根据实际情况修改</span></span></span></li> <li style="text-align:left"><span style="background-color:white"><span style="color:#555555"><span style="font-family:"微软雅黑",sans-serif">port=23000 #</span><span style="font-family:宋体">设置</span><span style="font-family:"微软雅黑",sans-serif">storage</span><span style="font-family:宋体">的端口号,默认是</span><span style="font-family:"微软雅黑",sans-serif">23000</span><span style="font-family:宋体">,同一个组的</span><span style="font-family:"微软雅黑",sans-serif">storage</span><span style="font-family:宋体">端口号必须一致</span></span></span></li> <li style="text-align:left"><span style="background-color:white"><span style="color:#555555"><span style="font-family:"微软雅黑",sans-serif"><span style="color:red">base_path=/opt/fastdfs_storage #</span></span><span style="font-family:宋体"><span style="color:red">设置</span></span><span style="font-family:"微软雅黑",sans-serif"><span style="color:red">storage</span></span><span style="font-family:宋体"><span style="color:red">数据文件和日志目录</span></span></span></span></li> <li style="text-align:left"><span style="background-color:white"><span style="color:#555555"><span style="font-family:"微软雅黑",sans-serif">store_path_count=1 #</span><span style="font-family:宋体">存储路径个数,需要和</span><span style="font-family:"微软雅黑",sans-serif">store_path</span><span style="font-family:宋体">个数匹配</span></span></span></li> <li style="text-align:left"><span style="background-color:white"><span style="color:#555555"><span style="font-family:"微软雅黑",sans-serif"><span style="color:red">store_path0=/opt/fastdfs_storage_data #</span></span><span style="font-family:宋体"><span style="color:red">实际文件存储路径</span></span></span></span></li> <li style="text-align:left"><span style="background-color:white"><span style="color:red"><span style="font-family:"微软雅黑",sans-serif">tracker_server=</span> <span style="font-family:"微软雅黑",sans-serif">192.168.8.202:22122 #tracker </span><span style="font-family:宋体">服务器的</span><span style="font-family:"微软雅黑",sans-serif"> IP</span><span style="font-family:宋体">地址和端口号,如果是单机搭建,</span><span style="font-family:"微软雅黑",sans-serif">IP</span><span style="font-family:宋体">不要写</span><span style="font-family:"微软雅黑",sans-serif">127.0.0.1</span><span style="font-family:宋体">,否则启动不成功(此处的</span><span style="font-family:"微软雅黑",sans-serif">ip</span><span style="font-family:宋体">是我的</span><span style="font-family:"微软雅黑",sans-serif">CentOS</span><span style="font-family:宋体">虚拟机</span><span style="font-family:"微软雅黑",sans-serif">ip</span><span style="font-family:宋体">)</span></span></span></li> <li style="text-align:left"><span style="background-color:white"><span style="color:#555555"><span style="font-family:"微软雅黑",sans-serif">http.server_port=8888 #</span><span style="font-family:宋体">设置</span><span style="font-family:"微软雅黑",sans-serif"> http </span><span style="font-family:宋体">端口号</span></span></span></li> </ol> <p><span style="font-family:宋体">上述红色代表修改部分</span></p> <p><span style="font-family:宋体">配置完成后同样要为</span>Storage<span style="font-family:宋体">服务器的启动脚本设置软引用:</span></p> <p><strong>[root@localhost fdfs]# ln -s /usr/bin/fdfs_storaged /usr/local/bin</strong></p> <p>[root@localhost fdfs]#</p> <p><span style="font-family:宋体">接下来就可以启动</span>Storage<span style="font-family:宋体">服务了:</span></p> <p><strong>[root@localhost fdfs]# service fdfs_storaged start</strong></p> <p>Starting FastDFS storage server:</p> <p>[root@localhost fdfs]# ps -ef |grep storage</p> <p>root       8677      1 26 09:58 ?        00:00:03 /usr/bin/fdfs_storaged /etc/fdfs/storage.conf</p> <p>root       8687   2652  0 09:58 pts/0    00:00:00 grep storage</p> <p>[root@localhost fdfs]#</p> <p><span style="font-family:宋体">同理,如果启动成功,</span>/opt/fastdfs_storage<span style="font-family:宋体">中就可以看到启动后新生成的</span>data<span style="font-family:宋体">和</span>logs<span style="font-family:宋体">目录,端口</span>23000<span style="font-family:宋体">也应被正常监听,还有一点就是文件存储路径下会生成多级存储目录,那么接下来看看是否启动成功了:</span></p> <p><img alt="5" class="img-thumbnail" src="/assist/images/blog/3e9f629acff74f97967e2936ca4758f4.png" /></p> <p><strong><span style="font-family:宋体">端口监听情况</span>:</strong></p> <p><strong>[root@localhost data]# netstat -unltp|grep fdfs</strong></p> <p>tcp        0      0 0.0.0.0:23000               0.0.0.0:*                   LISTEN      8677/fdfs_storaged </p> <p>tcp        0      0 0.0.0.0:22122               0.0.0.0:*                   LISTEN      8649/fdfs_trackerd </p> <p>[root@localhost data]#</p> <p><img alt="6" class="img-thumbnail" src="/assist/images/blog/7ad6a2679bbc4accacf7f3706abc96cc.png" /></p> <p><span style="font-family:宋体">如上图,可以看到此时已经正常监听</span>tracker<span style="font-family:宋体">的</span>22122<span style="font-family:宋体">端口和</span>storage<span style="font-family:宋体">的</span>23000<span style="font-family:宋体">端口,至此</span>storage<span style="font-family:宋体">服务器就已经配置完成,确定了</span>storage<span style="font-family:宋体">服务器启动成功后,还有一项工作就是看看</span>storage<span style="font-family:宋体">服务器是否已经登记到</span> tracker<span style="font-family:宋体">服务器(也可以理解为</span>tracker<span style="font-family:宋体">与</span>storage<span style="font-family:宋体">是否整合成功),运行以下命令:</span></p> <p>[root@localhost data]# /usr/bin/fdfs_monitor /etc/fdfs/storage.conf</p> <p>[2017-07-20 10:03:17] DEBUG - base_path=/opt/fastdfs_storage, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0</p> <p> </p> <p>server_count=1, server_index=0</p> <p> </p> <p>tracker server is 192.168.8.202:22122</p> <p> </p> <p>group count: 1</p> <p> </p> <p>Group 1:</p> <p>group name = group1</p> <p>disk total space = 26917 MB</p> <p>disk free space = 21646 MB</p> <p>trunk free space = 0 MB</p> <p>storage server count = 1</p> <p>active server count = 1</p> <p>storage server port = 23000</p> <p>storage HTTP port = 8888</p> <p>store path count = 1</p> <p>subdir count per path = 256</p> <p>current write server index = 0</p> <p>current trunk file id = 0</p> <p> </p> <p>         Storage 1:</p> <p>                   id = 192.168.8.202</p> <p>                   ip_addr = 192.168.8.202  ACTIVE</p> <p>                   http domain =</p> <p>                   version = 5.10</p> <p>                   join time = 2017-07-20 09:58:37</p> <p>                   up time = 2017-07-20 09:58:37</p> <p>                   total storage = 26917 MB</p> <p>                   free storage = 21646 MB</p> <p>                   upload priority = 10</p> <p>                   store_path_count = 1</p> <p>                   subdir_count_per_path = 256</p> <p>                   storage_port = 23000</p> <p>                   storage_http_port = 8888</p> <p>                   current_write_path = 0</p> <p>                   source storage id =</p> <p>                   if_trunk_server = 0</p> <p>                   connection.alloc_count = 256</p> <p>                   connection.current_count = 0</p> <p>                   connection.max_count = 0</p> <p>                   total_upload_count = 0</p> <p>                   success_upload_count = 0</p> <p>                   total_append_count = 0</p> <p>                   success_append_count = 0</p> <p>                   total_modify_count = 0</p> <p>                   success_modify_count = 0</p> <p>                   total_truncate_count = 0</p> <p>                   success_truncate_count = 0</p> <p>                   total_set_meta_count = 0</p> <p>                   success_set_meta_count = 0</p> <p>                   total_delete_count = 0</p> <p>                   success_delete_count = 0</p> <p>                   total_download_count = 0</p> <p>                   success_download_count = 0</p> <p>                   total_get_meta_count = 0</p> <p>                   success_get_meta_count = 0</p> <p>                   total_create_link_count = 0</p> <p>                   success_create_link_count = 0</p> <p>                   total_delete_link_count = 0</p> <p>                   success_delete_link_count = 0</p> <p>                   total_upload_bytes = 0</p> <p>                   success_upload_bytes = 0</p> <p>                   total_append_bytes = 0</p> <p>                  success_append_bytes = 0</p> <p>                   total_modify_bytes = 0</p> <p>                   success_modify_bytes = 0</p> <p>                   stotal_download_bytes = 0</p> <p>                   success_download_bytes = 0</p> <p>                   total_sync_in_bytes = 0</p> <p>                   success_sync_in_bytes = 0</p> <p>                   total_sync_out_bytes = 0</p> <p>                   success_sync_out_bytes = 0</p> <p>                   total_file_open_count = 0</p> <p>                   success_file_open_count = 0</p> <p>                   total_file_read_count = 0</p> <p>                   success_file_read_count = 0</p> <p>                   total_file_write_count = 0</p> <p>                   success_file_write_count = 0</p> <p>                   last_heart_beat_time = 2017-07-20 10:03:15</p> <p>                   last_source_update = 1969-12-31 16:00:00</p> <p>                   last_sync_update = 1969-12-31 16:00:00</p> <p>                   last_synced_timestamp = 1969-12-31 16:00:00</p> <p>[root@localhost data]#</p> <p><img alt="7" class="img-thumbnail" src="/assist/images/blog/4281900037f449cdb9470fa1b401c62c.png" /></p> <p> </p> <p><span style="font-family:宋体">如上所示,看到</span>192.168.8.202 ACTIVE <span style="font-family:宋体">字样即可说明</span>storage<span style="font-family:宋体">服务器已经成功登记到了</span>tracker<span style="font-family:宋体">服务器,同理别忘了添加开机启动,打开</span>/etc/rc.d/rc.local<span style="font-family:宋体">并将如下配置追加到文件中:</span></p> <p>service fdfs_storaged start</p> <p><span style="font-family:宋体">至此我们就已经完成了</span>fastdfs<span style="font-family:宋体">的全部配置,此时也就可以用客户端工具进行文件上传下载的测试了。</span></p> <h2><span style="font-family:宋体">五、测试</span>FastDFS</h2> <h3>5.1<span style="font-family:宋体">配置</span> FastDFSLinux<span style="font-family:宋体">上的客户端</span></h3> <p><span style="font-family:宋体">编辑配置文件</span>/etc/fdfs/client.conf</p> <p><span style="font-family:宋体">命令</span>:</p> <p><strong>[root@localhost fdfs]# vi /etc/fdfs/client.conf</strong></p> <p><span style="font-family:宋体">修改内容</span>:</p> <ol> <li><span style="color:red">base_path=/opt/fastdfs_tracker #tracker</span><span style="font-family:宋体"><span style="color:red">服务器文件路径</span></span></li> <li><span style="color:red">tracker_server=192.168.8.202:22122 #tracker</span><span style="font-family:宋体"><span style="color:red">服务器</span></span><span style="color:red">IP</span><span style="font-family:宋体"><span style="color:red">地址和端口号</span></span></li> <li><span style="color:red">http.tracker_server_port=8800 # tracker </span><span style="font-family:宋体"><span style="color:red">服务器的</span></span><span style="color:red"> http </span><span style="font-family:宋体"><span style="color:red">端口号,必须和</span></span><span style="color:red">tracker</span><span style="font-family:宋体"><span style="color:red">的设置对应起来</span></span></li> </ol> <p><img alt="8" class="img-thumbnail" src="/assist/images/blog/48d6df422eb1411986ae7a21d46b9564.png" /></p> <p><img alt="9" class="img-thumbnail" src="/assist/images/blog/9384fd77734a49af8067b868cdee6f95.png" /></p> <p><img alt="10" class="img-thumbnail" src="/assist/images/blog/cf3b4f6c3ebe46968724be99a03df04a.png" /></p> <p> </p> <h3>5.2<span style="font-family:宋体">测试</span></h3> <p><span style="font-family:宋体">配置完成后就可以模拟文件上传了,先给</span>/opt<span style="font-family:宋体">目录下放一张图片(使用</span>ftp<span style="font-family:宋体">类似工具上传到服务器)</span></p> <p><img alt="11" class="img-thumbnail" src="/assist/images/blog/6f6aa6411d5c4a4fa9ea3c8974be950b.png" /></p> <p>[root@localhost fdfs]# ll /opt/</p> <p>total 24</p> <p>drwxr-xr-x. 4 root root 4096 Jul 20 09:58 fastdfs_storage</p> <p>drwxr-xr-x. 3 root root 4096 Jul 20 09:58 fastdfs_storage_data</p> <p>drwxr-xr-x. 4 root root 4096 Jul 20 09:44 fastdfs_tracker</p> <p>drwxr-xr-x. 2 root root 4096 Nov 22  2013 rh</p> <p>-rw-r--r--. 1 root root 7014 Jul 21 02:20 tx.jpg</p> <p>[root@localhost fdfs]#</p> <p> </p> <p><span style="font-family:宋体">通过执行客户端上传命令尝试上传:</span></p> <p><strong>[root@localhost fdfs]# /usr/bin/fdfs_upload_file  /etc/fdfs/client.conf /opt/tx.jpg </strong></p> <p>group1/M00/00/00/wKgIyllxx82AeS-3AAAbZoAXENE710.jpg</p> <p>[root@localhost fdfs]#</p> <p><img alt="12" class="img-thumbnail" src="/assist/images/blog/184ba258f47648b8831a28f6146f3bdd.png" /></p> <p><span style="font-family:宋体">返回信息解释说明:</span></p> <p><strong>group1                                                                    : </strong><strong><span style="font-family:宋体">组名</span></strong></p> <p><strong>MOO                                                                         : </strong><strong><span style="font-family:宋体">磁盘</span></strong></p> <p><strong>00/00                                                                        : </strong><strong><span style="font-family:宋体">目录(相对于</span>storage</strong><strong><span style="font-family:宋体">的</span>fastdfs_storage_data</strong><strong><span style="font-family:宋体">目录下)</span></strong></p> <p><strong>wKgIyllxx82AeS-3AAAbZoAXENE710.jpg     :</strong><strong><span style="font-family:宋体">文件名</span></strong></p> <p> </p> <p><span style="font-family:宋体">可以切换到</span>storeage<span style="font-family:宋体">的</span>data<span style="font-family:宋体">目录下查看</span></p> <p><span style="font-family:宋体">命令:</span></p> <p><strong>[root@localhost data]# cd /opt/fastdfs_storage_data/data/</strong></p> <p>[root@localhost data]# ls</p> <p>00  04  08  0C  10  14  18  1C  20  24  28  2C  30  34  38  3C  40  44  48  4C  50  54  58  5C  60  64  68  6C  70  74  78  7C  80  84  88  8C  90  94  98  9C  A0  A4  A8  AC  B0  B4  B8  BC  C0  C4  C8  CC  D0  D4  D8  DC  E0  E4  E8  EC  F0  F4  F8  FC</p> <p>01  05  09  0D  11  15  19  1D  21  25  29  2D  31  35  39  3D  41  45  49  4D  51  55  59  5D  61  65  69  6D  71  75  79  7D  81  85  89  8D  91  95  99  9D  A1  A5  A9  AD  B1  B5  B9  BD  C1  C5  C9  CD  D1  D5  D9  DD  E1  E5  E9  ED  F1  F5  F9  FD</p> <p>02  06  0A  0E  12  16  1A  1E  22  26  2A  2E  32  36  3A  3E  42  46  4A  4E  52  56  5A  5E  62  66  6A  6E  72  76  7A  7E  82  86  8A  8E  92  96  9A  9E  A2  A6  AA  AE  B2  B6  BA  BE  C2  C6  CA  CE  D2  D6  DA  DE  E2  E6  EA  EE  F2  F6  FA  FE</p> <p>03  07  0B  0F  13  17  1B  1F  23  27  2B  2F  33  37  3B  3F  43  47  4B  4F  53  57  5B  5F  63  67  6B  6F  73  77  7B  7F  83  87  8B  8F  93  97  9B  9F  A3  A7  AB  AF  B3  B7  BB  BF  C3  C7  CB  CF  D3  D7  DB  DF  E3  E7  EB  EF  F3  F7  FB  FF</p> <p><strong>[root@localhost data]# cd 00/00/</strong></p> <p>[root@localhost 00]# ls</p> <p><strong>wKgIyllxx82AeS-3AAAbZoAXENE710.jpg</strong></p> <p>[root@localhost 00]#</p> <p><img alt="13" class="img-thumbnail" src="/assist/images/blog/f5ef521b94ed46ae926170c8d4b8d118.png" /></p> <p><span style="font-family:宋体">测试完成。</span></p> <p>相关推荐:<br /> <a rel="external nofollow" href="http://www.leftso.com/blog/244.html" target="_blank">FastDFS卸载(二)</a><br /> <a rel="external nofollow" href="http://www.leftso.com/blog/245.html" target="_blank">FastDFS配置集群(三)</a></p>