nginx(发音同engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。
nginx的特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
多个客户端给服务器发送的请求,Nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时~请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,Nginx扮演的就是一个反向代理角色。
客户端是无感知代理的存在的,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。
反向代理,“它代理的是服务端”,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。
//创建系统用户nginx
[root@xaii ~]# groupadd -r nginx
[root@xaii ~]# useradd -r -M -s /sbin/nologin -g nginx nginx
//安装依赖环境
[root@xaii ~]# yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++
暗转过程省略......
[root@xaii ~]# yum -y groups mark install 'Development Tools'
安装过程省略......
//创建日志存放目录
[root@xaii ~]# mkdir -p /var/log/nginx
[root@xaii ~]# chown -R nginx.nginx /var/log/nginx/
//下载nginx,下载过程省略,存放至/usr/src目录下
[root@xaii src]# wget http://nginx.org/download/nginx-1.12.0.tar.gz
[root@xaii ~]# ls /usr/src/ |grep nginx
nginx-1.12.0.tar.gz
//编译安装nginx
[root@xaii src]# tar xf nginx-1.12.0.tar.gz
[root@xaii src]# cd nginx-1.12.0
[root@xaii nginx-1.12.0]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-debug \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_image_filter_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log
//安装过程省略....
[root@xaii nginx-1.12.0]# make -j $(grep 'processor' /proc/cpuinfo | wc -l) && make install
//-j是指定多少内核
//过程省略......
//添加环境变量
[root@xaii ~]# vim /etc/profile.d/nginx.sh
[root@xaii ~]# cat /etc/profile.d/nginx.sh
export PATH=/usr/local/nginx/sbin:$PATH
[root@xaii ~]# . /etc/profile.d/nginx.sh
//服务控制方式,使用nginx命令
-t //检查配置文件语法
[root@xaii ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
-v //输出nginx的版本
root@xaii ~]# nginx -v
nginx version: nginx/1.12.0
-c //指定配置文件的路径
需要拷贝两个文件:nginx.conf和mime.type至新的路径
[root@xaii conf]# cp -a nginx.conf /opt/nginx/
[root@xaii conf]# cp -a mime.types /opt/nginx
[root@xaii ~]# ps -ef |egrep -v 'grep'|grep nginx
root 4040 1 0 00:03 ? 00:00:00 nginx: master process nginx -c /optnginx/nginx.conf
nginx 4041 4040 0 00:03 ? 00:00:00 nginx: worker process
可以看到,现在用的配置文件为/opt/nginx/nginx.conf
-s //发送服务控制信号,可选值有{stop|quit|reopen|reload}
//nginx和apache不能同时开启
//因为apache和nginx的端口都是80,当apache服务开启时,无法开始nginx服务
[root@xaii ~]# ss -antlp|grep 80
LISTEN 0 128 :::80 :::* users:(("httpd",pid=4081,fd=4),("httpd",pid=4080,fd=4),("httpd",pid=4079,fd=4),("httpd",pid=4078,fd=4),("httpd",pid=4077,fd=4),("httpd",pid=4076,fd=4))
[root@xaii ~]# 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)
^C
//关闭apache服务,再开启nginx服务
[root@xaii ~]# apachectl stop
[root@xaii ~]# nginx
[root@xaii ~]# ss -antlp|grep 80
LISTEN 0 128 *:80 *:* users:(("nginx",pid=4069,fd=6),("nginx",pid=4068,fd=6))
#! /bin/bash
nginx=/usr/local/nginx/sbin/nginx
conf_path=/opt/nginx/nginx.conf
case $1 in
start)
$nginx -c $conf_path
if [ $? -eq 0 ];then
echo 'nginx start sucessful'
else
echo 'nginx start faild'
fi
;;
restart)
$nginx -s stop
$nginx -c $conf_path
if [ $? -eq 0 ];then
echo 'nginx restart sucessful'
else
echo 'nginx restart faild'
fi
;;
stop)
$nginx -s stop 2>/dev/null
if [ $? -eq 0 ];then
echo 'nginx is off'
else
echo 'nginx error'
fi
;;
esac
主配置文件:/usr/local/nginx/conf/nginx.conf
nginx.conf的内容分为以下几段:
支持使用变量:
user USERNAME [GROUPNAME]; //指定运行worker进程的用户和组
pid /path/to/pid_file; //指定nginx守护进程的pid文件
worker_rlimit_nofile number; //设置所有worker进程最大可以打开的文件数,默认为1024(文件系统最大打开的文件数为65535)
//此设置为nginx的配置,还需配置系统的文件
[root@nginx ~]# head -3 /usr/local/nginx/conf/nginx.conf
user nginx;(初始为nobody)
worker_processes 4;(cpu核心数)
worker_rlimit_nofile 30000;(默认为1024,最大为65535,我们设置为30000)
[root@nginx ~]# nginx -s reload
//修改系统的硬限制和软限制,都设置为最大的65535
[root@nginx ~]# vim /etc/security/limits.conf
[root@nginx ~]# tail -4 /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
# End of file
worker_rlimit_core size; //指明所有worker进程所能够使用的总体的最大核心文件大小,保持默认即可
//具体配置:
[root@nginx ~]# head /usr/local/nginx/conf/nginx.conf |grep worker_
worker_processes 4;(cpu核心数为4个)
worker_rlimit_nofile 30000;
worker_cpu_affinity 00000001 00000010 00000100 00001000;(所以这里也只能写4个)
[root@nginx ~]# nginx -s reload
accept_mutex {off|on}; //master调度用户请求至各worker进程时使用的负载均衡锁;on表示能让多个worker轮流地、序列化地去响应新请求
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
events {
worker_connections 1024;
accept_mutex on;(添加此内容)
}
lock_file file; //accept_mutex用到的互斥锁锁文件路径
pid logs/nginx.pid;
lock_file logs/nginx.lock;(添加此内容,写在event外部,顶格写)
use [epoll | rtsig | select | poll]; //指明使用的事件模型,建议让nginx自行选择
worker_connections #; //每个进程能够接受的最大连接数
events {
worker_connections 1024;
accept_mutex on;
}
注意:
worker_connections(连接数) * worker_processes(cpu核心数) <=30000
keepalive_timeout number; //长连接的超时时长,默认为65s
keepalive_timeout 65;
keepalive_requests number; //在一个长连接上所能够允许请求的最大资源数
keepalive_requests 100;(配置文件中没有设置,默认为100,看自己的业务设置)
keepalive_disable [msie6|safari|none]; //为指定类型的UserAgeng禁用长连接
tcp_nodelay on|off; //是否对长连接使用TCP_NODELAY选项,为了提升用户体验,通常设为on
tcp_nodelay on;(默认为on)
client_header_timeout number; //读取http请求报文首部的超时时长
client_body_timeout number; //读取http请求报文body部分的超时时长
send_timeout number; //发送响应报文的超时时长
LNMP:php要启用fpm模型
配置示例如下:
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000; //定义反向代理
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
nginx端:192.168.157.69
php、mysql、zabbix端:192.168.157.59
详情请看:php安装
详情请看:mysql安装
//修改配置文件并重启php服务
[root@xaii ~]# tail -2 /usr/local/php7/etc/php-fpm.conf
listen = 192.168.157.59:9000 (//添加此内容)
listen.allowed_clients = 192.168.157.69 (//添加此内容)
[root@xaii ~]# service php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm done
[root@xaii ~]# ss -antl |grep 9000
LISTEN 0 128 192.168.157.59:9000 *:*
//修改配置文件并新加载nginx服务
location / {
root html;
index index.php(//添加此内容) index.html index.htm;
}
location ~ \.php$ {
root /var/www/zabbix;(php端的zabbix目录)
fastcgi_pass 192.168.157.59:9000; (指向php端ip地址)
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
[root@nginx html]# nginx -s reload
//php端nfs配置:
[root@xaii ~]# yum -y install nfs-utils
[root@xaii ~]# systemctl start nfs
[root@xaii ~]# echo '/var/www/zabbix *(ro)' > /etc/exports
[root@xaii ~]# chmod 777 /var/www/zabbix/
[root@xaii ~]# systemctl restart nfs-server
//nginx端nfs配置,将php端zabbix目录挂载到本地的/usr/local/nginx/html/
[root@nginx ~]# yum -y install nfs-utils
[root@nginx ~]# systemctl start nfs
[root@nginx ~]# mount -t nfs 192.168.157.59:/var/www/zabbix /usr/local/nginx/html(临时挂载)
[root@nginx ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root xfs 17G 1.5G 16G 9% /
devtmpfs devtmpfs 901M 0 901M 0% /dev
tmpfs tmpfs 912M 0 912M 0% /dev/shm
tmpfs tmpfs 912M 8.6M 904M 1% /run
tmpfs tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/loop0 iso9660 3.8G 3.8G 0 100% /mnt
/dev/sda1 xfs 1014M 143M 872M 15% /boot
tmpfs tmpfs 183M 0 183M 0% /run/user/0
192.168.157.59:/usr/local/apache/htdocs/zabbix nfs4 17G 5.9G 12G 35% /usr/local/nginx/html
[root@nginx ~]# nginx -s reload
//输入192.168.157.69
//永久挂载
[root@nginx ~]# vim /etc/fstab
192.168.157.59:/var/www/zabbix /usr/local/nginx/html nfs defaults,_netdev 0 0
[root@nginx ~]# mount -a
[root@nginx ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root xfs 17G 1.5G 16G 9% /
devtmpfs devtmpfs 901M 0 901M 0% /dev
tmpfs tmpfs 912M 0 912M 0% /dev/shm
tmpfs tmpfs 912M 8.6M 904M 1% /run
tmpfs tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/loop0 iso9660 3.8G 3.8G 0 100% /mnt
/dev/sda1 xfs 1014M 143M 872M 15% /boot
tmpfs tmpfs 183M 0 183M 0% /run/user/0
192.168.157.59:/var/www/zabbix nfs4 17G 5.8G 12G 34% /usr/local/nginx/html
http{…}:配置http相关,由ngx_http_core_module模块引入。nginx的HTTP配置主要包括四个区块,结构如下:
http {//协议级别
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
gzipon;
upstream {//负载均衡配置
...
}
server {//服务器级别,每个server类似于httpd中的一个
listen80;
server_name localhost;
location / {//请求级别,类似于httpd中的,用于定义URL与本地文件系统的映射关系
root html;
index index.html index.htm;
}
}
}
//http{}段配置指令:
server {}:定义一个虚拟主机,示例如下:
server {
listen 80;
server_name www.lizhao.com;(自己定义)
root "/vhosts/web"; (html下网页的路径)
}
listen:指定监听的地址和端口:
listen address[:port];
listen port;
root path; 设置资源路径映射,用于指明请求的URL所对应的资源所在的文件系统上的起始路径
alias path; 用于location配置段,定义路径别名
index file; 默认主页面
error_page code […] [=code] URI | @name 根据http响应状态码来指明特用的错误页面,例如 error_page 404 /404_customed.html
[=code]:以指定的响应码进行响应,而不是默认的原来的响应,默认表示以新资源的响应码为其响应码,例如 error_page 404 =200 /404_customed.html
location区段,通过指定模式来与客户端请求的URI相匹配:
//功能:允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location配置块中的配置所处理,例如做访问控制等功能
例如:
URL:https://www.baidu.com/?tn=sitehao123_15
URI:www.baidu.com
?以前的是协议(https)+URI,?以后的是参数。
//语法:location [ 修饰符 ] pattern {......}