如何在CentOS6.4x64VPS上从源代码编译Nginx

来自菜鸟教程
跳转至:导航、​搜索

状态:已弃用

本文介绍了不再受支持的 CentOS 版本。 如果您目前正在运行运行 CentOS 6 的服务器,我们强烈建议您升级或迁移到受支持的 CentOS 版本。

原因CentOS 6 已于 2020 年 11 月 30 日结束生命周期 (EOL) ,不再接收安全补丁或更新。 因此,不再维护本指南。

请参阅:本指南可能仍可用作参考,但可能不适用于其他 CentOS 版本。 如果可用,我们强烈建议使用为您正在使用的 CentOS 版本编写的指南。


介绍


nginx 发音为“engine x”,是一个 HTTP 和反向代理服务器,也是一个邮件代理服务器。

nginx 是一个开源 Web 服务器,它使用 epoll 机制为客户端提供服务,而 Apache 则使用基于线程的模型将请求委托给线程池中的实例。 nginx 因为它的速度而被更多地使用而不是 Apache。 nginx 拥有超过 13% 的市场份额 并不断增加。

为什么要从源代码编译

从源代码编译在以下情况下很有用:

  1. 发布后立即升级到最新版本。
  2. 修复安全漏洞
  3. 修复影响您服务的已知错误
  4. 修改服务器名称等默认值
  5. 应用补丁修复已知错误
  6. 由于依赖层次结构,软件存储库未升级到最新版本

它很痛苦,因为:

  1. 您需要及时了解软件版本
  2. 您的服务器软件可能依赖于依赖关系树中的旧版本

模块和第 3 方模块

nginx 有许多 模块 在现有 VPS 之上添加功能。 一些著名的 3rd 方模块 是:

  • SPDY 包含在 nginx 1.5.0 中(之前作为补丁提供)
  • google pagespeed(source) 通过自动将网络性能最佳实践应用于页面和相关资产(CSS、JavaScript、图像)来加速您的网站并减少页面加载时间,而无需您进行修改您现有的内容或工作流程
  • ModSecurity 是一个开源的 Web 应用防火墙,用于减少对应用服务器的已知攻击。 *TCP Proxy 允许 nginx 通过 tcp 服务器进行代理,而不是默认的套接字模式。

设置你的 VPS


创建一个新的 VPS 或选择一个现有的

用你的域名创建一个新的VPS。 我们将使用“example.com”作为域,或者您可以使用服务器 IP 而不是主机名。

设置从源代码编译的先决条件


安全登录您的 VPS

您可以使用您主机的密码登录 VPS。

ssh root@example.com

为 nginx 安装依赖项

我们需要安装一些先决条件来进行编译,其中包括开发库和源代码编译器。

yum -y install gcc gcc-c++ make zlib-devel pcre-devel openssl-devel

让我们首先创建一个目录来存储我们的源代码:

mkdir -p src && cd src

从源代码编译


下载源代码

让我们从 http://nginx.org/en/download.html 获取当前的 nginx 版本号

运行以下命令下载源代码。

nginxVersion="1.5.5"
wget http://nginx.org/download/nginx-$nginxVersion.tar.gz
tar -xzf nginx-$nginxVersion.tar.gz 
ln -sf nginx-$nginxVersion nginx

准备 nginx 源码

我们首先要准备 nginx 和必要的基本选项。

有关选项的完整列表,您可以查看 ./configure --help

基本文件路径名的选项

这些选项是我们覆盖的基本变量,以使用 /etc/ 处的默认系统路径,以确保通过 rpm 安装时它的工作原理相似。 usergroup 选项用于以非特权运行 nginx 工作进程。

--user
--group
--prefix
--sbin-path
--conf-path
--pid-path
--lock-path
--error-log-path
--http-log-path

其他选项

  • --with-http_gzip_static_module 选项使 nginx 能够使用 gzip (在将文件从磁盘提供给启用 gzip 的客户端之前,此模块将在同一位置查找以“.gz”结尾的预压缩文件. 目的是避免每次请求时都压缩同一个文件。)。[建议减少发送信息的大小]
  • --with-http_stub_status_module 选项启用 nginx 上的其他插件以允许我们获取状态(此模块提供从 nginx 获取某些状态的能力。)。 [推荐获取统计数据]
  • --with-http_ssl_module - 如果要运行 HTTPS 服务器,则需要。 请参阅 如何在 nginx 上为 CentOS 6 创建 SSL 证书
  • --with-pcre 选项可以在定义路由时通过 Regular Expression Matching 匹配路由。 [推荐,一旦你开始添加和匹配路由,你会发现它的更多用途]
  • --with-file-aio - 启用异步 I/O,优于默认发送文件选项 (如果您允许用户下载静态文件,推荐使用)
  • --with-http_realip_module 用于在负载均衡器后面获取客户端的 IP。 当在 CloudFlare 之类的服务后面提供内容时,这很有用。
  • --without-http_scgi_module - 禁用 SCGI 模块(通常在运行 CGI 脚本时使用)
  • --without-http_uwsgi_module - 禁用 UWSGI 模块(通常在运行 CGI 脚本时使用)
  • --without-http_fastcgi_module - 禁用 FastCGI 模块(通常在运行 CGI 脚本时使用)

我们的配置选项

cd nginx

./configure \
--user=nginx                          \
--group=nginx                         \
--prefix=/etc/nginx                   \
--sbin-path=/usr/sbin/nginx           \
--conf-path=/etc/nginx/nginx.conf     \
--pid-path=/var/run/nginx.pid         \
--lock-path=/var/run/nginx.lock       \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module        \
--with-http_stub_status_module        \
--with-http_ssl_module                \
--with-pcre                           \
--with-file-aio                       \
--with-http_realip_module             \
--without-http_scgi_module            \
--without-http_uwsgi_module           \
--without-http_fastcgi_module

编译nginx源码

一旦我们能够配置甚至检查附加要求的源代码,例如我们在 pre-requisites 步骤中安装的编译器(gcc,g++):

 make
 make install

运行 VPS

  1. 将用户 nginx 添加到系统中。 这是一次性命令:

     useradd -r nginx
  2. 我们需要设置文件 /etc/init.d/nginx 在系统启动时运行:

     #!/bin/sh
     #
     # nginx - this script starts and stops the nginx daemin
     #
     # chkconfig:   - 85 15
     # description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
     #               proxy and IMAP/POP3 proxy server
     # processname: nginx
     # config:      /etc/nginx/nginx.conf
     # pidfile:     /var/run/nginx.pid
     # user:        nginx
     
     # Source function library.
     . /etc/rc.d/init.d/functions
     
     # Source networking configuration.
     . /etc/sysconfig/network
     
     # Check that networking is up.
     [ "$NETWORKING" = "no" ] && exit 0
     
     nginx="/usr/sbin/nginx"
     prog=$(basename $nginx)
     
     NGINX_CONF_FILE="/etc/nginx/nginx.conf"
     
     lockfile=/var/run/nginx.lock
     
     start() {
         [ -x $nginx ] || exit 5
         [ -f $NGINX_CONF_FILE ] || exit 6
         echo -n $"Starting $prog: "
         daemon $nginx -c $NGINX_CONF_FILE
         retval=$?
         echo
         [ $retval -eq 0 ] && touch $lockfile
         return $retval
     }
     
     stop() {
         echo -n $"Stopping $prog: "
         killproc $prog -QUIT
         retval=$?
         echo
         [ $retval -eq 0 ] && rm -f $lockfile
         return $retval
     }
     
     restart() {
         configtest || return $?
         stop
         start
     }
     
     reload() {
         configtest || return $?
         echo -n $"Reloading $prog: "
         killproc $nginx -HUP
         RETVAL=$?
         echo
     }
     
     force_reload() {
         restart
     }
     
     configtest() {
       $nginx -t -c $NGINX_CONF_FILE
     }
     
     rh_status() {
         status $prog
     }
     
     rh_status_q() {
         rh_status >/dev/null 2>&1
     }
     
     case "$1" in
         start)
             rh_status_q && exit 0
             $1
             ;;
         stop)
             rh_status_q || exit 0
             $1
             ;;
         restart|configtest)
             $1
             ;;
         reload)
             rh_status_q || exit 7
             $1
             ;;
         force-reload)
             force_reload
             ;;
         status)
             rh_status
             ;;
         condrestart|try-restart)
             rh_status_q || exit 0
                 ;;
         *)
             echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
             exit 2
     esac

    或者,您可以从以下位置获取源:

     wget -O /etc/init.d/nginx https://gist.github.com/sairam/5892520/raw/b8195a71e944d46271c8a49f2717f70bcd04bf1a/etc-init.d-nginx

    这个文件应该是可执行的,这样我们就可以通过'service nginx来使用它 ':

     chmod +x /etc/init.d/nginx
  3. 将服务设置为在系统启动时启动:

     chkconfig --add nginx
     chkconfig --level 345 nginx on
  4. 配置/etc/nginx/nginx.conf设置需要增加的types_hash_bucket_sizeserver_names_hash_bucket_size

     http {
         include       mime.types;
         default_type  application/octet-stream;
        # add the below 2 lines under http around line 20
         types_hash_bucket_size 64;
         server_names_hash_bucket_size 128;
  5. 启动服务器。 这将在端口 80 上启动 VPS。

     service nginx start

设置完成

在浏览器中访问 example.com 或您的 IP 地址。 你会看见:

Welcome to nginx!

恭喜! 您全新的 nginx 服务器已启动。

维护

修改nginx二进制文件时重启nginx服务器:service nginx restart

修改 nginx.conf 时重新加载 nginx:service nginx reload

配置 nginx Web 服务器

升级到最新版本

让我们从 http://nginx.org/en/download.html 获取当前的 nginx 版本

运行以下命令下载源代码。

ssh root@example.com
cd ~/src/
nginxVersion="1.5.5" # set the value here from nginx website
wget http://nginx.org/download/nginx-$nginxVersion.tar.gz
tar -xzf nginx-$nginxVersion.tar.gz
rm nginx # removes the soft link
ln -sf nginx-$nginxVersion nginx

cd nginx

./configure \
--user=nginx                          \
--group=nginx                         \
--prefix=/etc/nginx                   \
--sbin-path=/usr/sbin/nginx           \
--conf-path=/etc/nginx/nginx.conf     \
--pid-path=/var/run/nginx.pid         \
--lock-path=/var/run/nginx.lock       \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module        \
--with-http_stub_status_module        \
--with-http_ssl_module                \
--with-pcre                           \
--with-file-aio                       \
--with-http_realip_module             \
--without-http_scgi_module            \
--without-http_uwsgi_module           \
--without-http_fastcgi_module

make
make install

service nginx restart

更多关于 nginx 的资源

DigitalOcean 上有关 nginx 的资源