LNMP环境搭建(二):Nginx

houjinkai 2019-06-29

安装

依赖安装

  • 安装依赖
[root@localhost ~]# yum -y install gcc
    [root@localhost ~]# yum -y install gcc++
    [root@localhost ~]# yum -y install gcc-c++
    [root@localhost ~]# yum -y install wget
    [root@localhost ~]# yum -y install make
    [root@localhost ~]# yum -y install libxml2 
    [root@localhost ~]# yum -y install libxml2-devel 
    [root@localhost ~]# yum -y install openssl 
    [root@localhost ~]# yum -y install openssl-devel 
    [root@localhost ~]# yum -y install curl-devel 
    [root@localhost ~]# yum -y install libjpeg-devel 
    [root@localhost ~]# yum -y install libpng-devel
    [root@localhost ~]# yum -y install freetype-devel
    [root@localhost ~]# yum -y install bison
    [root@localhost ~]# yum -y install autoconf
    [root@localhost ~]# yum -y install automake
    [root@localhost ~]# yum -y install libtool
    [root@localhost ~]# yum -y install cmake
    [root@localhost ~]# yum -y install zlib
    [root@localhost ~]# yum -y install zlib-devel
    [root@localhost ~]# yum -y install pcre-devel
  • 下载并解压

Nginx官网选择稳定版下载

[root@localhost ~]# wget http://211.143.146.219:82/1Q2W3E4R5T6Y7U8I9O0P1Z2X3C4V5B/nginx.org/download/nginx-1.14.1.tar.gz
    [root@localhost ~]# tar -zxvf nginx-1.14.1.tar.gz
  • 在解压的目录下配置、编译安装
[root@localhost ~]# ./configure \
    [root@localhost ~]# --prefix=/usr/local/nginx \
    [root@localhost ~]# --with-http_stub_status_module \
    [root@localhost ~]# --with-http_ssl_module \
    [root@localhost ~]# --with-pcre \
    [root@localhost ~]# --with-stream \
    [root@localhost ~]# --with-mail=dynamic
[root@localhost ~]# make && make install
  • 启动nginx服务、查看进程
[root@localhost ~]# /usr/local/nginx/sbin/nginx
    [root@localhost ~]# ps -ef | grep nginx

配置

用户管理

  • 新建 Nginx 用户和用户组,为 Nginx 用户添加密码并设置为不可登录服务器
我们创建一个新的用户和用户组来运行nginx,这样可以把nginx和root分开,保证nginx不具备root权限。但是,我们并不希望nginx成为一个真实的可以登陆到远程进行操作的用户,所以,指定登录 shell 为 nologin
> -r: 添加系统用户

    > -g: 指定要创建的用户所属组

    > -s: 新帐户的登录shell

    > -d: 新帐户的主目录

    > -M: 不要创建用户的主目录
[root@centos7 ~]# groupadd -r nginx
    [root@centos7 ~]# useradd -r -g nginx -M nginx
    [root@centos7 ~]# passwd nginx
    [root@centos7 ~]# usermod -s /sbin/nologin nginx

基本操作

  • 创建链接
环境变量:输入命令的时候LINUX会去查找PATH里面记录的路径
[root@localhost ~]# echo $PATH
    
    [root@localhost ~]# ln -s  /usr/local/nginx/sbin/nginx /usr/local/sbin/

在环境变量:/usr/local/sbin/ 下创建 /usr/local/nginx/sbin/nginx 的软连接,当我们在任意目录输入 nginx 时,系统去环境变量中查找,通过软连接指向 /usr/local/nginx/sbin/nginx

  • 基本操作

检查配置文件是否正确、查看编译选项、启动、关闭、指定配置文件启动、重启、杀死进程

[root@centos7 /]# /usr/local/nginx/sbin/nginx -t
    [root@centos7 /]# /usr/local/nginx/sbin/nginx -V
    [root@centos7 /]# /usr/local/nginx/sbin/nginx
    [root@centos7 /]# /usr/local/nginx/sbin/nginx -s stop
    [root@centos7 /]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
    [root@centos7 /]# /usr/local/nginx/sbin/nginx -s reload
    [root@centos7 /]# pkill nginx

设置自启

  • Systemd 设置自动启动

具体文法参考:Systemd 入门教程:实战篇

[root@centos7 /]# vim /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=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
    ExecReload=/usr/local/nginx/sbin/nginx -s reload
    ExecStop=/usr/local/nginx/sbin/nginx -s stop

    [Install]
    WantedBy=multi-user.target

启动 nginx,设置 nginx 自动启动

[root@centos7 /]# systemctl start nginx
    [root@centos7 /]# systemctl enable nginx

当下面的端口占用错误时,可以尝试终止进程再次启动

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
[root@centos7 /]# netstat -ntpl
    [root@centos7 /]# kill 31448

配置

参考文章:
基本功能介绍
配置文件详解
配置功能解释
Nginx 常用配置

配置文件

  • 配置文件介绍

Nginx配置文件主要分成如下四部分:

  • 全局设置(main):影响其它所有部分的设置;
  • 主机设置(server):主要用于指定虚拟主机域名、IP和端口;
  • 上游服务器设置(upstream):主要为反向代理、负载均衡相关配置;
  • 匹配特定URI设置(location):用于匹配网页位置,,例如:根目录 "/"。

Nginx配置文件四个部分间的层级关系:

  • server 继承 main,
  • location 继承 server;
  • upstream 既不会继承指令也不会被继承。它有自己的特殊指令,不需要在其他地方的应用。
  • Server
接收请求的服务器需要将不同的请求按规则转发到不同的后端服务器上,在 nginx中我们可以通过构建虚拟主机(server)的概念来将这些不同的服务配置隔离。
server {
    listen       80;
    server_name  www.sea.com;
    root         html;
    index        index.php index.html index.htm;
}

修改 linux 的 hosts 创建本地虚拟域名

[root@centos7 /]# vim /etc/hosts
    
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    127.0.0.1   www.sea.com www.star.com

访问测试

[root@centos7 /]# curl www.sea.com

本系统是在 Windows 下的虚拟机,所以也得修改 Windows 的 hosts 使在 Windows 下访问目标时 IP 会指向虚拟机

192.168.108.128   www.sea.com
    192.168.108.128   www.star.com
  • Location
每个 url 请求都会对应的一个服务,nginx 进行处理转发或者是本地的一个文件路径,或者是其他服务器的一个服务路径。而这个路径的匹配是通过 location 来进行的。我们可以将 server 当做对应一个域名进行的配置,而 location 是在一个域名下对更精细的路径进行配置。
  • location 匹配规则
=     表示进行普通字符精确匹配
    ~     表示执行一个正则匹配,区分大小写
    ~*    表示执行一个正则匹配,不区分大小写
    ^~    表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录

配置实战

  • 配置一个本地项目

修改目标 Server 的 根目录到项目目录下,即:/usr/local/www/sea

Nginx本身不支持PHP等语言,但是它可以通过FastCGI来将请求扔给某些语言或框架处理(例如PHP、Perl)
server {
        listen       80;
        server_name  www.sea.com;
        root         /usr/local/www/sea;
        location / {
                index  index.html index.htm index.php;
            }
        location ~ \.php(.*)$ {
                fastcgi_pass             127.0.0.1:9000;
                fastcgi_index            index.php;
                fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
                fastcgi_param            SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                fastcgi_param            PATH_INFO        $fastcgi_path_info;
                fastcgi_param            PATH_TRANSLATED  $document_root$fastcgi_path_info;
                include                  fastcgi_params;
            }
}

PHP-FPM 是 PHP 的一个 FastCGI 管理器,配置中将 .php 结尾的请求通过 FashCGI 交给 PHP-FPM 处理

以下是对 ThinkPHP 的 URL 重写,隐藏应用的入口文件 index.php,这是对低版本 Nginx 不支持 PATHINFO 的解决方法

location / {
                index  index.html index.htm index.php;
                if (!-e $request_filename) 
                {
                   rewrite ^(.*)$ /index.php?s=/$1 last;
                   break;
                }
            }

当前 Nginx 已能支持 PATHINFO

  • 多站点配置——虚拟主机

服务器上放置多个网站项目,它们共同使用 80 端口,根据 HTTP 协议报文表头信息的 Host 来区分不同的 Server

server {
        listen 80;
        server_name www.sea.com;
        root   /usr/local/www/sea;
        location / {
            index  index.html index.htm;
        }

    }
    server {
        listen 80;
        server_name www.star.com;
        root   /usr/local/www/sea;
        location / {
            index  index.html index.htm;
        }

    }
  • 参数介绍
# 使用指定配置文件
nginx -c /usr/local/nginx/conf/nginx.conf

# 测试配置文件是否正确
nginx -t

# 重载配置
nginx -s reload

# 停止
nginx -s stop

域名解析

阿里云域名解析不通

ping www.sea.com

# Ping 请求找不到主机 http://banjintaohua.online/。请检查该名称,然后重试。

# Windows
nslookup www.sea.com

# 服务器:  UnKnown
# Address:  fe80::1

# DNS request timed out.
#     timeout was 2 seconds.
# DNS request timed out.
#     timeout was 2 seconds.
# *** 没有 www.sea.com 可以使用的 internal type for both IPv4 and IPv6 Addresses (A+AAAA)记录

# Linux
dig www.sea.com

# ; <<>> DiG 9.10.4-P2 <<>> www.sea.com
# ;; global options: +cmd
# ;; Got answer:
# ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32759
# ;; flags: qr rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
# ;; WARNING: recursion requested but not available

# ;; QUESTION SECTION:
# ;www.sea.com.    IN    A

# ;; ANSWER SECTION:
# www.sea.com. 128 IN    A    42.123.125.237

# ;; Query time: 159 msec
# ;; SERVER: 218.85.152.99#53(218.85.152.99)
# ;; WHEN: Tue Dec 11 13:31:56 CST 2018
# ;; MSG SIZE  rcvd: 61

# 刷新DNS缓存
# Windows
ipconfig/flushdns

# 刷新DNS缓存
# Centos7
systemctl restart nscd

提工单,原来是:解析线路的问题,我使用了[解析路线:谷歌],也就意味着只有谷歌源IP才可以解析到,更改为[解析路线:默认]就好了

概念

代理概念

  • 正向代理
正向代理是代理客户端,为客户端收发请求,使真实客户端对服务器不可见。例如 VPN 翻墙
  • 反向代理
反向代理是代理服务器端,为服务器收发请求,使真实服务器对客户端不可见。例如 CDN、负载均衡

转发到 www.sea.com 的 8080 端口

server {
        listen 80;
        location / {
            proxy_pass http://www.sea.com:8080; # 应用服务器HTTP地址
        }
    }

负载均衡

  • 负载均衡
负载均衡的意义在于能让所有节点以最小的代价对外提供服务,这样系统吞吐量最大、性能更高、用户请求时间更小
负载均衡算法有:哈希法、轮询法等
负载均衡可以用来实现服务的动静分离等

哈希法:每个请求按访问 IP 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题

upstream loadbalance {
        ip_hash;                 # 哈希法
        server 192.168.0.1:8080; # 应用服务器1
        server 192.168.0.2:8080; # 应用服务器2
    }
    server {
        listen 80;
        location / {
            proxy_pass http://loadbalance;
        }
    }

----------------------------------------------------------DONE------------------------------------------------------------

相关文章

LNMP环境搭建(一):Mysql
LNMP环境搭建(二):Nginx
LNMP环境搭建(三):PHP

相关推荐