声明:因为是我的学习过程,查阅了很多大佬的文章,大部分内容是复制过来的。若有侵权、冒犯,请与我联系,我会第一时间删除。请大家悉知!!!
一、概念
Nginx是一款轻量级的Web 服务器、反向代理服务器、电子邮件(IMAP/POP3)代理服务器。中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
特点:占用内存少,并发能力强,cpu、内存等资源消耗非常低,运行非常稳定。
二、名词解释
1、正向代理
正向代理是在客户端部署的。以VPN举例,正常访问国外服务器是访问不了的,但是你给你的电脑装了代理服务器,代理服务器可以去访问香港的服务器,香港服务器再去访问国外的服务器,然后再一次返回回来,这样你就可以访问国外服务器,这就是正向代理。
2、反向代理
反向代理是在服务器端部署的。以百度为例,它背后是有很多台服务器的,比如广州的深证的北京的,但是你访问的永远都是www.baidu.com,这种代理服务器端的就叫反向代理。
3、负载均衡
Nginx提供的负载均衡有两种:内置策略(轮询、加权轮询等))和扩展策略(任意操作)。
轮询:(依次循环)
加权轮询:(权重越高访问越高,从而保障服务器的性能最大化)
4、动静分离
在我们的软件开发中,有些请求是需要后台处理的,有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件),这些不需要经过后台处理的文件称为静志文件。让动志网站里的动志网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静志资源的特点将其做缓存操作。提高资源响应的速度。
三、Nginx部署
1、Nginx安装--Windows
下载并解压至全英文目录下,打开nginx.exe 文件所在目录,在路径里输入cmd。
#这时候不建议使用win+r,cmd
#注意:不要双击nginx.exe ,闪一下就没了
2、Nginx安装--Linux
为什么选择编译安装,因为使用rpm安装的Nginx无法增加指定功能模块,而自己编译安装的话,可以在安装时指定需要的功能模块,比如ssl模块功能。
本章节只安装Nginx的基础模块,实现简单的WEB页面测试,如需要更多模块或在生产环境中使用,在编译安装时添加相应的功能模块即可。
--with-http_stub_status_module ------运行监控模块
--with-http_ssl_module ------https访问
--with-pcre ------rewrite模块使用
--with-http_v2_module ------http v2模块使用
--with-mail=dynamic -----邮件模块
--with-mail_ssl_module ------邮件ssl模块
--with-stream=dynamic -----tcp转发模块
--with-stream_ssl_module -----tcp加密转发
(1)关闭防火墙和SELinux;
(2)配置阿里的yum源:
(原因:系统默认的yum源的国外的,下载慢;这里配置国内源,下载快,网络稳定。)
[root@localhost ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
(3)安装依赖包
[root@localhost ~]# yum install gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel pcre pcre-devel wget -y
(4)下载软件包,这里我使用的是Nginx-1.22.1b版本
[root@localhost ~]# wget -c http://nginx.org/download/nginx-1.22.1.tar.gz
(5)编译安装:
#这里全部使用默认选项:
#解压
[root@localhost ~]# tar -zxf nginx-1.22.1.tar.gz -C /usr/local
#编译安装:(编译时添加了http访问模块功能)
[root@localhost ~]# cd /usr/local/nginx-1.22.1
[root@localhost nginx-1.22.1]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
[root@localhost nginx-1.22.1]# make
[root@localhost nginx-1.22.1]# make install
#安装完成后删除源码目录:
[root@localhost nginx-1.22.1]# cd /root
[root@localhost ~]# rm -rf /usr/local/nginx-1.22.1
#创建启动用户
[root@localhost ~]# useradd -u 8000 -s /sbin/nologin nginx
#修改配置文件
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
#在配置文件中修改启动Nginx服务使用的用户名
#将:user nobody;
#改为:user nginx nginx;
#启动nginx
[root@localhost ~]# /usr/local/nginx/sbin/nginx
#其它命令操作,需要时可使用,本文只是安装不需要执行以下2步操作
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s reload
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s stop
#测试是否搭建成功:通过网页测试,地址栏输入服务器地址能得到“Welcome to nginx!”
安装完成之后,需要知道的几个关键路径和文件:
3、Nginx维护--Linux
#一般的Nginx的启动为:
[root@localhost ~]# /usr/local/nginx/sbin/nginx
[root@localhost ~]# ps -ef | grep nginx
root 12201 1194 0 23:13 pts/0 00:00:00 grep --color=auto nginx
root 112802 1 0 22:47 ? 00:00:00 nginx: master process nginx
nginx 112803 112802 0 22:47 ? 00:00:00 nginx: worker process
[root@localhost ~]#
#为使用方便,可为其创建软连接,在任何路径下都能执行Nginx操作
[root@localhost ~]# ln -s /usr/local/nginx/sbin/nginx /sbin/nginx
[root@localhost ~]# nginx
[root@localhost ~]# ps -ef | grep nginx
root 14440 1 0 21:21 ? 00:00:00 nginx: master process nginx
nginx 14441 14440 0 21:21 ? 00:00:00 nginx: worker process
root 14788 1194 0 21:21 pts/0 00:00:00 grep --color=auto nginx
[root@localhost ~]#
#Nginx由master进程和worker进程组成,master只有一个,worker进程可以有多个。
#Nginx的启动(这里默认的配置文件是/usr/local/nginx/conf/nginx.conf)
[root@localhost ~]# nginx
或者
[root@localhost ~]# nginx –c /usr/local/nginx/conf/nginx.conf
#实际使用中可能有多个配置文件,需指定配置文件启动。
#启动操作-c参数指定了要加载的Nginx配置文件路径。
#Nginx的停止
通过杀进程方式停止,master进程和worker进程都需要kill掉
[root@localhost ~]# nginx
[root@localhost ~]# ps -ef | grep nginx
root 14440 1 0 21:21 ? 00:00:00 nginx: master process nginx
nginx 14441 14440 0 21:21 ? 00:00:00 nginx: worker process
root 14788 1194 0 21:21 pts/0 00:00:00 grep --color=auto nginx
[root@localhost ~]# kill -9 14440
[root@localhost ~]# kill -9 14441
[root@localhost ~]# ps -ef | grep nginx
root 27291 1194 0 21:32 pts/0 00:00:00 grep --color=auto nginx
[root@localhost ~]#
#优雅停止nginx命令,等最后一次交互执行完毕再停止
[root@localhost ~]# nginx
[root@localhost ~]# ps -ef | grep nginx
root 104547 1 0 22:39 ? 00:00:00 nginx: master process nginx
nginx 104548 104547 0 22:39 ? 00:00:00 nginx: worker process
root 104564 1194 0 22:39 pts/0 00:00:00 grep --color=auto nginx
[root@localhost ~]# nginx -s quit
[root@localhost ~]# ps -ef | grep nginx
root 104904 1194 0 22:40 pts/0 00:00:00 grep --color=auto nginx
[root@localhost ~]#
#重启nginx命令
[root@localhost ~]# nginx -s reload
#检查Nginx配置文件是否有问题
#ok和successful正常
[root@localhost ~]# 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
[root@localhost ~]#
#查看nginx版本信息
#查看nginx详细版本信息,注意是大写V
[root@localhost ~]# nginx -v
nginx version: nginx/1.22.1
[root@localhost ~]#
[root@localhost ~]# nginx -V
nginx version: nginx/1.22.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
[root@localhost ~]#
Nginx配置文件的详细学习:
1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
5、location块:配置请求的路由,以及各种页面的处理情况。
[root@localhost ~]# cat /usr/local/nginx/conf/nginx.confuser nginx nginx; #运行nginx的默认账号
worker_processes 1; #nginx进程数,一般设置成CPU总核心数#error_log logs/error.log; #错误日志路径
#error_log logs/error.log notice;
#error_log logs/error.log info;#pid logs/nginx.pid; #pid(进程文件)路径
#事件区块
#单个进程最大链接数(最大连接数=连接数*进程数)
#根据硬件调整,尽量大,但别把CPU跑到100%就行。每个worker进程最大连接数,小于等于系统的最大打开文件数
events {
worker_connections 1024;
}#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
include mime.types; #导入外部文件mime.types,将所有types提取为文件,然后导入到nginx配置文件中
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指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设置为on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载,注意:如果图片显示不正常把这个改成off
#sendfile指令指定nginx是否调用sendfile函数(zero copy方式)来输出文件,对于普通应用,必须设为on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptimesendfile on;
#tcp_nopush on;#keepalive_timeout 0; #连接超时时间
keepalive_timeout 65;#gzip on;
#第一个server区块开始,表示一个独立的虚拟主机站点
server {
listen 80; #提供服务的端口,默认为80server_name localhost; #提供服务的域名主机名
#charset koi8-r;
#access_log logs/host.access.log main;
#对 “/” 启动反向代理,第一个location区块开始
location / {
root html; #服务默认启动目录,可以改成指定的目录位置
index index.html index.htm; #默认的首页文件,多个用空格分开
}#错误页面路由
#error_page 404 /404.html; #出现对应的http状态码是,使用50x.html回应客户
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;# location区块开始,访问 /50x.html
location = /50x.html {
root html; # 指定对应的站点目录为html
}# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#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;
#}# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# 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 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;
# ssl_prefer_server_ciphers on;# location / {
# root html;
# index index.html index.htm;
# }
#}}