Linux编译安装Nginx详细操作

134 阅读8分钟

先说明下 yum源码包 安装的区别:

  • yum 安装是在线安装,安装方式很简单,不易出错(本文为编译安装操作,没有 yum 的安装方式)
  • 源码包 安装是先将 nginx 的源码下载到自己的系统内,然后编译生成可执行的文件,这种方式安装复杂一些,你需要先安装对应的依赖包(详细步骤可参考以下正文),但是因为是在自己的系统上编译的,更符合自己系统的性能。

1. 下载压缩包并拷贝到服务器

官网稳定版本下载地址:nginx 官网稳定版本下载地址

image.png

如果需要其他版本,可以访问此页面选择其他版本下载:nginx.org/download

使用 sftp 工具上传到服务器并解压:

# 此处我上传到了 /usr/local/nginx 目录
# 如果没有这个目录,可以使用 mkdir /usr/local/nginx 进行创建
cd /usr/local/nginx

# 注意修改你自己的 nginx 压缩包名
tar -zxvf nginx-1.24.0.tar.gz

tar命令 可以为linux的文件和目录创建档案。利用tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。tar最初被用来在磁带上创建档案,现在,用户可以在任何设备上创建档案。利用tar命令,可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的。

首先要弄清两个概念:打包和压缩。打包是指将一大堆文件或目录变成一个总的文件;压缩则是将一个大的文件通过一些压缩算法变成一个小文件。

为什么要区分这两个概念呢?这源于Linux中很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得先将这一大堆文件先打成一个包(tar命令),然后再用压缩程序进行压缩(gzip bzip2命令)。

  • -x:表示告诉 tar 要执行解压操作,当你想要从一个 .tar 文件中提取文件和目录时,使用这个选项。
  • -v:这个选项表示详细模式。当使用这个选项时,tar 会在执行过程中输出详细的信息,包括正在处理的文件名。
  • -f:这个选项用来指定你想要操作的 .tar 文件。
  • -z:这个选项用于通过 gzip 压缩或解压文件,注意,-z 选项只适用于 gzip 压缩。如果你想用其他类型的压缩,如 bzip2(.tar.bz2),你需要使用 -j 选项;对于 xz 压缩(.tar.xz),则需要使用 -J 选项。

2. 检查配置与指定安装参数

首先安装缺少的依赖包:

yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel

进入解压后的目录

# 注意修改成你自己的解压路径
cd /usr/local/nginx/nginx-1.24.0/

检查配置与指定安装参数

./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre

常用配置说明:

  • --prefix:指定 nginx 的安装目录。默认 /usr/local/nginx
  • --with-http_stub_status_module:用来监控 Nginx 的当前状态。
  • --with-http_ssl_module:使用https协议模块。默认情况下,该模块没有被构建。前提是opensslopenssl-devel已安装。(上面我们已经安装了依赖包)
  • --with-pcre : 设置PCRE库的源码路径,如果已通过yum方式安装,使用--with-pcre自动找到库文件。使用--with-pcre=PATH时,需要从PCRE网站下载pcre库的源码并解压,指定 pcre 的源码路径 ,比如:--with-pcre=/root/pcre-8.39/。perl正则表达式使用在location指令和 ngx_http_rewrite_module模块中
  • --conf-path=PATH : 设置nginx.conf配置文件的路径。nginx允许使用不同的配置文件启动,通过命令行中的-c选项。默认为conf/nginx.conf
  • --user=name : 设置nginx工作进程的用户。安装完成后,可以随时在nginx.conf配置文件更改user指令。默认的用户名是nobody--group=name类似。
  • --with-zlib=PATH : 指定 zlib的源码解压目录。在默认就启用的网络传输压缩模块ngx_http_gzip_module时需要使用zlib 。
  • --with-http_realip_module : 通过这个模块允许我们改变客户端请求头中客户端IP地址值(例如X-Real-IPX-Forwarded-For),意义在于能够使得后台服务器记录原始客户端的IP地址
  • --add-module=PATH : 添加第三方外部模块,如nginx-sticky-module-ng或缓存模块。每次添加新的模块都要重新编译(Tengine可以在新加入module时无需重新编译)

3. 编译和安装

# 需要在 nginx 解压路径下执行,比如我的解压路径为 /usr/local/nginx/nginx-1.24.0/
make && make install 

编译与安装完成后,解压路径就不会再用到了,可以删除了

rm -rf /usr/local/nginx/nginx-1.24.0/

执行此操作请谨慎,请确保你删除的目录正确!!!不删除也没关系,此步骤不是必需的

我指定的安装目录是 /usr/local/nginx,此时这个目录下存在四个目录(confhtmllogssbin),配置文件地址是 conf/nginx.conf,启动文件地址是 sbin/nginx

4. 设置软链

设置链接相当于是创建了一个别名,可以让你访问到实际存在但名称不同的文件或目录,这可以使我们更加方便的使用 nginx 命令。

ln -s /usr/local/nginx/sbin/nginx /usr/bin/

如果不想使用软链了,可以使用以下命令进行删除

rm /usr/bin/nginx

5. 创建 Nginx 用户组和用户

 # 添加用户组
 groupadd nginx
 # 添加用户, `-g` 选项是指定用户所属的群组
 useradd -g nginx nginx

6. 配置权限

在Linux中,每个文件和目录都有一个所有者和一个所属组,它们决定了哪些用户可以访问、修改或执行这些资源。

可以使用如下命令,将 nginx 的目录权限分配给上面创建的用户:

chown -R nginx:nginx /usr/local/nginx

7. 更改配置文件 nginx.conf


user  nginx;

# 指定了nginx要开启的进程数,设置与服务器 CPU 物理核心数一致,也可以使用 auto「需修改」
worker_processes  1; 

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
# 生产环境配置为 info 与 notice 均可,开发环境可以配置为 debug,输出的日志最为详细
error_log  logs/error.log  info;

# 指定进程id的存储文件位置
#pid        logs/nginx.pid;


events {
    # worker_connections 事件模块指令,用于定义 nginx 每个进程的最大连接数,默认是 1024
    # 进程的最大连接数受 linux 系统的最大打开文件数限制,在执行操作系统命令 “ulimit -n 65535” 后 worker_connections 的设置才能生效
    worker_connections  1024;
}


http {
    # 主模块指令,实现对配置文件所包含的文件设定,可以减少主配置文件的复杂度,类似 apache 中的 include 方法
    include       mime.types;
    # 属于 http 核心模块指令,这里默认类型为二进制流,也就是当文件类型未定义是使用这种方式,例如在没有配置 php 环境时,nginx 是不予解析的,此时,用浏览器访问 php 文件就会出现下载窗口
    default_type  application/octet-stream;

    # 日志格式设定
    # main 是一个默认的日志格式,可以修改为其他字段,相应的 access_log 也需要修改
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';

    # 定义本虚拟主机的访问日志
    # main 是上边配置的日志格式名称
    access_log  logs/access.log  main;

    # 开启高效文件传输模式
    sendfile       on;
    tcp_nopush     on;

    #keepalive_timeout  0;
    # 用于设置客户端连接保持活动的超时时间,在超过这个时间之后服务器会关闭该链接
    keepalive_timeout  120;

    # 开启 gzip 压缩输出
    gzip  on;
    # 用于设置允许压缩的页面最小字节数,页面字节数从 header 头的 content-length 中获取,默认值是 0,不管页面多大都进行压缩,建议设置成大于 1k 的字节数,小于 1k 可能会越压越大
    gzip_min_length 1k;
    # 表示申请 4 个单位为 16k 的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储
    gzip_buffers 4 16k;
    # 压缩版本(默认 1.1,前端如果是 squid2.5 请使用 1.0)
    gzip_http_version 1.1;
    # 压缩等级,压缩等级范围从 0 到 9,数值越大,压缩效果越好,但同时也会增加 CPU 的使用率
    gzip_comp_level 7;
    # 压缩类型,默认就已经包含 text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个 warn。
    gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php application/javascript application/json;
    # 该选项可让前端的缓存服务器缓存经过 gzip 压缩的页面,例如,用 squid 缓存经过 nginx 压缩的数据。
    gzip_vary on;
    # 开启限制 IP 连接数的时候需要使用
    # limit_zone crawler $binary_remote_addr 10m;
    # gzip_disable 是 Nginx 配置文件中用于禁用响应内容压缩的参数,用于禁用针对特定版本的 Internet Explorer(IE)的 Gzip 压缩
    # 其中,[1-6] 表示数字范围的通配符,表示可以匹配从 1 到 6 的任何一个数字。\. 表示一个点号,用于分隔数字和版本号
    gzip_disable "MSIE [1-6]\.";

    # HTTP 服务
    server {
        listen       8000;
        # 用来指定 ip 地址或者域名,多个域名之间用空格分开「需修改」
        server_name  localhost;

        # 用于将请求的协议从 HTTP 转换成 HTTPS,并永久重定向到相应的 URL,如果需要转换成 HTTPS 可放开此行注释
        # rewrite ^(.*)$ https://$server_name$1 permanent;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            # 用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以使绝对路径「需修改」
            root   html;
            # 用于设定访问的默认首页地址
            index  index.html index.htm index.php;
        }

        # 指定错误代码和对应的错误页面。例如,error_page 404 = @custom_404; 表示当收到 404 错误响应时,跳转到 @custom_404 定义的自定义 404 页面
        # error_page 404 = @custom_404;
        # location @custom_404 {
        #     root /var/www/custom_404;
        # }

        # 指定全局错误页面。例如,error_page 500 502 503 504 /50x.html; 表示当收到 500、502、503 或 504 错误响应时,跳转到 /50x.html 定义的全局 50x 错误页面
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }


    # HTTPS 服务
    #
    # server {
    #     listen       443 ssl;
    #     # 用来指定 ip 地址或者域名,多个域名之间用空格分开「需修改」
    #     server_name  localhost;

    #     # 证书可以用openssl命令生成,也可以直接到购买的域名商里下载 Nginx 使用的ssl证书,
    #     # 然后上传到 nginx.conf 同一目录下
    #     ssl_certificate      cert.pem; # 「需修改」 
    #     ssl_certificate_key  cert.key; # 「需修改」

    #     # 表示将 SSL 会话缓存共享给多个 worker process,缓存大小为 1MB
    #     ssl_session_cache    shared:SSL:1m;
    #     # 指定 ssl 会话的超市时间
    #     ssl_session_timeout  5m;

    #     # ssl_ciphers指定了支持的加密算法
    #     ssl_ciphers  HIGH:!aNULL:!MD5;
    #     # 表示服务器应该优先选择自己支持的密码套件和加密算法。这样做可以提高 SSL 连接的性能,因为服务器会优先选择自己支持的加密算法,从而避免了在 SSL 连接过程中进行多次协商的情况
    #     ssl_prefer_server_ciphers  on;

    #     location / {
    #         # 用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以使绝对路径「需修改」
    #         root   html;
    #         # 用于设定访问的默认首页地址
    #         index  index.html index.htm index.php;
    #     }
    # }

}

我对一些常用的 nginx 配置参数加了注释,可参照注释进行修改,「需修改」为必须修改项。

更改配置文件的时候,可以使用 sftp 工具下载到本地,使用 vs code 等工具进行修改,修改完成后,再上传到原目录进行覆盖。如果修改有误,可以下载 nginx.conf.default 再次修改。

如果需要启用 https,可放开 rewrite ^(.*)$ https://$server_name$1 permanent; 此行注释,并放开下边的 https 服务 这一段注释。

8. 测试与重新加载配置文件

修改完 nginx.conf 文件并上传到服务器上之后,可执行下面命令进行测试,如果有报错,需要将报错问题处理了再重新加载配置文件,切记!!!

nginx -t

image.png

上图所示为配置文件测试成功,可继续执行下面的重新加载配置文件指令,如果有其他错误,可参考错误信息进行修改。

如果使用上面创建的 nginx 用户进行测试,可能会出现 [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied) 错误,可以修改 listen 端口为大于 1024 的端口即可解决,因为1024以下端口启动时需要root权限

# 重载 nginx 配置文件
nginx -s reload

如果遇到 nginx: [error] invalid PID number "" in "/usr/local/nginx/logs/nginx.pid"错误,请执行一下指令,再执行 nginx -s reload 即可

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

9. 配置云服务器安全组

以阿里云服务器配置为例:

image.png

image.png