Nginx 是一个高性能的 HTTP 和反向代理服务器,处理高并发能力十分强大,能经受高负载的考验,有报告表明它能支持高达 50,000 个并发连接数。刚好最近在处理服务器相关的工作,所以记录一下nginx的安装。
官网下载地址:http://nginx.org/en/download.html
下载完成后到对应的下载目录使用 scp命令上传压缩包,你也可以使用你的上传工具,将压缩包上传至你的服务器上,反正随你怎么方便怎么来吧
#到刚刚下载的安装包所在的目录下,使用scp命令上传
#如果你连接服务器的ssh端口是22,也就是默认端口则不用指定端口
scp nginx-1.22.0.tar.gz [email protected]:/usr/local
#如果你连接服务器的ssh端口不是默认的22,则需要指定端口才能上传,注意这里的“P”是大写
scp -P 54199 nginx-1.22.0.tar.gz [email protected]:/usr/local
#会提示你输入密码,则输入你连接服务器的密码忌口
#扩展scp命令语法
scp -P 端口 文件 账户@服务器IP:上传到哪个目录
去对应的usr/local目录查看是否上传成功,可以看到已经成功上传
#进入/usr/local目录下
cd /usr/local
#通过wget命令下载下载自己需要的版本
wget https://nginx.org/download/nginx-1.22.0.tar.gz
可以看到已经下载成功了
安装 nginx 需要先将官网下载的源码进行编译,安装c++编译环境,安装指令如下:
yum install gcc-c++
Nginx的Rewrite模块和HTTP核心模块会使用到PCRE正则表达式语法。这里需要安装两个安装包pcre和pcre-devel。第一个安装包提供编译版本的库,而第二个提供开发阶段的头文件和编译项目的源代码。安装指令如下:
yum install -y pcre-devel
zlib库提供了开发人员的压缩算法,在Nginx的各种模块中需要使用gzip压缩。安装指令如下:
yum install -y zlib zlib-devel
nginx不仅支持 http协议,还支持 https(即在 ssl 协议上传输 http),如果使用了 https,需要安装 OpenSSL 库。安装指令如下:
yum install -y openssl openssl-devel
#进入nginx压缩包所在目录
cd /usr/local
#解压
tar -zxvf nginx-1.22.0.tar.gz
#进入解压后的目录
cd nginx-1.22.0
#编译
# 需要使用https执行指令
./configure --with-http_ssl_module
# 不需要使用https执行
./configure
##这里我是直接执行的./configure ##
./configure
额外说明:如果需要开始https支持,这里请不要直接执行./configure
,即不要直接执行该脚本,而是在该脚本后面加上SSL模块,请执行如下命令替代 ./configure --with-http_ssl_module,至于 --with-http_ssl_module
的意思,顾名思义可知是添加https支持。
添加https支持也很简单,添加SSL证书并修改 nginx.conf
配置文件即可,如何修改不做介绍,自行百度~
附带一个SSL证书免费申请网站
这里和redis的编译安装比较类似,首先在当前目录(/usr/local/nginx-1.10.1)进行编译。输入make即可,如果编译出错,请检查是否前面的4个安装都没有问题
#编译,执行make命令
make
#执行make install命令
make install
这时候返回上一级目录,就会发现多了nginx目录,接下来,启动nginx。
#返回上级目录
cd ..
#查看目录文件
ll
# 进入nginx目录
cd /usr/local/nginx/sbin
#启动nginx
./nginx
# 测试启动是否成功
curl 127.0.0.1
[root@serv01_vm15 ~]# curl 127.0.0.1
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
#看到上述内容则代表nginx已经启动成功了
#扩展命令,进入/usr/local/nginx/sbin目录
#启动nginx,默认配置文件启动
./nginx
#指定配置文件启动
./nginx -c /usr/local/nginx/conf/nginx.conf
#关闭nginx
./nginx -s quit 或者 ./nginx -s stop
#重启nginx
./nginx -s reload
#查看nginx 进程
ps aux|grep nginx
编辑文件vim /etc/rc.local,只需在rc.local增加启动代码即可。
vim /etc/rc.local
#在末尾增加nginx的路径
/usr/local/nginx/sbin/nginx
使用上述4.3中的扩展命令去启动,停止,重启nginx都是需要进入nginx的sbin目录才能操作的,稍微有点不方便,那么就可以配置一下systemctl
systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器。在systemd管理体系中,被管理的deamon(守护进程)称作unit(单元),对于单元的管理是通过命令systemctl来进行控制的。unit表示不同类型的systemd对象,通过配置文件进行标识和配置;文件主要包含了系统服务、监听socket、保存的系统快照以及其它与init相关的信息。用service来管理服务的时候,是在/etc/init.d/目录中创建一个脚本文件,来管理服务的启动和停止;
vim usr/lib/systemd/system/nginx.service
使用vim命令之后,按 i 键到插入模式,然后把下面内容复制上去,注意下面的 ExecStart 、ExecStop、ExecReload 后面的内容为上面执行nginx启动、停止、重启的命令。
**注意:**如果你的安装目录不是、usr/local/nginx,那么记得自己修改一下下面的文件中的路径
[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
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecReload=/usr/local/nginx/sbin/nginx -s reload
PrivateTmp=true
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
#开启nginx开机自启动
systemctl enable nginx.service
#关闭 nginx开机启动
systemctl disable nginx.service
#开启nginx
systemctl start nginx
#关闭nginx
systemctl stop nginx
#重启nginx
systemctl restart nginx
#查看状态
systemctl status nginx
**注意:**如果设置systemctl过程中出现异常,可使用 systemctl status nginx 查看错误信息
修改nginx.conf
#打开配置文件
vi /usr/local/nginx/conf/nginx.conf
将端口号改成8089(随便挑个端口),因为可能apeache占用80端口,apeache端口尽量不要修改,我们选择修改nginx端口。将localhost修改为你服务器的公网ip地址,修改完后保存退出。
由于关闭防火墙会导致有一定的风险,所以这里的操作是通过开放端口的方式开通nginx的外网可访问
#关闭防火墙命令也记录一下,不过不推荐使用,出现安全问题,别说没有提前提醒你哦
# centOS6及以前版本使用命令:
systemctl stop iptables.service
# centOS7关闭防火墙命令:
systemctl stop firewalld.service
推荐使用:
#查询nginx的默认端口80是否开放
firewall-cmd --query-port=80/tcp
#开放80端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
#重启防火墙
firewall-cmd --reload
#执行这一步是为了让上面的修改生效
systemctl restart nginx
在浏览器中输入 服务器的公网IP+端口 看到如下界面代表配置成功,如果你没有修改端口,使用的是默认的80端口,那么直接输入外网IP即可访问到下面的页面,我在操作过程中由于端口有限,我修改了端口的。
# 运行用户
user nobody;
#启动进程,通常设置成和cpu的数量相等
worker_processes 1;
#全局错误日志及PID文件及存放路径
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
#工作模式及连接数上限
events {
#单个后台work process进程的最大并发链接数
worker_connections 1024;
}
#网页信息
http {
#设定mine类型,类型由mine。type文件定义
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"';
#日志文件存储路径/usr/local/...(nginx的安装目录)
#access_log logs/access.log main;
#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
#对于普通应用,必须设为 on,
#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
#以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile on;
#tcp_nopush on;
#连接超时时间
#keepalive_timeout 0;
keepalive_timeout 65;
#开启gzip压缩 如果没有开启gzip,用户访问我们的时候就是以原图来访问。
gzip on;
#小于1K的文件不适合压缩,下限是1k
gzip_min_lenth 1k;
#缓存的内存空间--4个16进制数据流
gzip_buffers 4 16k;
#http版本
gzip_http_version 1.1
#开启判断客户端和浏览器是否支持gzip
gzip_vary on;
#设定虚拟主机配置
server {
#监听80端口
listen 80;
#定义使用 访问的网址
server_name localhost;
#设置字符编码
#charset koi8-r;
#设定本虚拟主机的访问日志
#access_log logs/host.access.log main;
#默认请求,优先级最低的配置
location / {
#定义服务器的默认网站根目录位置 这个root目录其实就是/usr/local目录
root html;
# 匹配任何请求,因为所有请求都是以"/"开始
# 但是更长字符匹配或者正则表达式匹配会优先匹配
#定义首页索引文件的名称
index index.html index.htm;
}
#配置Nginx缓存
location ~.*\.(jpg|png|gif)$ {
expires 30d; #缓存存放30天,然后自动清除
}
location ~.*\.(css|js)? $ {
expires 1h; #缓存存放1小时
}
#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;
}
# 对 “/” 启用反向代理,对上面的实例
location / {
proxy_pass http://127.0.0.1:3000; # 设置要代理的 uri,注意最后的 /。可以是 Unix 域套接字路径,也可以是正则表达式。
proxy_redirect off; # 设置后端服务器“Location”响应头和“Refresh”响应头的替换文本
proxy_set_header X-Real-IP $remote_addr; # 获取用户的真实 IP 地址
#后端的Web服务器可以通过 X-Forwarded-For 获取用户真实IP,多个 nginx 反代的情况下,例如 CDN。参见:http://gong1208.iteye.com/blog/1559835 和 http://bbs.linuxtone.org/thread-9050-1-1.html
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#以下是一些反向代理的配置,可选。
proxy_set_header Host $host; # 允许重新定义或者添加发往后端服务器的请求头。
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k;
#设定缓存文件夹大小,大于这个值,将从upstream服务器传
}
# 本地动静分离反向代理配置
# 所有 jsp 的页面均交由tomcat或resin处理
location ~ .(jsp|jspx|do)?$ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
# 所有静态文件由nginx直接读取不经过tomcat或resin
location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)${
root /data/www/ospring.pw/public;
expires 15d;
}
location ~ ^/(upload|html)/ {
root /data/www/ospring.pw/public/html;
expires 30d;
}
include vhosts//.conf; 分割配置文件,方便管理
}
#这里可以配置多台虚拟主机
# 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
web服务器配置
#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;
# }
#}
}
日志文件的存储路径:
控制日志的参数:
log_format
:用来定义记录日志的格式(可以定义多种日志格式,取不同的名字即可)access_log
:用来指定日志文件的路径及使用何种日志格式记录日志Nginx访问日志轮询切割
为了是Nginx的日志文件存储更合理、有序,我们需要将日志文件进行分开存储,比如我们可以按时间来分开,今天的日志文件存储到一个文件中,明天的日志文件则存储到另一个新的文件中等等。这个时候,我们就会用到日志文件切割操作。脚本实现的思想就是将正在写入的Nginx日志(access_www.log)改名为带日期的格式文件(20171011_access_www.log),然后平滑重新加载Nginx,生成新的Nginx日志。
具体切割脚本如下:
[root@www logs]#cat /server/script/cut_nignx_log.sh
#!/bin/sh
Dateformat = 'date + %Y%m%d'
Basedir="/application/nginx"
Nginxlogdir="$Basedir/logs"
Logname="access_www"
[-d $Nginxlogdir ] && cd $Nginxlogdir || exit 1
[-f ${Logname}.log ] || exit 1
/bin/mv ${Logname}.log ${Dateformat}_${Logname}.log
$Basedir/sbin/nginx -s reload
#注意:脚本实现切割Nginx日志的思想为将正在写入的Nginx日志(access_www.log)改名为带日期的格式文件#(20150417_access_www.log),然后平滑重新加载Nginx,生成新的Nginx日志(access_www.log)
什么是负载均衡?
通俗的讲就是:我们可以建立很多很多服务器,这些服务器组成了一个服务器集群,然后当用户访问我们的网站时,先去访问一个中间服务器,再让这个中间服务器在这些服务器集群中选择一个压力较小的服务器,然后将访问请求引入该选择的服务器,这样用户每次访问都会保证服务器集群中每个服务器的压力都能区域平衡,分担勒服务器的压力,避免服务器的崩溃。
负载均衡的实现:
#负载均衡配置文件
user nobody;
events{
worker_connections 1024;
}
http{
#配置多台代理服务器地址
upstream myproject{
server 59.68.29.103; #server backend1.example.com weight=5;
server 59.68.29.108;
}
server{
listen 8080;
#在此处添加域名映射的规则
server_name localhost;
location / {
proxy_pass http://myproject;
}
}
}
配置完后,重新加载Nginx配置文件。
不足之处,欢迎评论指出!