首页 > Server > CentOS 7上安装Nginx 1.8.1 详解
2016
03-07

CentOS 7上安装Nginx 1.8.1 详解

一、简介:轻量级HTTP服务器Nginx

安装文件只有几百k,占用内在资源非常少,采用静态编译的方式,启动后就加载所编译模块,每个模块都可能去处理某个请求,但同一个处理请求只能由一个模块来完成。
选择Nginx的6大理由:(相对于apache)

1、作为web代理服务器,Nginx处理静态内容的效率非常高(如静态文件及索引等)
2、作为代理服务器,它可实现无缓存反代加速,提高站点的运行速度
3、作为负载均衡器,它工作于7层(用户空间),可在内部直接支持Rails和php,也可以支持HTTP代理服务器对外进行服务,以及简单容错和利用算法进行负载均衡。
4、专为性能而开发,采用poll模型,可以支持更多 的并发数,最大对50000个并发做出响应,占用很低的内存
5、稳定性,由于 采取了分阶段资源分配技术,使CPU与内存占用极低,保持10000个活动连接,只占用2.5M内存,DOS攻击对它根本不起作用
6、高可用性,支持热部署,启动迅速,可不间断重载,无需重启服务,可做到7×24小时不间断动作。

知识点:poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,如果设备就绪则在设备等待队列中加入一项并继续遍历,如果遍历完所有fd后没有发现就绪设备,则挂起当前进程,直到设备就绪或者主动超时,被唤醒后它又要再次遍历fd。这个过程经历了多次无谓的遍历。

二、工作原理

Nginx由内核和模块组成,其中,内核设计非常微小而简洁,完成的工作也非常简单,它通过查找配置文件将客户端的请求映射到一个location block(location是nginx配置中的
一个指令,用于URL匹配),而在这个location中所配置的每个指令将启动不同的模块去完成相应的工作。

三、nginx的模块

1、从结构分类

核心模块:HTTP模块、EVENT模块、MAIL模块等
基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块、HTTP Rewrite模块等
第三方模块:HTTP Upstream Request Hash模块、Notice模块、HTTP Access Key模块以及用户自定义开发的模块等

2、从功能分类

Handlers(处理器模块):直接处理请求,并进行输出内容和修改headers信息,此模块一般只能有一个。
Filters(过滤器模块):对其他处理器模块输出的内容进行修改,最后由nginx输出。
Proxies(代理类模块):它是Nginx的HTTP Upstream ,并与后端一些服务进行交互,实现服务代理和负载均衡等功能(如:FastCGI)

四、Nginx的两种工作模式

1、单工作进程:

在单工作进程模式下,除主进程外,不有一个工作进程,工作进程是单线程的(nginx的默认工作模式)。

2、多工作进程:

每个工作进程包含多个线程。

五、安装Nginx

1、系统环境:CentOS 7

基本的开发包组必须安装,这是搭建服务的必要基础
开发环境包组:Development Tools, Server Platform Development
开发程序包:pcre-devel
确保防火墙和SeLinux不会成为配置障碍(如果有必要开启防火墙,请配置服务正常后,在添加相应规则)
[root@www ~]# systemctl stop firewalld
[root@www ~]# getenforce
Disabled
确保80端口没被占用
[root@www ~]# ss -tunl | grep 80 # 没有显示,说明80端口没开启
准备两台测试服务器:
静态测试服务器:172.16.38.4
php-fpm服务器:172.16.38.4

2、Nginx服务器:172.16.38.8
这是为了实验需要,自己定义的。

3、创建Nginx用户及组
[root@www ~]# useradd -r nginx
[root@www ~]# cat /etc/passwd
nginx:x:487:487::/home/nginx:/bin/bash

4、配置Nginx的仓库(源)
[root@www ~]# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/ # 其中Centos和后面的7可以更改,如果是Fedora,改了就是
gpgcheck=0
enabled=1

5、安装Nginx程序
自动解决依赖问题,用得上的模块都已经加载
  (1)、先查看YUM源仓库nginx默认支持Centos7 的最新版本
[root@www ~]# yum info nginx
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Installed Packages
Name : nginx
Arch : x86_64
Epoch : 1
Version : 1.8.1
Release : 1.el7.ngx
Size : 897 k
Repo : installed
From repo : nginx
Summary : High performance web server
URL : http://nginx.org/
License : 2-clause BSD-like license
Description : nginx [engine x] is an HTTP and reverse proxy server, as well as
: a mail proxy server.

      (2)、执行安装
[root@www nginx]# yum install nginx

      (3)、查看nginx安装后所生成的文件 (下面是我们注意的部分目录及文件)
[root@www ~]# rpm -ql nginx
/etc/nginx
/etc/nginx/conf.d/default.conf
/etc/nginx/conf.d/example_ssl.conf
/etc/nginx/fastcgi_params
/etc/nginx/nginx.conf                                              # 主配置文件
/usr/lib/systemd/system/nginx.service                    #重要的systemd服务启动文件,要给执行权限
/usr/share/nginx/html                                             # 网站目录
/usr/share/nginx/html/50x.html                             # 错误页面
/usr/share/nginx/html/index.html                          # 默认主页
/var/cache/nginx
/var/log/nginx

6、systemd启动文件,不用修改
/usr/lib/systemd/system/nginx.service
  (1)、给执行权限
[root@www ~]# chmod +x /usr/lib/systemd/system/nginx.service

(2)、启动服务,并加入开机启动
[root@www ~]# systemctl start nginx.service
[root@www ~]# systemctl enable nginx.service

  (3)、查看启动是否正常
[root@www ~]# ps -aux | grep nginx
root 3603 0.0 0.1 47556 1132 ? Ss 23:15 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 3604 0.0 8.5 132032 85832 ? S 23:15 0:00 nginx: worker process
nginx 3605 0.0 8.5 132032 86092 ? S 23:15 0:00 nginx: worker process
注:上面没有改的默认配置文件 ,是一个主进程,两个子进程,是采用event事件驱动模型

  (4)、查看客户端

CentOS 7上安装Nginx 1.8.1 详解 - 第1张  | 运维手册

  以上一切正常了!这只是万里长城第一步。。。。。重点在后面的具体配置

===========================================================================================================================

六、配置Nginx

CentOS 7上安装Nginx 1.8.1 详解 - 第2张  | 运维手册

1、主配置文件结构介绍
(1)配置文件 路径:/etc/nginx/nginx.conf

(2)配置文件的组成部分
1)、main(全局配置):本字段配置将影响其他所有设置。
2)、server(主机设置):主要用于指定主机和端口。
3)、upstream(负载均衡):用于负载均衡,设置一系列的后端服务器。
4)、location(URL匹配位置):部分用于匹配网页URL位置。

  (3)四个字段的关系如下 :
main(被下级继承)——–>server(被下级继承)———>location
upstream即不会继承其他设置也不会被继承。

2、main:全局配置段
user nginx;                                                      # 指定以什么用户及用户组运行
worker_processes 2;                                        # 指定开启nginx的进程数,每个进程消耗10~12M内存,建议与CPU物理核心数对应
worker_rlimit_nofile 204800;                           # 一个nginx进程可以打开的最多文件描述符数目

error_log /var/log/nginx/error.log warn;         # 指定全局错误日志文件(级别可以是:debug|notice|warn|error|crit)分别对应报警级别
pid /var/run/nginx.pid;                                   # 指定进程id的存储文件位置

events {                                                           # 指定nginx的工作模式及连接上限
worker_connections 1024;                              # 指定nginx每个进程的最大并发连接数 (反代时,最大客户端口连接数=进程数*最大连接数/4)
}

3、HTTP:WEB服务器相关配置

=========================#设置HTTP服务器====================================================
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;                      #访问日志路径及级别

sendfile on;                                                      #开启高效文件传输模式
tcp_nopush on;                                                #一个数据包发送所有头文件,而不是一个接着一个发送

keepalive_timeout 65;                                     #设置客户端保持活动连接超时时间,超过时间服务器会自动关闭连接

gzip on;                                                          #开启gzip压缩

=========================#这个是静态页面====================================================
server {
listen 172.16.38.8:80;
server_name nginx www.nginx.com;                                                    #绑定主机名、域名或IP地址
add_header X-via 172.16.38.8;                                                            #让客户端能够看到代理服务器的IP(可选)
access_log logs/nginx.access.log main;                                               #访问日志文件路径及级别、静态文件,nginx自己处理
location ~ ^/(images|javascript.|js|css|flash|media|static)/ {                #匹配的文件路径各
root /web/blog;                                                                                   #虚拟主机网站存放的根目录
expires 30d;                                                                                        #过期30天,静态文件不怎么更新,过期可以设大一点,如果频繁更新,则可以设置得小一点。

# 静态location设置
location / {
root   /web/blog;                                                                  #虚拟主机网站存放的根目录
index index.php index.html index.htm;                                #指定客户端口用户访问的首页地址
}

location ~ .(jpg|jpeg|png|gif|js|css)$ {                                  #匹配静态内容的类型
root   /web/blog;                                                                  #虚拟主机网站存放的根目录
}

=========================#这个是错误页面====================================================

error_page 404 /404.html;                                                            #这里可以指定各位错误信息的返回页面,也可以自定义
                                                                                                     (但大小一定要超过512KB,否则浏览器会自动替换为默认的对应错误页面)
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;

location = /50x.html {
root html;
}

================#代理PHP脚本到Apache侦听后端web服务器===========================================
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
# location ~ .php$ {                                                            #匹配动态内容
# proxy_pass http://127.0.0.1;                                          #代理的后端web服务器
# }

================#PHP脚本请求全部转发至FastCGI处理,使用FastCGI默认配置(监听进程)=========================
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
# 动态location设置
location ~ .php$ {                                                                #匹配动态内容
root                /web/blog;                                                   #虚拟主机网站存放的根目录
fastcgi_pass        172.16.38.4:9000;                                   #代理到的服务器(开放的FastCGI)
fastcgi_index       index.php;                                               #指定客户端口用户访问的首页地址
fastcgi_param       SCRIPT_FILENAME /web/blog$fastcgi_script_name;                           # 此处没有配置目录会出现:FastCGI sent in stderr: “Primary script unknown”
include             fastcgi_params;                                           #调用的FastCGI参数模块
}

CentOS 7上安装Nginx 1.8.1 详解 - 第3张  | 运维手册
       注:#把请求转发给后台web服务器,反向代理和fastcgi的区别是,反向代理后面是web服务器,fastcgi后台是fasstcgi监听进程,当然,协议也不一样
如果有多个一都能匹配到,就从上到下依次检查,以先匹配的为主

=================================#获取Nginx工作状态=====================================
# 配置nginx状态页面在server字段内
location /nginxstatus {                                                                   #指定管理接口页面
stub_status on;                                                                              #启用工作状态统计功能
access_log /var/log/nginx/nginxstatus.log;                                  #指定访问日志文件
auth_basic “nginxstatus”;                                                              #认证机制
auth_basic_user_file /etc/nginx/htpasswd;                                   #认证的密码文件 (需要通过下列方式生成——–在nginx上)
}

注:创建认证文件并添加用户
单独安装htpasswd(因为nginx环境下没有安装php,所以就要单独安装,此工具包还包括:ab,htdbm,htdigest,htpasswd,httxt2dbm,logresolve)
[root@www ~]# yum install -y httpd-tools
创建口令
[root@www ~]# htpasswd -c /etc/nginx/htpasswd admin
New password:
Re-type new password:
Adding password for user admin

CentOS 7上安装Nginx 1.8.1 详解 - 第4张  | 运维手册

=================================#禁止访问.htaccess文件=====================================
# deny access to .htaccess files, if Apache’s document root
# concurs with nginx’s one
#location ~ /.ht {
# deny all;
#}
}

=============================================#配置虚拟主机基于IP、hostname、端口===================
# another virtual host using mix of IP-, name-, and port-based configuration
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;

# location / {
# root html;
# index index.html index.htm;
# }
#}

=======================#设置HTTPS服务器====要搭建CA服务器才行==========如果是大企业有公用CA就不用==========
# HTTPS server
#server {
# listen 443 ssl;
# server_name localhost;

# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;

# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;

# ssl_ciphers HIGH:!aNULL:!MD5;

注:nginx 日志报错如下:[error] 6654#0: *67 upstream prematurely closed connection while reading response header from upstream, client: 172.16.38.1, server: www.nginx.com, request: “GET /index.php HTTP/1.1”, upstream: “fastcgi://172.16.38.4:9000”, host: “www.nginx.com”

此问题是由于php服务器/etc/php-fpm.d/www.conf中listen = 127.0.0.1:9000 设置为本地了,将其改为listen = 172.16.38.4:9000

注:nginx 日志报错如下:[error] 6654#0: *55 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 172.16.38.1, server: www.nginx.com, request: “GET /index.php HTTP/1.1”, upstream: “fastcgi://172.16.38.4:9000”, host: “www.nginx.com”
此问题是由于php服务器/etc/php-fpm.d/www.conf中listen.allowed_clients = 127.0.0.1打开了,注释掉就行

CentOS 7上安装Nginx 1.8.1 详解 - 第5张  | 运维手册

上面两种错误,客户端都会报502错误。还有注意语法格式,必须以“;”号结尾,配置时养成好习惯:写注释,用nginx -t测试命令。

最后编辑:
作者:李国庆
这个作者貌似有点懒,什么都没有留下。
捐 赠如果您觉得这篇文章有用处,请支持作者!鼓励作者写出更好更多的文章!

留下一个回复

你的email不会被公开。