在项目开发中需要自己搭建配置前端服务,发布代码,所以捣鼓了一下 nginx。在这里记录一下,相应的常规配置。Nginx 是一款轻量级的网页服务器、反向代理服务器。相较于 Apache、lighttpd 具有占有内存少,稳定性高等优势。它最常的用途是提供反向代理服务。

安装

  • 各自优点

安装 nginx 有两种方法,方法一是 ECS 服务器在线 yum 安装,方法二是下载并上传到 ECS 服务器编译安装。方法一安装是在线安装,好处是:安装方式简单,不易出错;方法二安装是先将 nginx 的源码下载下来,在自己的系统里编译生成可执行文件,然后执行,好处是:因为是在自己的系统上编译的,更符合自己系统的性能,也就是说在自己的系统上执行 nginx 服务性能效率更好。

  • 他们之间最大的区别是 :安装位置不同

yum 在线安装会将 nginx 的安装文件放在系统的不同位置,可以通过命令 rpm -ql nginx 来查看安装路径。卸载的时候,只能通过 命令来卸载,因为我们不可能 将这些文件自己手动删除,可以通过命令 rpm -e nginx 来卸载,这个命令一般不会报错,因为 nginx 不与其他的包有依赖关系,如果提示关于 依赖包的问题 ,可以尝试 rpm -e –nodeps nginx 来卸载,这个命令相当于强制卸载,不考虑依赖问题。

源码包 安装他的所有文件(包括配置文件,库文件,资源文件等)都在同一个目录下,我们想卸载的时候,直接将这个文件删除就可以,不会有任何垃圾文件存在。
通过源码包编译安装的软件,通常都放在 /usr/local/包名 路径下。

  • 启动方式不同

yum 安装 nginx,我们可以通过 系统服务命令 service 来启动或停止

service nginx start #启动 nginx 服务
service nginx stop #停止 nginx 服务
service nginx restart #重启 nginx 服务

源码包 安装 nginx 启动的时候不能使用 service 来启动,需要执行 nginx 安装目录下的 sbin 目录下的 nginx 可执行程序才行,如下(我的 nginx 安装在 /usr/local/webserver/ 目录下)

/usr/local/webserver/nginx/sbin/nginx           #启动 nginx 服务
/usr/local/webserver/nginx/sbin/nginx -s stop   #停止 nginx 服务

或者 直接进入安装目录 ,执行 ./nginx 也可以,这两种方式其实是一样的,. 表示当前目录

cd /usr/local/webserver/nginx/sbin
./nginx           #启动 nginx 服务
./nginx -s stop   #停止 nginx 服务

yum 在线安装

  • 如果是刚买的服务器 先执行yum -y update,把 yum 更新到最新版本
  • yum 使用 yum 安装是在线安装,直接使用命令 yum -y install nginx 安装即可
  • 执行 nginx 来启动 nginx 服务

源码包 安装

以下命令均需 root 权限执行:首先安装必要的库(nginx 中 gzip 模块需要 zlib 库,rewrite 模块需要 pcre 库,ssl 功能需要 openssl 库)。选定/usr/local 为安装目录,以下具体版本号根据实际改变。

  • 安装依赖
yum -y install gcc gcc-c++ make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel
  • 安装 nginx
cd /usr/local/
wget http://nginx.org/download/nginx-1.13.0.tar.gz
tar -zxvf nginx-1.13.0.tar.gz
cd nginx-1.13.0
./configure --prefix=/usr/local/nginx\ --with-http_stub_status_module\ --with-http_ssl_module\ --with-pcre\ --with-zlib
make&&make install
/usr/local/nginx/sbin/nginx -v
  • 启动

/usr/local/nginx/sbin/nginx

检查是否启动成功,如何出现错误详见下文:

打开浏览器访问此机器的 IP,如果浏览器出现 Welcome to nginx! 则表示 Nginx 已经安装并运行成功。

  • 其他命令如下:

重启: /usr/local/nginx/sbin/nginx –s reload

停止: /usr/local/nginx/sbin/nginx –s stop

测试配置文件是否正常: /usr/local/nginx/sbin/nginx –t

强制关闭: pkill nginx

Nignx 配置

nginx 的配置文件根据你的安装方式,会在不同的文件夹下。如果使用在线 yum 安装,配置文件在/etc/nginx。默认配置文件已经被按模块分开了,所以只要在 default.d 或 conf.d 内新建一个.conf 结尾的文件填写你的 server 配置就可以了。

如果使用源码安装,则配置文件在你安装目录下,比如我的/usr/local/nginx/conf/nginx.conf,这里的配置文件是完整的,可以根据自己的需求对配置文件进行分离。

{
    base   # 基本配置
    events: {}
    http: {
        base # 基本配置
        server: {
            main
            location: {}
        }
    }
}

最外面的块是 base; base 包含 events 和 http; http 包含 upstream 和多个 server; server 又包含多个 location;

  • base 块设置的指令将影响其他所有设置,相当于全局设置
  • server 块的指令主要用于指定主机和端口,设置网站,例如虚拟主机
  • upstream 指令主要用于负载均衡,设置一系列的后端服务器
  • location 块用于匹配网页位置,就是匹配网页的路径,匹配到的路径可以做一些事情,例如反代

这四者之间的关系式:server 继承 base,location 继承 server,upstream 既不会继承其他设置也不会被继承。在这四个部分当中,每个部分都包含若干指令,这些指令主要包含 Nginx 的主模块指令、事件模块指令、HTTP 核心模块指令,同时每个部分还可以使用其他 HTTP 模块指令,例如 Http SSL 模块、HttpGzip Static 模块和 Http Addition 模块等。

配置说明

# 定义Nginx运行的用户和用户组
user www www;

# nginx进程数,建议设置为等于CPU总核心数。
worker_processes 1;

# 全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;

# 进程文件
pid /var/run/nginx.pid;

# 一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。
worker_rlimit_nofile 65535;

# 工作模式与连接数上限
events{
    # 参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
    use epoll;
    # 单个进程最大连接数(最大连接数=连接数*进程数)
    worker_connections 65535;
}

# 设定http服务器
http{
    include mime.types; #文件扩展名与文件类型映射表
    default_type application/octet-stream; #默认文件类型
    charset utf-8; #默认编码
    server_names_hash_bucket_size 128; #服务器名字的hash表大小
    client_header_buffer_size 32k; #上传文件大小限制
    large_client_header_buffers 4 64k; #设定请求缓
    client_max_body_size 8m; #设定请求缓
    sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
    autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
    tcp_nopush on; #防止网络阻塞
    tcp_nodelay on; #防止网络阻塞
    keepalive_timeout 120; #长连接超时时间,单位是秒

    #FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;

    #gzip模块设置
    gzip on; #开启gzip压缩输出
    gzip_min_length 1k; #最小压缩文件大小
    gzip_buffers 4 16k; #压缩缓冲区
    gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
    gzip_comp_level 2; #压缩等级
    gzip_types text/plain application/x-javascript text/css application/xml;
    #压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
    gzip_vary on;
    limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用

    upstream blog.ha97.com {
    #upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
    server 192.168.80.121:80 weight=3;
    server 192.168.80.122:80 weight=2;
    server 192.168.80.123:80 weight=3;
    }

    #虚拟主机的配置
    server{
        #监听端口
        listen 80;
        #域名可以有多个,用空格隔开
        server_name www.ha97.com ha97.com;
        index index.html index.htm index.php;
        root /data/www/ha97;
        location ~ .*\.(php|php5)?$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi.conf;
        }
        #图片缓存时间设置
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
            expires 10d;
        }
        #JS和CSS缓存时间设置
        location ~ .*\.(js|css)?$ {
            expires 1h;
        }
        #日志格式设定
        log_format access '$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/ha97access.log access;

        #对 "/" 启用反向代理
        location / {
            proxy_pass http://127.0.0.1:88;
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
            #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            #以下是一些反向代理的配置,可选。
            proxy_set_header Host $host;
            client_max_body_size 10m; #允许客户端请求的最大单文件字节数
            client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
            proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
            proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
            proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
            proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置
            proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
            proxy_temp_file_write_size 64k;
            #设定缓存文件夹大小,大于这个值,将从upstream服务器传
        }

        #设定查看Nginx状态的地址
        location /NginxStatus {
            stub_status on;
            access_log on;
            auth_basic "NginxStatus";
            auth_basic_user_file conf/htpasswd;
            #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
        }

        #本地动静分离反向代理配置
        #所有jsp的页面均交由tomcat或resin处理
        location ~ .(jsp|jspx|do)?$ {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://127.0.0.1:8080;
        }
        #所有静态文件由nginx直接读取不经过tomcat或resin
        location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
            expires 15d;
        }
        location ~ .*.(js|css)?$ {
            expires 1h;
        }
    }
}

常见配置

  • 配置静态页面
server {
    listen       80;
    server_name  test.lion1ou.win;

    location / {
        root   /home/lion1ou/dist; # 静态文件地址
        index  index.html index.htm; # 指定首页
    }
    error_page  404              /404.html;
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
     #charset koi8-r;
    access_log  logs/lion1ou.access.log;
}
  • 配置 web 服务
server {
    listen 80;
    server_name test1.lion1ou.win;
    location /{
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:8080;
    }
    access_log logs/8080_access.log;
}

配置 HTTPS

SSL 证书介绍

SSL 证书是一种数字证书,它使用 Secure Socket Layer 协议在浏览器和 Web 服务器之间建立一条安全通道,从而实现:

  1. 数据信息在客户端和服务器之间的加密传输,保证双方传递信息的安全性,不可被第三方窃听;
  2. 用户可以通过服务器证书验证他所访问的网站是否真实可靠。

HTTPS 是以安全为目标的 HTTP 通道,即 HTTP 下加入 SSL 加密层。HTTPS 不同于 HTTP 的端口,HTTP 默认端口为 80,HTTPS 默认端口为 443。

申请 SSL 证书(已失效)

  • 进入阿里云控制台,“安全(云盾)”下的“证书服务”,点击购买证书,选择免费型 DV SSL,按提示走就可以,反正不用花钱的。

  • 接下来到我的订单页面,看到证书状态是“待完成”,点击“补全”链接,根据提示完成操作,在上传相关信息时,一般选择系统生成

  • 然后等验证通过,一般十几二十分钟就 OK

  • 然后下载证书,选择 nginx

  • 将下载下来的证书解压,里面有两个文件一个是.key,另一个是.pem,把这两个文件传到服务器的一个目录中。

  • 配置 nginx 配置文件,重启 nginx 即可

配置 https

server{
    listen 443;
    server_name www.lion1ou.com;
    ssl on;
    root /home/lion1ou/dist;
    index index.html index.htm;
    ssl_certificate   /home/lion1ou/cert/214128084570320.pem;
    ssl_certificate_key  /home/lion1ou/cert/214128084570320.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

    # error_page 497 "https://$host$uri?$args";  # 这是跳转Http请求到Https

    location / {
        root /home/lion1ou/dist;
        index index.html index.htm;
    }
}

将 http 重定向到 https

server {
     listen 80;
     server_name www.chuyunt.com;
     rewrite ^/(.*) https://$server_name$1 permanent;    #用于http重定向到Https
}

问题

  1. 通过重定向跳转到 https 时,浏览器上会出现多次重定向,需要删除缓存才能访问的问题。

    现这个问题没有解决,有解决办法的同学,可以留言告诉我。

  2. 在 Centos7 上编译安装 openssl 后,运行 openssl version 出现如下错误:

/usr/local/nginx/sbin/nginx: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory

这是由于 openssl 库的位置不正确造成的。

解决方法:

在 root 用户下执行:

ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1