nginx 安装详解(better version)


编译自:
installing-nginx-open-source

目录

  • 选择 Stable 还是 Mainline?
  • 选择预编译的 pacakge 还是从源码编译?
  • 从源码编译 nginx
    • 安装 nginx 的依赖库
    • 下载源码 tarball
    • 配置编译选项
      • 配置 nginx 文件安装路径
      • 配置 nginx gcc 选项
      • 指定 nginx 并发模型
      • nginx 的模块
      • 默认编译的模块
      • 默认不编译的模块
      • 第三方模块
      • 静态链接模块和动态链接模块
    • 完成安装
  • 安装预编译的 package
    • 预编译的 package 所包含的模块
    • 安装 Red Hat/CentOS packages

选择 Stable 还是 Mainline?


nginx 提供两种版本的源码包:

  • mainline 版。该版本包含最新的特性和bug修改,并且总是保持更新。该版本是可靠的,但它可能会包含实验性的模块,以及一定数量的新 bug。

  • stable 版。该版本不包含新特性,但包含关键 bug 修复。推荐使用该版用于生产环境。

选择预编译的 pacakge 还是从源码编译?


mainline 版和 stable 版都提供两种安装方式:

  • 从预编译的 package 进行安装。这是快速和容易的安装方式。预编译的 package 包含几乎所有的 nginx 官方模块,且适用于大多数流行的操作系统。

  • 从源码编译安装。这种方式更为灵活:你可以添加特定的模块,包含添加第三方的模块,或者应用最新的安全补丁。

从源码编译 nginx


从源码编译安装的方式更为灵活:你可以添加特定的模块,包含添加第三方的模块,或者应用最新的安全补丁。

安装 nginx 的依赖库

在编译安装 nginx 之前,需要首先安装 nginx 的依赖:

  • PCRE 库 - nginx 的 corerewrite 模块依赖 PCRE 库。它提供对于正则表达式的支持:
$ wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz
$ tar -zxf pcre-8.38.tar.gz
$ cd pcre-8.38
$ ./configure
$ make
$ sudo make install

译注:也可用 yum install pcre-devel 替代

  • zlib 库 - nginx 的 gzip 模块依赖 zlib 库。用于对 HTTP headers 进行压缩:
$ wget http://zlib.net/zlib-1.2.8.tar.gz
$ tar -zxf zlib-1.2.8.tar.gz
$ cd zlib-1.2.8
$ ./configure
$ make
$ sudo make install

译注:也可用 yum install zlib-devel 替代

  • OpenSSL 库 - nginx 的 SSL 模块依赖该库,用于支持 HTTPS 协议:
$ wget http://www.openssl.org/source/openssl-1.0.2f.tar.gz
$ tar -zxf openssl-1.0.2f.tar.gz
$ cd openssl-1.0.2f
$ ./configure darwin64-x86_64-cc --prefix=/usr
$ make
$ sudo make install

译注:也可用 yum install openssl-devel 替代

下载源码 tarball

源码 tarball 下载地址是:http://nginx.org/en/download.html

mainline 版:

$ wget http://nginx.org/download/nginx-1.11.1.tar.gz
$ tar zxf nginx-1.11.1.tar.gz
$ cd nginx-1.11.1

stable 版:

$ wget http://nginx.org/download/nginx-1.10.1.tar.gz
$ tar zxf nginx-1.10.1.tar.gz
$ cd nginx-1.10.1

配置编译选项

源码包中提供 configure 脚本用于在编译前定义 nginx 各方面的配置。
执行 configure 脚本最后生成 Makefile,make 命令根据 Makefile 进行编译安装。

子目录:

  • 配置 nginx 文件安装路径
  • 配置 nginx gcc 选项
  • 指定 nginx 并发模型
  • nginx 的模块
  • 默认编译的模块
  • 默认不编译的模块
  • 第三方模块
  • 静态链接模块和动态链接模块

配置示例:

$ ./configure \
--sbin-path=/usr/local/nginx/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--pid-path=/usr/local/nginx/nginx.pid \
--with-pcre=../pcre-8.38 \
--with-zlib=../zlib-1.2.8 \
--with-http_ssl_module \
--with-stream \
--with-mail=dynamic \
--add-module=/usr/build/nginx-rtmp-module \
--add-dynamic-module=/usr/build/3party_module

配置 nginx 文件安装路径

使用 configure 脚本可设置 nginx 的文件安装路径,包括 nginx 二进制文件和配置文件,以及设置依赖库如 PCRE 和 SSL 的源码所在路径(用于对其进行静态编译)。

--prefix=path

定义 nginx 文件的安装路径。configure 的其他选项如果使用相对路径,那么以此路径为基础路径。(except for paths to libraries sources)。nginx.conf 文件中的相对路径也以此为基础路径。默认 --prefix=/usr/local/nginx

--sbin-path=path

设置 nginx 二进制程序的路径名,这个名字只在安装期间使用。默认 --sbin-path=prefix/sbin/nginx

--conf-path=path

设置 nginx.conf 的路径。nginx 可在启动时手动以 -c file 参数指定其他配置文件。默认 --conf-path=prefix/conf/nginx.conf

--pid-path=path

设置 nginx.pid 文件的路径。安装nginx之后,可在 nginx.conf 文件中使用 pid 指令修改该路径。默认 --pid-path=prefix/logs/nginx.pid

--error-log-path=path

设置 nginx 错误日志的路径。安装nginx之后,可在 nginx.conf 文件中使用 error_log 指令修改该路径。默认 --error-log-path=prefix/logs/error.log

--http-log-path=path

设置 nginx 访问日志的路径。安装nginx之后,可在 nginx.conf 文件中使用 access_log 指令修改该路径。默认 --http-log-path=prefix/logs/access.log

--user=name

设置启动 worker 进程时所使用的非特权用户名。安装nginx之后,可在 nginx.conf 文件中使用 user 指令修改用户名。默认 --user=nobody

--group=name

设置启动 worker 进程时所使用的非特权用户组名。安装nginx之后,可在 nginx.conf 文件中使用 user 指令修改用户组名。默认 --group=nobody

--with-pcre=path

设置 PCRE 库的源码路径。首先需要下载和解压 PCRE 库。要求 PCRE 的版本范围为 4.4 — 8.38。设置之后,其余的就交给 ./configure 和 make 命令。nginx 使用 PCRE 库用于支持正则表达式。正则表达式在 location 指令和 rewrite 模块中会用到。

--with-pcre-jit

编译 PCRE 库时,加入 “just-in-time compilation” 支持 (1.1.12, the pcre_jit directive)

--with-zlib=path

设置 zlib 库的源码路径。首先需要下载和解压 zlib 库。
要求 zlib 库的版本范围为 1.1.3 — 1.2.8,设置之后,其余的就交给 ./configure 和 make 命令。gzip 压缩模块依赖 zlib 库。

配置 nginx gcc 选项

指定编译相关选项:

--with-cc-opt=parameters

为 CFLAGS 变量设置额外的参数。比如 FreeBSD 下使用 PCRE 库,必须指定 --with-cc-opt="-I /usr/local/include"。 比如 希望增加 select() 支持的文件数,可指定:--with-cc-opt="-D FD_SETSIZE=2048"

--with-ld-opt=parameters

设置链接时的额外参数。比如,FreeBSD 使用 PCRE 库时,必须指定 --with-ld-opt="-L /usr/local/lib"

指定 nginx 并发模型

可参考:Connection Processing Methods

--with-select_module
--without-select_module

是否编译 select 模块。使用 select 模块可使 nginx 工作于 select() 模式。
如果 nginx 不支持其他更合适的模块,如 kqueue, epoll 或者 /dev/poll,该模块被自动编译。

--with-poll_module
--without-poll_module

是否编译 poll 模块。使用 poll 模块可使 nginx 工作于 poll() 模式。
如果 nginx 不支持其他更合适的模块,如 kqueue, epoll 或者 /dev/poll,该模块被自动编译。

nginx 的模块

nginx 由很多模块组成。一些模块被默认编译进 nginx,因此不需要在 configure 脚本的选项中显式地指定。但是如果你希望不编译某个默认模块,可使用 --without-MODULE 选项将其排除在外。

没有默认编译的模块以及第三方模块,必须在执行 configure 脚本时进行显式地指定。对于这些模块,其中一部分是静态链接到 nginx 库,另一些是可动态链接到 nginx 库。

  • 如果是静态链接到 nginx,当每次 nginx 启动时,这些模块被加载到 nginx 中。
  • 如果是动态链接到 nginx,只有当在 nginx.conf 中指定了的该模块,模块才会被加载到 nginx 中。

默认编译的模块

如果你希望不编译某个默认模块,可使用 --without-MODULE 选项将其排除在外:

$ ./configure --sbin-path=/usr/local/nginx/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--pid-path=/usr/local/nginx/nginx.pid \
--with-http_ssl_module \
--with-stream \
--with-pcre=../pcre-8.38 \
--with-zlib=../zlib-1.2.8 \
--without-http_empty_gif_module

http_charset_module

在响应首部的 “Content-Type” 字段添加指定的字符集,能够对数据进行字符集转换。

http_gzip_module

使用 gzip 对响应报文进行压缩,可减少传输的数据大小,可减少一半或更多。

http_ssi_module

Processes SSI (Server Side Includes) commands in responses passing through it.

http_userid_module

为客户端标识设置合适的 cookies

http_access_module

Limits access to certain client addresses.
通过 “IP地址” 限制某个客户端的访问

http_auth_basic_module

使用 HTTP 基本认证协议,对客户端进行认证,以限制对资源的访问。

http_autoindex_module

Processes requests ending with the slash character (‘/’) and produces a directory listing.

http_geo_module

Creates variables with values depending on the client IP address.

http_map_module

Creates variables whose values depend on values of other variables.

http_split_clients_module

Creates variables suitable for A/B testing, also known as split testing.

http_referer_module

对客户端的访问,如果在请求首部的 Referer 字段有无效的值,则阻止其对某个站点的访问。

http_rewrite_module

使用正则表达式修改请求 URI,并返回重定向指令;根据条件判断选择配置。依赖于 PCRE 库。

http_proxy_module

将请求转发给其他服务器

http_fastcgi_module

将请求转发给 FastCGI 服务器。

http_uwsgi_module

将请求转发给 uwsgi 服务器。

http_scgi_module

将请求转发给 SCGI 服务器。

http_memcached_module

从一个 memcached 服务器获取响应。

http_limit_conn_module

对每个定义的 key,限制其连接数,特别是限制来自同一个 IP 地址的连接数。

http_limit_req_module

对每个定义的 key,限制其请求的处理速率,特别是限制来自同一个 IP 地址的请求处理速率。

http_empty_gif_module

Emits single-pixel transparent GIF.

http_browser_module

Creates variables whose values depend on the value of the “User-Agent” request header field.

http_upstream_hash_module

激活基于 hash 的负载均衡策略

http_upstream_ip_hash_module

激活基于 IP hash 的负载均衡策略

http_upstream_least_conn_module

激活基于 “最小连接数” 的负载均衡策略

http_upstream_keepalive_module

激活 keepalive 连接保持

http_upstream_zone_module

激活共享内存区

默认不编译的模块

一些模块是默认不编译的,你需要使用 ./configure 命令添加该选项。在这些默认不编译的模块中,有些模块可编译为动态模块,如下:

mail
stream
geoip
image_filter
perl
xslt

示例:

$ ./configure --sbin-path=/usr/local/nginx/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--pid-path=/usr/local/nginx/nginx.pid \
--with-pcre=../pcre-8.38 \
--with-zlib=../zlib-1.2.8 \
--with-http_ssl_module \
--with-stream \
--with-mail

--with-threads

Enables NGINX to use thread pools. See Thread Pools in NGINX Boost Performance 9x! blog post for details.

--with-file-aio

Enables asynchronous I/O.

--with-ipv6

Enables IPv6 support.

--with-http_ssl_module

Provides support for HTTPS. Requires an SSL library such as OpenSSL.See the ngx_http_ssl_module reference for the list of directives.

--with-http_v2_module

Provides support for HTTP/2.See the ngx_http_v2_module reference for the list of directives and the “HTTP/2 Module in NGINX” blog post for details.

--with-http_realip_module

Changes the client address to the one sent in the specified header field. See the ngx_http_realip_module reference for the list of directives.

--with-http_addition_module

Adds text before and after a response. See the ngx_http_addition_module reference for the list of directives.

--with-http_xslt_module or --with-http_xslt_module=dynamic

Transforms XML responses using one or more XSLT stylesheets. The module requires the Libxml2 and XSLT libraries. See the ngx_http_xslt_module reference for the list of directives. The module can also be compiled as dynamic.

--with-http_image_filter_module or --with-http_image_filter_module=dynamic

Transforms images in JPEG, GIF, and PNG formats. The module requires the LibGD library. See ngx_http_image_filter_module reference for the list of directives. The module can also be compiled as dynamic.

--with-http_geoip_module or --with-http_geoip_module=dynamic

Allows creating variables whose values depend on the client IP address. The module uses MaxMind GeoIP databases. See the ngx_http_geoip_module reference for the list of directives. The module can also be compiled as dynamic.

--with-http_sub_module

Modifies a response by replacing one specified string by another. See the ngx_http_sub_module reference for the list of directives.

--with-http_dav_module

Intended for file management automation via the WebDAV protocol. See the ngx_http_dav_module reference for the list of directives.

--with-http_flv_module

Provides pseudo-streaming server-side support for Flash Video (FLV) files. See the ngx http_flv_module reference for the list of directives.

--with-mp4_module

Provides pseudo-streaming server-side support for MP4 files. See the ngx_http_mp4_module reference for the list of directives.

--with-http_gunzip_module

Decompresses responses with Content-Encoding: gzip for clients that do not support zip encoding method. See the ngx_http_gunzip_module for the list of directives.

--with-http_gzip_static_module

Allows sending precompressed files with the *.gz filename extension instead of regular files. See the ngx_http_gzip_static_module for the list of directives.

--with-http_auth_request_module

Implements client authorization based on the result of a subrequest. See the http_auth_request_module for the list of directives.

--with-http_random_index_module

Processes requests ending with the slash character (‘/’) and picks a random file in a directory to serve as an index file. See the ngx_http_random_index_module for the list of directives.

--with-http_secure_link_module

Used to check authenticity of requested links, protect resources from unauthorized access, and limit link lifetime. See the ngx_http_secure_link_module for the list of directives.

--with-http_slice_module

Allows splitting a request into subrequests, each subrequest returns a certain range of response. Provides more effective caching of large files. See the ngx_http_slice_module reference for the list of directives.

--with-http_degradation_module

Allows returning an error when a memory size exceeds the defined value.

--with-http_stub_status_module

Provides access to basic status information. See the ngx_http_stub_status_module reference for the list of directives. Note that NGINX Plus customers do not require this module as they are already provided with extended status metrics and interactive dashboard.

--with-http_perl_module or --with-http_perl_module=dynamic

Used to implement location and variable handlers in Perl and insert Perl calls into SSI. Requires the PERL library. See the ngx_http_perl_module reference for the list of directives. The module can also be compiled as dynamic.

--with-mail or --with-mail=dynamic

Enables mail proxy functionality. See the ngx_mail_core_module reference for the list of directives. The module can also be compiled as dynamic.

--with-mail_ssl_module

Provides support for a mail proxy server to work with the SSL/TLS protocol. Requires an SSL library such as OpenSSL. See the ngx_mail_ssl_module reference for the list of directives.

--with-stream or --with-stream=dynamic

Enables the TCP proxy functionality. See the ngx_stream_core_module reference for the list of directives. The module can also be compiled as dynamic.

--with-stream_ssl_module

Provides support for a stream proxy server to work with the SSL/TLS protocol. Requires an SSL library such as OpenSSL. See the ngx_stream_ssl_module reference for the list of directives.

--with-google_perftools_module

Allows using Google Performance tools library.

--with-cpp_test_module
--with-debug

Enables the debugging log.

第三方模块

你可以为 nginx 编译第三方模块,一些第三方模块可参见:modules
使用第三方模块,需要自己承担稳定性的风险,因为第三方模块的稳定性是没有保证的。

静态链接模块和动态链接模块

静态链接模块

大多数被编译进 nginx 的模块是被静态链接的,它们在编译 nginx 时被构建到 nginx 中,并且被 nginx 的可执行文件静态地链接。被静态链接的模块无法被 disabled,只有重新编译 nginx 才能达到这个目的。

以静态方式编译第三方模块,如下所示,在执行 configure 脚本时,添加 --add-module= 选项,并输入模块的路径:

$  ./configure ... --add-module=/usr/build/nginx-rtmp-module
动态链接模块

某些 nginx 模块也可以被编译为共享对象(*.so 文件),并在运行时被加载到 nginx 中。这种方式提供了更多的灵活性,因为可以自由选择加载或不加载某个动态模块。要加载某个动态模块,只要在 nginx.conf 中使用 load_module指令指定该模块。

支持动态加载的模块,它们不是默认编译的:

mail
stream
geoip
image_filter
perl
xslt

以动态方式编译第三方模块,如下所示,在执行 configure 脚本时,添加 --add-dynamic-module= 选项,并输入模块的路径:

$  ./configure ... --add-dynamic-module=/path/to/module

生成的 *.so 文件可在 prefix/modules/ 目录中找到,例如默认的路径为 /usr/local/nginx/modules

安装完成后,如果要加载某个动态模块,只要在 nginx.conf 中使用 load_module指令指定该模块。

相关扩展阅读:
Introducing Dynamic Modules in NGINX 1.9.11
Extending NGINX

完成安装

使用 configure 脚本配置完成后,可进行编译安装:

$ make
$ sudo make install

安装顺利完成后,执行 nginx 命令,启动 nginx:

$ sudo nginx

安装预编译的 package

安装预编译的 package 相对更简单和快速。缺点是缺少灵活性。可安装预编译的 package 的系统有: Red Hat, CentOS, Debian, Ubuntu 以及 SLES。

预编译的 package 所包含的模块

关于预编译的 package 所包含的模块,请参见 linux_packages

安装 Red Hat/CentOS packages

nginx 为 Red Hat/CentOS 5, 5.x, 6, 6.x, 7 and 7.x 提供了预编译 package,package 有两个来源:

  • 默认的 Red Hat or CentOS yum 仓库。这是最快的方式,但所提供的 package 版本比较老旧。比如说,CentOS 7.0 默认提供 nginx/1.6.2 released in September, 2014

  • nginx repo。为了从 nginx repo 安装 package,你需要设置相应的 yum 仓库。这里提供最新版本的 package

从默认的 Red Hat/CentOS 仓库安装 nginx

  1. 安装 EPEL 仓库:

    $ sudo yum install epel-release

  2. 更新仓库,并安装 nginx:

    $ sudo yum update

  3. 验证所安装的 nginx 版本:

    $ sudo nginx -v nginx version: nginx/1.6.3

从 nginx repo 安装 nginx

  1. 设置 yum 仓库:

    $ cd /etc/yum.repos.d $ sudo vi /etc/yum.repos.d/nginx.repo

  2. 添加如下内容:

    [nginx] name=nginx repo baseurl=http://nginx.org/packages/mainline/OS/OSRELEASE/$basearch/ gpgcheck=0 enabled=1

其中:

  • “OS” 是 rhel 或者 centos
  • “OSRELEASE” 为系统版本:5, 5.x, 6, 6.x, 7, 7.x
  • “/mainline” 是最新的 mainline 版。删除 “/mainline” 是安装最新的 stable 版

比如,为 CentOS 7.0 获取最新的 mainline package:

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1
  1. 保存退出

  2. 更新仓库,并安装 nginx:

    $ sudo yum update

  3. 运行 nginx:

    $ sudo nginx

  4. 验证 nginx 是否启动:

    $ curl -I 127.0.0.1 HTTP/1.1 200 OK Server: nginx/1.11.1

版权信息
本文编译自 installing-nginx-open-source

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,757评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,478评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,540评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,593评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,903评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,329评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,659评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,383评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,055评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,337评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,864评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,227评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,820评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,999评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,750评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,365评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,260评论 2 258

推荐阅读更多精彩内容

  • Page 1:nginx 服务器安装及配置文件详解 CentOS 6.2 x86_64 安装 nginx 1.1 ...
    xiaojianxu阅读 8,467评论 1 41
  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,438评论 24 1,003
  • 1.简介:  Nginx:engine X ,2002年,开源,商业版 http协议:web服务器(类似于ht...
    尛尛大尹阅读 1,828评论 0 3
  • nginx在工作中已经有好几个环境在使用了,每次都是重新去网上扒博客,各种编译配置,今天自己也整理一份安装文档和n...
    AndyChin阅读 2,270评论 0 4
  • 冬末,在T市郊区的一处温室大棚内,我缓缓地睁开了双眼,一片明亮的光刺痛了我的眼,但我不愿意再把眼睛闭上,我知道那是...
    疯岩疯语sun阅读 310评论 0 0