Linux 编译安装 Nginx

作者: BroQiang

发布于 2017-04-18 | 最后更新 2017-04-18


当前最新稳定版本: 1.12.2

官网

获取软件

# 下载当前最新稳定版
$ wget https://nginx.org/download/nginx-1.12.2.tar.gz

# 解压到src目录
$ sudo tar xzvf nginx-1.12.2.tar.gz -C /usr/local/src/

解决依赖关系

# Ubuntu 执行下面命令
sudo apt install -y libpcre3-dev zlib1g-dev libssl-dev

# CentOS 执行下面命令
sudo yum install -y pcre-devel openssl-devel zlib-devel

# Fedora
sudo dnf install -y pcre-devel openssl-devel zlib-devel

创建守护进程用户

如果安装 PHP 的时候已经创建了,此步骤忽略

sudo useradd -M -s /sbin/nologin www

编译安装

参数多数用了默认的, 如果有特殊需求,可以查看 官方参数配置

# 进入到解压后的源码目录
cd /usr/local/src/nginx-1.12.2/

# 配置
sudo ./configure --prefix=/usr/local/nginx --user=www --group=www \
--with-select_module --with-poll_module --with-http_ssl_module --with-pcre \
--with-pcre-jit --with-zlib= --pid-path=/usr/local/nginx/run/nginx.pid

# 如果是使用的 gcc 7,如 Fedora 26 (我就是这个版本出现的问题)
# 加上这个参数:  --with-cc-opt="-Wno-error"
# 简单解释下,查找的资料说 gcc 7 检察的更加严格,所以原本的编译就编译不过去了

# 编译 & 安装
sudo make
sudo make install

配置自动启动

# 新建 service 文件
sudo vim /lib/systemd/system/nginx.service

# 写入下面内容
[Unit]
Description=nginx - high performance web server
Documentation=https://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

# 配置开机自动启动
sudo systemctl enable nginx

# 启动服务
sudo systemctl start nginx

# 停止服务
sudo systemctl stop nginx

修改配置文件

nginx.conf 主配置文件

简单配置了下,进行了一些基本的优化,将配置文件拆分开,方便分开配置

这个只是最初步的优化,真实环境要根据实际情况去优化

实际生产中各种原因都会影响性能,有时候并不是参数给的高性能就会提高

这个里面的参数要根据实际的服务器配置,并发访问情况等去优化,很难一步到位的

# 修改配置前先将原本的备份一份, 要养成良好习惯,因为谁也不能保证自己的修改就是 100% 正确, 必要时候要能够还原
cd /usr/local/nginx/conf/
sudo mv nginx.conf nginx.conf_`date +%Y-%m-%d`_bak

sudo vim /usr/local/nginx/conf/nginx.conf

将默认的内容全部删除,写入下面内容

# 守护进程用户
user  www;

#启动进程,通常设置成和cpu的数量相等
worker_processes  4;

events {
    # epoll是多路复用IO(I/O Multiplexing)中的一种方式,
    # 仅用于linux2.6以上内核,可以大大提高nginx的性能
    use   epoll;

    # 单个worker process进程的最大并发链接数
    # 并发总数理论值是 worker_processes 和 worker_connections 的乘积
    worker_connections  8192;
}

include conf.d/http.main;

http模块主配置

# 创建自定义配置文件存放目录 目录名称就是上面配置文件中 include 的目录
sudo mkdir /usr/local/nginx/conf/conf.d

sudo vim /usr/local/nginx/conf/conf.d/http.main

写入下面内容:

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile on;
    directio 4m;
    directio_alignment 512;

    tcp_nopush on;
    tcp_nodelay off;

    keepalive_timeout 180s;
    keepalive_requests 100;
    keepalive_disable msie6;
    send_timeout 60s;
    client_body_timeout 60s;
    client_header_timeout 30s;

    gzip on;
    gzip_min_length 1024;
    gzip_buffers 4 16k;
    gzip_comp_level 5;
    gzip_proxied any;
    gzip_types text/plain application/json application/x-javascript text/css appl
    ication/xml;
    gzip_vary on;
    gzip_disable "MSIE [1-6]\.";

    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 256k;
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;

    include conf.d/*.conf;
}

配置 server (虚拟主机)

# 有新的虚拟主机就再创建一个 xxx.conf 即可
$ sudo vim /usr/local/nginx/conf/conf.d/test.conf

写入下面内容

server {
    listen       80; # 端口,一般http的是80
    server_name  localhost; # 一般是域名,本机就是localhost
    index index.php index.html;  # 默认可以访问的页面,按照写入的先后顺序去寻找
    root  /home/bro/test; # 项目根目录

    # 防止访问版本控制内容
    location ~ .*.(svn|git|cvs) {
        deny all;
    }

    # 此处不是必须的,需要时候配置
    location / {
        # Laravel 5.4 Url 重写
        try_files $uri $uri/ /index.php?$query_string;
    }


    # 下面是所有关于 PHP 的请求都转给 php-fpm 去处理
    location ~ \.php {

        # 注意: unix sock 和 ip ,两种方式只能选择一种

        # 基于unix sock 访问,Ubuntu Apt 方式安装的PHP默认是以sock方式启动
        # fastcgi_pass    unix:/run/php/php7.0-fpm.sock;

        # 基于IP访问
        fastcgi_pass    127.0.0.1:9000;

        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include         fastcgi_params;
    }

    fastcgi_intercept_errors on;
    # 日志保存目录,一般按照项目单独保存, 开发环境可以关闭
    #access_log  logs/localhost_access.log access;
    access_log off;
}

其他配置

隐藏 Nginx 或 Tengine 的服务器及版本信息

这样可以稍微安全一点,叫功能者不能快速定位 Web 服务,修改也很简单,直接在编译前修改下源码即可(一定是编译前修改,如果已经编译完的话,可以重新编译一次,反正 Nginx 编译速度也很快)。如果是个人环境或者开发环境这个修改就省略吧,反正也不对外提供服务,不涉及到安全的问题。

修改文件 源码包中/src/core/nginx.h

(适用于 nginx 和 Tengine ,位置和文件名称相同)

修改里面的内容:

Nginx 修改方式

将这两行修改成想要显示的内容

#define NGINX_VERSION      "1.12.2"
#define NGINX_VER          "nginx/" NGINX_VERSION

修改后:

#define NGINX_VERSION      "3.4.5"
#define NGINX_VER          "MyServer/" NGINX_VERSION

Tengine 修改方式:

 修改前

#define TENGINE            "Tengine"
#define tengine_version    2002002
#define TENGINE_VERSION    "2.2.2"

修改后

#define TENGINE            "MyServer"
#define tengine_version    3003003
#define TENGINE_VERSION    "3.3.3"