安装
Nginx的安装版本分为Mainline version(主要开发版本,其实就是还处于开发版)、Stable version(当前最新稳定版)和Legacy versions(旧的稳定版), Nginx安装可以使⽤yum或源码安装,但是推荐使⽤源码,⼀是yum的版本⽐较旧,⼆是编译安装可以更⽅便⾃定义相关路径,三是使⽤源码编译可以⾃定义相关功能,更⽅便业务的上的使⽤,源码安装需要提前准备标准的编译器,GCC的全称是(GNU Compiler collection),其有GNU开发,并以GPL即LGPL许可,是⾃由的类UNIX即苹果电脑Mac OS X操作系统的标准编译器,因为GCC原本只能处理C语⾔,所以原名为GNU C语⾔编译器,后来得到快速发展,可以处理C++,Fortran,pascal,objective-C,java以及Ada等其他语⾔,此外还需要Automake⼯具,以完成⾃动创建Makefile的⼯作,Nginx的⼀些模块需要依赖第三⽅库,⽐如pcre(⽀持rewrite),zlib(⽀持gzip模块)和openssl(⽀持ssl模块)等。
安装依赖包
sudo apt install curl gnupg2 ca-certificates lsb-release
下载软件包并解压
wget http://nginx.org/download/nginx-1.18.0.tar.gz
tar -xf nginx-1.18.0.tar.gz
编译安装
编译通常使用以下参数,如果想了解更多参数使用./configure --help
查看
cd nginx-1.18.0
./configure --prefix=/usr/nginx \
--with-http_ssl_module \ #支持https
--with-http_v2_module \ #支持v2版本的http
--with-http_realip_module \ #realip模块用于识别用户真实IP
--with-http_geoip_module \ #统计IP地址信息
--with-http_stub_status_module \ #统计当前访问状态
--with-http_gzip_static_module \ #开启压缩
--with-http_gunzip_module \
--with-pcre \ #加载正则语法
--with-stream \ #开启代理模式
--with-stream_ssl_module \
--with-stream_geoip_module
--with-stream_realip_module
编译成功后当前目录会生成一个Makefile
文件,然后使用命令make && make install
即完成安装。
验证并启动
sudo /usr/nginx/sbin/nginx -v
nginx version: nginx/1.18.0
sudo /usr/nginx/sbin/nginx -t
nginx: the configuration file /usr/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/nginx/conf/nginx.conf test is successful
sudo /usr/nginx/sbin/nginx
启动后,打开浏览器验证
创建服务启动脚本
sudo vim /lib/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/nginx/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/nginx/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/nginx/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed
[Install]
WantedBy=multi-user.target
创建后再验证是否加入成功。
配置文件详解
安装完毕后,配置文件在/usr/nginx/conf/nginx.conf
或[安装路径]/conf/nginx.conf
user nginx nginx #启动Nginx进程的用户的组,这行可以不写
worker_processes 1; #启动Nginx⼯作进程的数量,可以写数字或auto
worker_cpu_affinity 00000001 00000010 00000100 00001000; #将Nginx⼯作进程绑定到指定的CPU核
⼼,默认Nginx是不进⾏进程绑定的,绑定并不是意味着当前nginx进程独占以⼀核⼼CPU,但是可以保证此进程不会运⾏在其他核⼼上,这就极⼤减少了nginx的⼯作进程在不同的cpu核⼼上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。
#error_log logs/error.log; 错误日志位置
#error_log logs/error.log notice; 记录日志级别,除此之外还有[debug | info | notice | warn | error | crit |
alert | emerg]
worker_priority 0; #⼯作进程nice值,-20~19
worker_rlimit_nofile 65536; #这个数字包括Nginx的所有连接(例如与代理服务器的连接等),⽽不仅仅是与
客⼾端的连接,另⼀个考虑因素是实际的并发连接数不能超过系统级别的最⼤打开⽂件数的限制
daemon off; #前台运⾏Nginx服务⽤于测试、docker等环境。
master_process off|on; #是否开启Nginx的master-woker⼯作模式,仅⽤于开发调试场景。
events { #事件模型配置参数
worker_connections 1024; #设置单个⼯作进程的最⼤并发连接数
use epoll; #使⽤epoll事件驱动,Nginx⽀持众多的事件驱动,⽐如select、poll、epoll,只能设置在
events模块中设置。这行可以不写,Nginx默认就是epoll
accept_mutex on; #优化同⼀时刻只有⼀个请求⽽避免多个睡眠进程被唤醒的设置,on为防⽌被同时唤醒默认为off,全部唤醒的过程也成为"惊群",因此nginx刚安装完以后要进⾏适当的优化。
multi_accept on; Nginx服务器的每个⼯作进程可以同时接受多个新的⽹络连接,但是需要在配置⽂件中配
置,此指令默认为关闭,即默认为⼀个⼯作进程只能⼀次接受⼀个新的⽹络连接,打开后⼏个同时接受多个。
}
http {
include mime.types; #导入支持的文件类型
default_type application/octet-stream; #设置默认的类型,会提示下载不匹配的类型文件
#自定义优化参数
sendfile on; #实现文件零拷贝
#tcp_nopush on; #在开启了sendfile的情况下,合并请求后统⼀发送给客⼾端。
#tcp_nodelay off; #在开启了keepalived模式下的连接是否启⽤TCP_NODELAY选项,当为off时,延
迟0.2s发送,默认On时,不延迟发送,⽴即发送⽤⼾相应报⽂。
#keepalive_timeout 0;
keepalive_timeout 65; #设置会话保持时间
server {
listen 80; #监听端口
server_name localhost; #设置server name,可以以空格隔开写多个并⽀持正则表达式,如
*.keone.site www.keone.* www.(site\d+)\.keone\.site$ default_server
#charset koi8-r; #设置编码格式,默认是俄语格式,可以改为utf-8
#access_log logs/host.access.log main
location / {
root html;
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 html;
}
}
}
配置示例
Nginx可以实现将访问转基于不同的IP、不同的端⼝以及不同的域名转发到不同的虚拟主机(也可以是服务器)上,依赖于核⼼模块ngx_http_core_module实现。比如,我们创建一个PC站点,一个移动web站点,然后通过Nginx实现将请求基于域名转发到相应的站点。
新建一个PC web站点
sudo mkdir /data/nginx/html/pc/
sudo mkdir /usr/nginx/conf/conf.d
vim /usr/nginx/conf/conf.d/pc.conf #编辑pc站点的配置文件
server {
listen 80;
server_name www.keone.site;
location / {
root /data/nginx/html/pc;
}
}
sudo bash -c "echo 'This is a PC site test page' > /data/nginx/html/pc/index.html" #创建测试页
sudo vim /usr/nginx/conf/nginx.conf
include /usr/nginx/conf/conf.d/*.conf #主配置文件末尾加上这一句,加载配置路径中的配置
新建一个移动web站点
vim /usr/nginx/conf/conf.d/mobile.conf #编辑移动站点的配置文件
server {
listen 80;
server_name mobile.keone.site;
location / {
root /data/nginx/html/mobile;
}
}
sudo mkdir /data/nginx/html/mobile/
sudo bash -c "echo 'This is a mobile site test page' > /data/nginx/html/mobile/index.html" #创建测试页
访问测试
测试之前,要先把本机host文件中写入主机名对应的地址,并且重新加载Nginx配置。
编辑本机host文件。如果是windows电脑,修改本机C:\Windows\System32\drivers\etc\host
文件,在文件后面插入以下两行(部署Nginx的虚拟机IP是172.16.22.20):
172.16.22.20 www.keone.site
172.16.22.20 mobile.keone.site
然后在ubuntu重新加载
systemctl reload nginx #重新加载配置文件
分别访问两个地址,结果如下: