LNMP网站服务器架构(一)之Nginx部署

Nginx概述

1. 简介

  1. Nginx 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。
  2. 其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
  3. Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强。

Nginx安装

安装规划

OS: RHEL/CentOS 7/8
Software: nginx-1.19.6

1. 新建运行Nginx服务的用户

  1. 创建运行nginx的用户组
    # groupadd -g 10001 nginx
  2. 创建运行nginx的用户
    # useradd -u 10001 -g nginx -M -s /bin/false nginx

2. 准备与规划

  1. 目录规划
No. 说明 路径
1 源码目录 /root/packages/
2 安装目录 /opt/lnmp/nginx-1.19.6/
3 日志目录 /var/log/nginx
4 web应用目录 /data/webapps/
  1. 创建目录

    # mkdir -p /root/packages/
    # mkdir -p /opt/lnmp/nginx-1.19.6/
    # mkdir -p /var/log/nginx/
    # mkdir -p /data/webapps/
    # chown -R nginx:nginx /var/log/nginx/
  2. 获取nginx源码包
    # cd /root/packages/
    # wget http://nginx.org/download/nginx-1.19.6.tar.gz
  3. 设置进程所占用的资源(可选)
    # ulimit -SHn 65535
    此方法在重启后失效,下面三种方法永久生效

    • 在/etc/rc.local 中增加一行 ulimit -SHn 65535
    • 在/etc/profile 中增加一行 ulimit -SHn 65535
    • 在/etc/security/limits.conf最后增加如下两行记录
      * soft nofile 65535
      * hard nofile 65535

编译安装

1. 安装依赖包/库

  1. 基本编译工具及库文件
    # yum -y install gcc gcc-c++ autoconf automake make
  2. 安装pcre库;rewrite模块需要 pcre 库。
    # yum install pcre pcre-devel -y
  3. 安装openssl
    OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用;nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要安装 OpenSSL 库。
    # yum install openssl openssl-devel -y
  4. gzip 类库安装
    zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要安装 zlib 库。
    # yum install zlib zlib-devel
  5. 其他依赖包
    # yum install -y libxml2 libxml2-devel libxslt-devel gd-devel

2. 源码编译安装nginx

  1. Makefile文件生成

    # cd /root/packages/
    # tar zxvf nginx-1.19.6.tar.gz
    # cd nginx-1.19.6/
    # ./configure --prefix=/opt/lnmp/nginx-1.19.6/  \
    --error-log-path=/var/log/nginx/error.log \
    --http-log-path=/var/log/nginx/access.log \
    --user=nginx \
    --group=nginx \
    --with-http_stub_status_module \
    --with-http_ssl_module \
    --with-pcre \
    --with-http_xslt_module \
    --with-http_image_filter_module \
    --with-http_image_filter_module=dynamic \
    --with-http_xslt_module=dynamic \
    --with-http_mp4_module \
    --with-http_gunzip_module \
    --with-http_gzip_static_module \
    --with-stream \
    --with-stream_ssl_module \
    --with-http_v2_module
    • 注:详细参数请执行# ./configure --help查看
  2. 编译
    # make
  3. 安装(注意权限)
    # make install

环境变量及systemd

1. 环境变量配置

  1. 软连接Nginx安装目录(方便访问和后期升级是配置)
    # ln -s /opt/lnmp/nginx-1.19.6/ /opt/lnmp/nginx
  2. 加入环境变量
    # echo 'export PATH=/opt/lnmp/nginx/sbin/:$PATH' >> /etc/profile
  3. 测试

    # source /etc/profile
    # nginx -v
    nginx version: nginx/1.19.6
  4. 启动
    # nginx
  5. Nginx 其他命令

    • 检查配置文件语法是否有错:nginx -t
    • 重新载入配置文件:nginx -s reload
    • 重启 Nginx:nginx -s reopen
    • 停止 Nginx:nginx -s stop

2. 使用systemd管理Nginx服务

  1. 在系统服务目录里创建nginx.service文件

    # vi /usr/lib/systemd/system/nginx.service
    # cat /usr/lib/systemd/system/nginx.service 
    [Unit]
    Description=nginx - high performance web server
    After=network.target remote-fs.target nss-lookup.target
    
    [Service]
    Type=forking
    ExecStart=/opt/lnmp/nginx/sbin/nginx
    ExecReload=/opt/lnmp/nginx/sbin/nginx -s reload
    ExecStop=/opt/lnmp/nginx/sbin/nginx -s quit
    PrivateTmp=true
    
    [Install]
    WantedBy=multi-user.target
  2. 使用systemctl命令管理Nginx服务

    # systemctl start nginx   //启动Nginx服务,注意如果执行nginx命令启动了服务,需停止nginx -s stop停止后执行此命令,否则报错
    # systemctl status nginx      //查询nginx服务状态
    ● nginx.service - nginx - high performance web server
       Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
       Active: active (running) since Wed 2021-01-20 14:57:25 CST; 1s ago
      Process: 5090 ExecStart=/opt/lnmp/nginx/sbin/nginx (code=exited, status=0/SUCCESS)
     Main PID: 5091 (nginx)
       CGroup: /system.slice/nginx.service
               ├─5091 nginx: master process /opt/lnmp/nginx/sbin/nginx
               └─5092 nginx: worker process
    
    Jan 20 14:57:25 localhost.localdomain systemd[1]: Starting nginx - high performance web server...
    Jan 20 14:57:25 localhost.localdomain systemd[1]: Started nginx - high performance web server.
    
    # systemctl stop nginx       //停止Nginx服务
    # systemctl enable nginx      //开机自启动Nginx服务
    # systemctl disable nginx    //关闭开启自启动Nginx服务

Nginx配置

Nginx 基础配置

1. Nginx主配置文件

  1. 配置nginx的主配置文件nginx.conf,虚拟主机既可以配置在nginx.conf文件,也可以通过”include“参数指定到某个目录,这里配置为指定到其他目录的方式配置,此方式对于多站点的管理比较方便,且配置文件结构更简单。

    [root@node1 ~]# cat /opt/lnmp/nginx/conf/nginx.conf
    # Nginx用户及用户组。window下不指定
    user nginx nginx ;
    
    # 工作进程:数目。根据硬件调整,通常等于CPU数量或者2倍于CPU。
    worker_processes 8;
    
    # 错误日志:存放路径。
    error_log  /var/log/nginx/error.log;
    error_log  /var/log/nginx/error.log  notice;
    error_log  /var/log/nginx/error.log  info;
    
    # pid(进程标识符):存放路径。
    pid logs/nginx.pid;
    
    events
    {
        # 使用epoll的I/O 模型。linux建议epoll,FreeBSD建议采用kqueue,window下不指定。
        use epoll;
    
        # 工作进程的最大连接数量。根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为:worker_processes*worker_connections
        worker_connections 20480;
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        #access_log  logs/access.log  main;
        access_log  /var/log/nginx/access.log main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        #keepalive_timeout  0;
        keepalive_timeout  65;
    
        gzip  on;
    
        #所有的虚拟主机配置文件全部放在./vHost目录,注意这里的相对路径是nginx.conf配置文件所在的目录
        include vHost/*.conf;
    }
  2. 补充说明:
    与apache相似,nginx针对不同的操作系统,有不同的事件模型

    • 标准事件模型
      Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或poll
    • 高效事件模型
      • Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X。使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。
      • Epoll:使用于Linux内核2.6版本及以后的系统。
      • Eventport:使用于Solaris 10。 为了防止出现内核崩溃的问题, 有必要安装安全补丁。

2. Nginx配置虚拟主机

虚拟主机,也叫“网站空间”,就是把一台运行Nginx的主机划分成多个“虚拟”服务器,一个虚拟主机可以运行一个网站。

  • Nginx配置虚拟主机支持3种方式:
    1. 基于IP的虚拟主机
    2. 基于端口的虚拟主机
    3. 基于域名的虚拟主机
  1. 这里配置一个虚拟主机,配置文件为/opt/lnmp/nginx/conf/vHost/www.test.com.conf

    [root@node1 ~]# cat /opt/lnmp/nginx/conf/vHost/www.test.com.conf
    server {
        listen       80;
        server_name  192.168.1.129;
        # 访问日志
        access_log  /var/log/nginx/www.test.com.access.log  main;
    
        location / {
            # 虚拟主机root目录,及网站程序的放置目录
            root   /data/webapps/test/;
            index  index.html index.htm;
        }
    
        #error_page  404              /404.html;
    
        # redirect server error pages to the static page /50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
             root  /data/webapps/test/;
        }
    }
  2. 放置网站程序到虚拟主机root目录

    1. 创建虚拟主机的root目录
    # mkdir /data/webapps/test/
    2. 拷贝nginx自带的网站测试程序到虚拟主机的root目录
    # cp /opt/lnmp/nginx-1.19.6/html/* /data/webapps/test/
    3. 调整权限
    # chown -R nginx:nginx /data/webapps/

3. 使更改后的配置文件生效

  1. 检查配置文件语法是否有错
    # nginx -t
  2. 重新载入配置文件
    # nginx -s reload
  3. 也可以重启nginx服务(非特殊情况不推荐使用)
  4. 有防火墙的请开通80端口或关闭防火墙,包括系统防火墙和物理防火墙

4. 测试

  1. 不想截图,就通过curl命令测试啦

    # curl http://192.168.1.129
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
        body {
            width: 35em;
            margin: 0 auto;
            font-family: Tahoma, Verdana, Arial, sans-serif;
        }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>

Nginx 配置 https

1.创建 SSL 证书

  1. 创建存放ssl证书的目录
    # mkdir /etc/ssl/nginx
  2. 创建了有效期10年,加密强度为RSA2048的SSL密钥key和X509证书文件,证书信息可以随便填或者留空,只有Common Name要根据你的域名或ip填写。如xxx.com,或使用*.xxx.com匹配二级域名。
    # openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/nginx/nginx.key -out /etc/ssl/nginx/nginx.crt
    Generating a 2048 bit RSA private key
    ...................................+++
    writing new private key to '/etc/ssl/nginx/nginx.key'
    -----
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [XX]:CN
    State or Province Name (full name) []:Beijin
    Locality Name (eg, city) [Default City]:Beijin
    Organization Name (eg, company) [Default Company Ltd]:test
    Organizational Unit Name (eg, section) []:test
    Common Name (eg, your name or your server's hostname) []:192.168.1.129                   
    Email Address []:test@msn.com
    • 参数说明:
    • req: 配置参数-x509指定使用 X.509证书签名请求管理(certificate signing request (CSR))."X.509" 是一个公钥代表that SSL and TLS adheres to for its key and certificate management.
    • -nodes: 告诉OpenSSL生产证书时忽略密码环节.(因为我们需要Nginx自动读取这个文件,而不是以用户交互的形式)。
    • -days 3650: 证书有效期,10年
    • -newkey rsa:2048: 同时产生一个新证书和一个新的SSL key(加密强度为RSA 2048)
    • -keyout:SSL输出文件名
    • -out:证书生成文件名

2. 配置Nginx使用SSL

  1. 创建虚拟主机配置文件: /opt/lnmp/nginx/conf/vHost/www.https.com.conf

    # cat /opt/lnmp/nginx/conf/vHost/www.https.com.conf
    # HTTPS server
    server {
        listen       443 ssl;
        server_name  192.168.1.129;
    
        access_log  /var/log/nginx/www.https.com.access.log;
    
        ssl_certificate      /etc/ssl/nginx/nginx.crt;
        ssl_certificate_key  /etc/ssl/nginx/nginx.key;
    
        # ssl_session_cache    shared:SSL:1m;
        # ssl_session_timeout  5m;
    
        # ssl_ciphers  HIGH:!aNULL:!MD5;
        # ssl_prefer_server_ciphers  on;
    
        location / {
            root   /data/webapps/https/;
            index  index.html index.htm index.php;
        }
    }
  2. 放置网站程序到虚拟主机root目录

    1. 创建虚拟主机的root目录
    # mkdir /data/webapps/https/
    2. 编写测试程序到虚拟主机的root目录
    # # echo '<html><h1>nginx https test!</h1></html>' > /data/webapps/https/index.html
    3. 调整权限
    # chown -R nginx:nginx /data/webapps/https/

3. 使更改后的配置文件生效

  1. 检查配置文件语法是否有错
    # nginx -t
  2. 重新载入配置文件
    # nginx -s reload
  3. 有防火墙的请开通443端口或关闭防火墙,包括系统防火墙和物理防火墙

4. 测试

  1. 通过curl命令测试

    # curl -k https://192.168.1.129
    <html><h1>nginx https test!</h1></html>
    
    -k:允许curl使用非安全的ssl连接并且传输数据

FAQ's

编译安装FAQ's

Q1: 故障1

  • 问题描述:执行./configure时报如下错误:
    ./configure: error: the HTTP image filter module requires the GD library.
    You can either do not enable the module or install the libraries.
  • 问题原因:
    http_image_filter_module是nginx提供的集成图片处理模块,需要gd-devel的支持
  • 问题解决:安装gd-devel
    # yum install -y gd-devel

Q2: 故障2

  • 问题描述:执行./configure时报如下错误:
    /configure: error: the HTTP rewrite module requires the PCRE library.
  • 问题原因:缺少PCRE Library
  • 问题解决:安装pcre
    # yum -y install pcre pcre-devel

Q3: 故障3

  • 问题描述:执行./configure时报如下错误:
    ./configure: error: the HTTP cache module requires md5 functions from OpenSSL library.   You can either disable the module by using --without-http-cache option, or install the OpenSSL library into the system,or build the OpenSSL library statically from the source with nginx by using --with-http_ssl_module --with-openssl=<path> options.
  • 问题原因:缺少ssl错误
  • 问题解决:安装openssl
    # yum -y install openssl openssl-devel

Q4: 故障4

  • 问题描述:执行./configure时报如下错误:
    ./configure: error: C compiler cc is not found
  • 问题原因:缺少编译器
  • 问题解决:安装gcc、gcc-c++
    # yum -y install gcc gcc-c++ autoconf automake

Q5: 故障5

  • 问题描述:执行./configure时报如下错误:
    ./configure: error: the HTTP gzip module requires the zlib library.
    You can either disable the module by using –without-http_gzip_module option, or install the zlib library into the system, or build the zlib library statically from the source with nginx by using –with-zlib=<path> option.
  • 问题原因:缺少zlib包
  • 问题解决:安装zlib
    # yum install -y zlib-devel

Q6: 故障6

  • 问题描述:执行./configure时报如下错误:
    ./configure: error: the HTTP XSLT module requires the libxml2/libxslt libraries.
    You can either do not enable the module or install the libraries.
  • 问题原因:缺少libxml2
  • 问题解决:
    # yum install -y libxml2 libxml2-devel libxslt-devel

Q7: 故障7

  • 问题描述:执行./configure时报如下错误:
    ./configure: error: perl module ExtUtils::Embed is required
  • 问题原因:缺少ExtUtils
  • 问题解决:
    # yum -y install perl-devel perl-ExtUtils-Embed

Q8: 故障8

  • 问题描述:执行./configure时报如下错误:
    ./configure: error: the GeoIP module requires the GeoIP library.
    You can either do not enable the module or install the library.
  • 问题原因:缺少GeoIP
  • 问题解决:
    # yum -y install GeoIP GeoIP-devel GeoIP-data

配置FAQ's

Q1: nginx网站服务器不显示图片

  • 解决办法
    在相应的虚拟主机配置文件,加入:

    location ~* ^.+\.(jpg|jpeg|gif|png|bmp)$ {
    access_log off;
    root /xxx/xxx          #此处为您的网站路径;
    expires 30d;
    break;
    }

微信扫一扫,分享到朋友圈

LNMP网站服务器架构(一)之Nginx部署
0
别把想做的事情,留给遥不可及的未来!
下一篇

《金字塔原理》读书笔记

发表评论

您的电子邮件地址不会被公开。 必填项已用 * 标注

提示:点击验证后方可评论!

插入图片
返回顶部