文章目录



(1)源码安装指定安装路径
(2)目录核心介绍

conf #所有配置文件的目录
nginx.conf #默认的主要配置文件
nginx.conf.default #默认模板
html #这是编译安装时Nginx的默认站点目录
50x.html #错误页面
index.html #默认首页
logs #nginx默认的日志路径,包括错误日志以及访问日志
error.log #错误日志
nginx.pid #nginx启动后的进程id
access.log #nginx访问日志
sbin #nginx命令目录
nginx #启动命令
(3)常见命令
./nginx #默认配置文件启动
./nginx -s reload #重启,加载默认的配置文件,conf/nginx.conf
./nginx -s stop #停止nginx
./nginx -c /usr/local/nginx/conf/nginx.conf #指定配置文件启动
#nginx进程有master process和worker process,关闭master进程即可,其他都被关掉
#每个配置项有配置指令和指令参数够成 nginx配置文件全部用的相对路径
#user nobody; #指定nginx用户组
worker_processes 1; #指定worker process进程的数量
#error_log logs/error.log; #错误日志存放的路径
#error_log logs/error.log notice; #告警日志
#error_log logs/rttor/log info; #平常日志
#pid logs/nginx.pid #nginx进程的启动PID
#事件模块指令,用来指定Nginx的IO模型,Nginx支持的所有select、poll、kqueue、epoll等
#不同的是epoll用在linux平台上,而kqueue用在BSD系统上
events{
use epoll;
#指定每个worker进程的最大连接数,作为服务器来说,最大连接数为worker_connections * worker_processes
#作为反向代理来说,最大连接数为worker_connections * worker_processes / 2
worker_connections 1024;
}
#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日志,main 日志定义的格式
#access_log logs/access/log main;
#是否开启高效传输模式 on开启,off关闭
sendfile on;
#减少网络报文段的数量
#tcp_nopush on;
#客户端连接保持活动的超时时间,超过这个时间服务器会自动关闭
keepalive_timeout 65;
#是否开启压缩
#gzip on;
#虚拟主机配置
server {
#虚拟主机的服务端口
listen 80;
#用来指定IP地址和域名,可以有多个用空格分开
server_name localhost;
#charset koi8-r;
#access_log日志,main 日志定义的格式
#access_log logs/host.access.log main;
#URL地址配置
location /{
#服务默认启动目录
root html;
#默认访问文件,按照顺序找
index index.html;
}
#URL地址配置
location ~ \.php${
#反向代理的地址
proxy_pass http://127.0.0.1;
}
}
server {
....
}
}
(1)什么是虚拟主机

(2)Nginx虚拟主机配置
#use nobody;
worker_processes 1;
events{
use epoll;
worker_connections 1024;
}
http{
server{
listen 80; #监听的端口
server_name www.nginx.com #请求的域名
location /{
root /usr/local/software/nginx/html #目录
index index.html #跳转的页面
}
}
server{
listen 80;
server_name www.lixiang.com #请求的域名
location /{
root /usr/local/software/nginx/html #目录
index lixiang.html
}
}
}
重启nginx : ./nginx -s reload

(1)图片服务器
(2)访问流程:前端提交图片->后端处理->存储到数据库->拼接好访问路径保存到数据库,存储到文件服务器

(3)配置虚拟主机
server {
listen 80;
server_name www.lixiang.com;
location /app/img/ {
alias /usr/local/software/nginx/img/;
}
}

注意:
(1)access.log日志用处
(2)默认配置解析
#log_format main '$remote_addr $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
(3)案例
122.70.148.18 - [04/Aug/2020:14:46:48 +0800] "GET /user/api/v1/product/order/query_state?product_id=1&token=xdclasseyJhbGciOJE HTTP/1.1" 200 48 "https://xdclass.net/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
(4)日志解析
$remote_addr #访问的客户端IP地址,对应的是122.70.148.18
$remote_user #远程访问的用户,没有就用“-”表示
$time_local #访问的时间,对应04/Aug/2020:14:46:48 +0800
$request #URL请求的地址参数类型等,对应"GET /user/api/v1/product/order/query_state product_id=1&token=xdclasseyJhbGciOJE HTTP/1.1"
$status #访问的状态码,200表示正常
$body_bytes_sent #对应的是多少字节,48字节,响应的body大小
$http_referer #访问源,对应是"https://xdclass.net/",如是直接在浏览器刷新时,referer就会为“-”
$http_user_agent #对应是客户端浏览器访问的类型
$http_x_forwarded_for #获取用户的真实ip
(1)查看访问最频繁的前100个IP
awk '{print$1}' access_temp.log | sort | uniq -c | sort -rn | head -100
(2)统计访问最多的url前20名
awk '{print$7}' access_temp.log | sort | uniq -c | sort -rn | head -20
awk是文本处理工具,默认按照空格切分,$N是切割第几个元素,$1就是切割第一个
sort命令用于将文本内容进行排序,-n按照数值排,-r倒序来排,默认从小到大
uniq去除重复出现的列,-c 显示重复的次数
(3)自定义日志格式,统计接⼝响应耗时
$request_time:从接受用户请求的第一个字节到发送完响应数据的时间,既包括接受数据的时间、程序响应时间、输出相应时间
$upstream_response_time:指从Nginx像向后端建立连接开始到接受完数据然后关闭连接为止的时间。
#定义日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$request_time"';
#引用日志模板
access_log logs/access.log main;
(4)统计耗时接口, 列出传输时间超过 2 秒的接口,显示前5条
awk '$NF>2{print$7}' access.log | sort| uniq -c | sort -rn | head -5
upstream lbs{
server 192.168.10.111:8080;
server 192.168.10.111:8081;
}
server{
listen 80;
server_name www.lixiang.com;
location /api/{
proxy_pass http://lbs;
proxy_redirect default;
}
}
upstream lbs{
server 192.168.10.111:8080;
server 192.168.10.111:8081;
}
upstream lbs{
server 192.168.10.111:8080 weight=5;
server 192.168.10.111:8081 weight=10;
}
upstream lbs{
ip_hash;
server 192.168.10.111:8080;
server 192.168.10.111:8081;
}
server 192.168.10.111:8080 down;
server 192.168.10.111:8081 backup;
max_fails=N设定Nginx与后端节点通信的尝试失败的次数,在fail_timeout参数定义的时间内,如果失败的次数到达此值,Nginx就认为这个节点不可用,在下一个fail_timeout时间段到来之前,服务器不会在去尝试。失败尝试次数默认是1,如果设定为0就会停止统计尝试次数,认为服务器一直可用
可以通过proxy_next_upstream来配置什么是失败的尝试。
注意:默认情况下,http_404状态是不被认为是失败的尝试
配置实操
upstream lbs{
server 192.168.10.111:8080 max_fails=2 fail_timeout=60s;
server 192.168.10.111:8081 max_fails=2 fail_timeout=60s;
}
server {
listen 80;
server_name www.nginx.com;
location /api/{
proxy_pass http://lbs;
proxy_redirect default;
proxy_next_upstream error timeout http_404 http_503 http_500;
}
}
upstream lbs{
server 192.168.10.111:8080;
server 192.168.10.111:8081;
}
location /api/{
proxy_pass http://lbs;
proxy_redirect default;
#存放用户真实的IP
proxy_set_header Host $host;
proxy_set_heater X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#开启错误拦截配置,一定要开启
proxy_intercept_errors on;
}
error_page 404 500 503 502 503 =200 /default_api/;
location /default_api/{
default_type application/json;
return 200 '{"code":"-1","msg":"invoke fail, not found "}';
}
(1)封禁IP的方式
(2)Nginx作为网关封禁IP
在nginx/conf 下编写blacklist.conf文件
deny 192.168.10.1;
在nginx.conf配置
全局配置:在http{}下配置
单独虚拟主机配置:在server下配置
include blacklist.conf;

location /{
add_header 'Access-Control-Allow-Origin' $http_origin;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Headers' 'DNT,web-token,apptoken,Authorization,Accept,Origin,KeepAlive,User-Agent,X-Mx-ReqToken,X-DataType,X-Auth-Token,X-Requested-With,IfModified-Since,Cache-Control,ContentType,Range';
add_header Access-Control-Allow-Methods 'GET,POST,OPTIONS';
#如果预见请求则返回成功,不需要转发到后端
if($request_method == 'OPTIONS'){
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 200;
}
}
正则
^:以什么开始
$:以什么结束
^/api/user$
location路径匹配
server {
server_name xdclass.net;
location ~^/api/pub$ {
...
}
}
http://xdclass.net/api/v1 #不匹配,没有以pub结尾
http://xdclass.net/API/PUB #不匹配,大写不匹配
http://xdclass.net/api/pub?key1=value1 #匹配
http://xdclass.net/api/pub/ #不匹配/说明接口不是以pub结尾
http://xdclass.net/api/public #不匹配 ,没有pub结尾
location =/img/test.png{
return 1;
}
location /img/test.png{
return 2;
}
location ^~/img/{
return 3;
}
location =/{
return 4;
}
location /{
return 5;
}
rewrite ^/(.*) https://xdclass.net/$1 permanent
#这是一个正则表达式,匹配完整的域名和后面的路径地址
#replacement部分事https://xdclass.net/$1,$1是取自regex部分()里的内容
| 字符 | 描述 |
|---|---|
| ^ | 表示以什么开头 |
| $ | 表示以什么结尾 |
| * | 表示前面的字符0次或者多次 |
| + | 表示匹配前面一次或者多次 |
| ? | 匹配前面0次或者1次 |
| . | 表示单个字符 |
| (pattern) | 匹配括号的内pattern |
| 标记符号 | 说明 |
|---|---|
| last | 本条规则匹配完成后继续向下匹配新的location URI规则 |
| break | 本条规则匹配完成后终止,不在匹配任何规则 |
| redirect | 返回302临时重定向 |
| permanent | 返回301永久重定向 |
location /{
#重定向以/划分把/前的所有替换成https://xdclass.net,$1为(.*)表示参数,permanent表示永久重定向
rewrite ^/(.*) https://xdclass.net/$1 permanent;
}
配置
server {
listen 80;
server_name xdclass.net;
location /{
proxy_pass http://lbs;
proxy_read_timeout 300s; #websocket空闲保持时长
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_http_version 1.1;
#
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
HTTP /1.1 101 Switching Protocols
Upgrade: websocket
Connection: upgrade
压缩配置
对文本、js和css文件等进行压缩,一般是压缩后的大小是原始大小的25%
gzip
gzip_buffers
gzip_comp_level
gzip_min_length
gzip_http_version
gzip_types
#开启gzip,减少我们发送的数据量
gzip on;
#设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。
gzip_min_length 1k;
#4个单位为16k的内存作为压缩结果流缓存
gzip_buffers 4 16k;
#gzip压缩比,可在1-9中设置,1压缩比例最小,速度最快,9压缩比例最大,速度最慢,消耗cpu
gzip comp level 4;
#压缩类型
gzip_types application/javascript text/plain text/css application/json application/xml text/javascript;
#给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费支持也压缩,所以根据客户端的HTTP头来判断,是否需要压缩
gzip_vary on;
#禁用IE6一下的gzip压缩,IE某些版本对gzip的压缩支持很不好
gzip_disable "MSIE [1-6].";
location /static/ {
alias /usr/local/software/static;
}


(1)高并发Nginx服务器缓存
常见的缓存分类
Nginx作为缓存让后端结果的缓存离用户更进一些,性能提高,减少服务请求网络带宽。

(2)常用配置
http{
proxy_cache_path /root/cache/ levels=1:2 keys_zone=lx_cache:10m max_size=1g inactive=60m use_temp_path=off;
server {
proxy_pass http://lbs;
proxy_redirect default;
proxy_cache lx_cache;
proxy_cache_valid 200 304 10m;
proxy_cache_valid 404 1m
proxy_cache_key $host$uri$is_args$args;
add_header Nginx-Cache "$upstream_cache_status";
}
}



地址:https://common-buy.aliyun.com/?commodityCode=cas
./configure prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
make
make install
#查询是否安装成功
/usr/local/nginx/sbin/nginx -V
https{
server {
listen 443 ssl;
server_name 16web.net;
ssl_certificate /usr/local/software/biz/key/4383407_16web.net.pem;
ssl_certficate_key /usr/local/software/biz/key/4383407_16web.net.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;
}
}
}
(1)OpenResty介绍
基于Nginx和Lua的高性能web平台,内部集成精良的Lua库、第三方模块、依赖,开发者可以方便搭建能够处理高并发、扩展性极高的动态web应用、web服务、动态网关。
OpenResty将Nginx核心、LuaJIT、许多有用的Lua库和Nginx第三方模块打包在一起
Nginx是c语言开发,如果要二次扩展很麻烦,而基于OpenResty,开发人员可以使用Lua编程语言对Nginx核心模块进行二次扩展
性能强大,OpenResty可以快速构造出1万以上并发连接响应的超高性能web应用系统
(2)扩展
让web服务直接泡在Nginx内部服务器,充分利用Nginx的非阻塞I/O模型,不仅仅对HTTP客户端请求,甚至对于远程后端如MYSQL、Redis等都进行一直的高性能响应。所以对于一些高性能的服务来说,可以直接使用OpenResty访问MYSQL、Redis,而不需要通过第三方语言来访问,大大提高性能
(3)Lua脚本介绍
Lua由标准的c语言编写而成,没有提供强大的库,但可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数。
在应用程序中可以被广泛应用,不过Lua是一种脚本,不适合做复杂的业务场景。
LuaJIT是采用C和汇编语言写的Lua解释器与即使编译器
(4)什么是ngx_lua
ngx_lua是Nginx的一个模块,将Lua嵌入到Nginx中,从而可以使用Lua来编写脚本,部署到Nginx中运行,即Nginx变成了一个Web容器;开发人员就可以使用Lua语言开发高新跟那个Web应用了。
(5)OpenResty提供了常用的ngx_lua开发模块
通过上述的模块,可以⽤来操作 mysql数据库、redis、memcached等,也可以⾃定义模块满⾜其他业务需求,很多经典的应⽤,⽐如开发缓存前置、数据过滤、API请求聚合、AB测试、灰度发布、降级、监控、限流、防⽕墙、⿊白名单等
(6)OpenResty安装
cd /etc/yum.repos.d/
wget https://openresty.org/package/centos/openresty.repo
yum check-update
yum clean all
yum makecache
yum install -y openresty
yum -y install openresty-resty
列出所有 openresty 仓库⾥的软件包
yum --disablerepo="*" --enablerepo="openresty" list available
查看版本
resty -V
(1)Nginx+OpenResty开发
编辑:/usr/local/openresty/nginx/conf/nginx.conf
http{
location /{
content_by_lua_block{
ngx.say("hello lixiang;李祥");
}
}
}

Nginx内置变量
| 名称 | 说明 |
|---|---|
| $arg_name | 请求中的name参数 |
| $args | 请求中的参数 |
| $content_length | HTTP请求信息里的“Content-Length” |
| $content_type | 请求信息里的“Content-Type” |
| $host | 请求信息中的Host,如果请求中没有Host行,则等于设置的服务器名 |
| $hostname | 机器名使用gethostname系统调用的值 |
| $host_cookie | cookie信息 |
| $http_referer | 引用地址 |
| $http_user_agent | 客户端代理信息 |
| $http_via | 最后一个访问服务器的IP地址 |
| $http_x_forwarded_for | 相当于网络访问路径 |
| $is_args | 如果请求行带有参数,则返回”?“,则返回空字符串 |
| $limit_rate | 对连接速率的限制 |
| $nginx_version | 当前运行的nginx版本号 |
| $pid | worker进程的pid |
| $query_string | 与$args相同 |
| $remote_port | 客户端端口号 |
| $remote_addr | 客户端IP地址 |
| $request_method | 请求的⽅法,⽐如"GET"、"POST"等 |
| $request_uri | 请求的URI,带参数 |
| $scheme | 所⽤的协议,⽐如http或者是https |
| $server_name | 请求到达的服务器名 |
| $server_port | 请求到达的服务器端⼝号 |
| $server_protocol | 请求的协议版本,“HTTP/1.0"或"HTTP/1.1” |
| $uri | 请求的URI,可能和最初的值有不同,⽐如经过重定向之类的 |
Nginx对于请求的处理分为多个阶段,从而让第三方模块通过挂在行为在不同的阶段来控制,大致如下
http{
#这里设置为off,为了避免每次修改之后都要重新reload的麻烦,缓存lua脚本,生产环境上设为on
lua_code_cache off;
#lua_package_path可以配置openrestry的文件寻址路径,$PERFIX为openrestry安装路径
#文件名使用"?"作为通配符,多个路径使用";"分割。默认的查找路径用";;"
#设置纯Lua扩展库的搜寻地址
lua_package_path "$prefix/lualib/?.lua;;";
#设置c编写的Lua加班呢的搜寻地址
lua_package_cpath "$prefix/lualib/?.so;;";
server {
location /{
access_by_lua_file lua/while_ip_list.lua;
proxy_pass http://lbs;
}
}
}
local black_ips={["127.0.0.1"]=true}
local ip=ngx.var.remote_addr
if true == black_ips[ip] then
ngx.exit(ngx.HTTP_FORBIDDEN)
return;
end


Nginx+OpenResty开发资源下载限速
限速限流应用场景
openResty下载限速案例实操
location /download/{
access_by_lua_block{
ngx.var.limit_rate = "300K"
}
alias /usr/local/software/;
}

(1)什么是漏桶算法
如果是请求限流,请求先进入到漏桶里,漏桶以固定的速度出水,也就是处理请求,当水加的过快也就是请求过多,桶会直接溢出,也就是请求被丢弃拒绝,所以漏桶算法能清醒限制数据的传输速率或请求数
(2)什么是令牌桶算法
备注:只要突发并发量不⾼于桶⾥⾯存储的令牌数据,就可以充分利⽤好机器⽹络资源。如果桶内令牌数量⼩于被消耗的量,则产⽣的令牌的速度就是均匀处理请求的速度

LVS是Linux Virtual Server,Linux虚拟服务器,是一个虚拟的服务器集群系统
Linux2.4内核以后,LVS已经是Linux标准内核的一部分
监控并管理LVS集群系统中各个服务节点的状态
keepalived是一个类似于交换机制的软件,核心是检测服务器的状态,如果有一台web服务器工作出现故障,keepalived将检测到并将有故障的服务器从系统中剔除,使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器集群中。
后来加入了vrrp(虚拟路由器冗余协议),除了为LVS提供高可用还可以为其他服务器如mysql等提供高可用方案
#yum安装
yum -y install keepalived
#配置路径
/etc/keepalived/keepalived.conf
#启动命令
service keepalived start
#停止命令
service keepalived stop
#重启命令
service keepalived restart
#查看状态
service keepalived status
yum install -y gcc
yum install -y openssl-devel
yum install -y libnl libnl-devel
yum install -y libnfnetlink-devel
yum install -y net-tools
yum install -y vim wget
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL # 设置lvs的id,在一个网络内应该是唯一的
enable_script_security #允许执行外部脚本
}
#配置vrrp_script,主要用于健康检查及检查失败后执行的动作。
vrrp_script chk_real_server {
#健康检查脚本,当脚本返回值不为0时认为失败
script "/usr/local/software/conf/chk_server.sh"
#检查频率,以下配置每2秒检查1次
interval 2
#当检查失败后,将vrrp_instance的priority减小5
weight -5
#连续监测失败3次,才认为真的健康检查失败。并调整优先级
fall 3
#连续监测2次成功,就认为成功。但不调整优先级
rise 2
user root
}
#配置对外提供服务的VIP vrrp_instance配置
vrrp_instance VI_1 {
#指定vrrp_instance的状态,是MASTER还是BACKUP主要还是看优先级。
state MASTER
#指定vrrp_instance绑定的网卡,最终通过指定的网卡绑定VIP
interface ens33
#相当于VRID,用于在一个网内区分组播,需要组播域内内唯一。
virtual_router_id 51
#本机的优先级,VRID相同的机器中,优先级最高的会被选举为MASTER
priority 100
#心跳间隔检查,默认为1s,MASTER会每隔1秒发送一个报文告知组内其他机器自己还活着。
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
#定义虚拟IP(VIP)为192.168.159.100,可多设,每行一个
virtual_ipaddress {
192.168.159.100
}
#本vrrp_instance所引用的脚本配置,名称就是vrrp_script 定义的容器名
track_script {
chk_real_server
}
}
# 定义对外提供服务的LVS的VIP以及port
virtual_server 192.168.159.100 80 {
# 设置健康检查时间,单位是秒
delay_loop 6
# 设置负载调度的算法为rr
lb_algo rr
# 设置LVS实现负载的机制,有NAT、TUN、DR三个模式
lb_kind NAT
# 会话保持时间
persistence_timeout 50
#指定转发协议类型(TCP、UDP)
protocol TCP
# 指定real server1的IP地址
real_server 192.168.159.146 80 {
# 配置节点权值,数字越大权重越高
weight 1
# 健康检查方式
TCP_CHECK { # 健康检查方式
connect_timeout 10 # 连接超时
retry 3 # 重试次数
delay_before_retry 3 # 重试间隔
connect_port 80 # 检查时连接的端口
}
}
}
router_id后面跟的自定义的ID在同一个网络下是一致的
state后跟的MASTER和BACKUP必须大写
interface 虚拟网卡ID,只要是没有在用的IP即可
在BACKUP节点上,其keepalived.conf与Master上基本⼀致,修改state为BACKUP,priority值改⼩即可
authentication主备之间的认证⽅式,⼀般使⽤PASS即可;主备的配置必须⼀致,不能超过8位





当nginx服务宕机后,但是对应的keepalived节点存活依旧可以转发过去,但是响应失败,需要配合shell脚本检测nginx服务,如果nginx服务宕机,就结束keepalived进程
脚本监听
#配置vrrp_script,主要用于健康检查及检查失败后执行的动作。
vrrp_script chk_real_server {
#健康检查脚本,当脚本返回值不为0时认为失败
script "/usr/local/software/conf/chk_server.sh"
#检查频率,以下配置每2秒检查1次
interval 2
#当检查失败后,将vrrp_instance的priority减小5
weight -5
#连续监测失败3次,才认为真的健康检查失败。并调整优先级
fall 3
#连续监测2次成功,就认为成功。但不调整优先级
rise 2
user root
}
#!/bin/bash
#检查nginx进程是否存在
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" -eq "0" ]; then
service keepalived stop
echo 'nginx server is died.......'
fi
vip能ping通,vip监听的端口不通: 第一个原因:nginx1和nginx2两台服务器的服务没有正常启动
vip ping不通: 核对是否出现裂脑,常见原因为防火墙配置所致导致多播心跳失败,核对keepalived的配置是否正确

我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除
@作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors 1、什么是behaviors 2、behaviors的工作方式 3、创建behavior 4、导入并使用behavior 5、behavior中所有可用的节点 6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors 1、什么是behaviorsbehaviors是小程序中,用于实现
require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame
我有一个使用PDFKit呈现网页的pdf版本的Rails应用程序。我使用Thin作为开发服务器。问题是当我处于开发模式时。当我使用“bundleexecrailss”启动我的服务器并尝试呈现任何PDF时,整个过程会陷入僵局,因为当您呈现PDF时,会向服务器请求一些额外的资源,如图像和css,看起来只有一个线程.如何配置Rails开发服务器以运行多个工作线程?非常感谢。 最佳答案 我找到的最简单的解决方案是unicorn.geminstallunicorn创建一个unicorn.conf:worker_processes3然后使用它:
我是Ruby的新手。我试过查看在线文档,但没有找到任何有效的方法。我想在以下HTTP请求botget_response()和get()中包含一个用户代理。有人可以指出我正确的方向吗?#PreliminarycheckthatProggitisupcheck=Net::HTTP.get_response(URI.parse(proggit_url))ifcheck.code!="200"puts"ErrorcontactingProggit"returnend#Attempttogetthejsonresponse=Net::HTTP.get(URI.parse(proggit_url)
有人知道如何将capybarapoltergeist的用户代理覆盖到移动用户代理以进行测试吗?我发现了一些有关为seleniumwebdriver配置它的信息:http://blog.plataformatec.com.br/2011/03/configuring-user-agents-with-capybara-selenium-webdriver/这在capybara闹鬼中怎么可能? 最佳答案 请参阅poltergeistgithub页面上的链接:https://github.com/teampoltergeist/polte