set $match_host '0';
set $match_url '0';
if ($host ~ "192.168.1.105") {
set $match_host '1';
}
if ($request_uri ~* "test") {
set $match_url '${match_host}1';
}
if ($match_url = '11'){
return 404;
}
标签归档:nginx
nginx 非www跳www,www跳非www,http跳https
非www跳www
if ($host ~ ^(?!www\.)(?<domain>.+)$) {
return 301 $scheme://www.$domain$request_uri;
}
www to non-www
if ($host ~ ^www\.(?<domain>.+)$) {
return 301 $scheme://$domain$request_uri;
}
其他域名跳统一域名
if ($host != "example.com") {
return 301 $scheme://example.com$request_uri;
}
http跳https
if ($scheme != "https") {
return 301 https://$host$request_uri;
} # managed by Certbot
参考
nginx access log 记录cgi执行时间
log_format combined_with_time '$remote_addr - $remote_user [$time_local] '
'$request $status $body_bytes_sent '
'$http_referer $http_user_agent '
'$request_time $upstream_response_time';
access_log /data/wwwroot/xxxx/vagrant/nginx/log/frontend-access.log combined_with_time;
解决nginx+php/java/go/python+mysql下time_wait连接数过多问题
公司服务器连接数超过10K了,查了下大多数是没有即时回收,采用tcp复用容易后程序出现了故障,以前一直看到说PHP持久连接有问题,所以没怎么用,最近有机会试了下。
非常香,连接数直接降低到几百了,目前观察数周没有问题。
查看连接数
netstat -n | wc -l # 总连接数
netstat -n | grep -i time_wait | wc -l # time_wait 连接数
netstat -anp # 查看占用端口过多的程序
tcp复用解决方案
网上大部分解决方案是修改sysctl.conf回收重用ipv4连接,但是可能带来其他问题
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_timestamps=1
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=1
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_keepalive_time = 600
nginx fastcgi(php) 解决方案
修改nginx.conf
upstream fastcgi_backend {
server 127.0.0.1:9000;
keepalive 60;
}
location ~ \.php$ {
fastcgi_pass fastcgi_backend;
fastcgi_keep_conn on;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
主要是 fastcgi_keep_conn on
与 upstream
的 keepalive
nginx + proxy (python/go/java) 解决方案
upstream wxpic {
keepalive 60;
server 127.0.0.1:xxx;
}
server {
keepalive_requests 10000; # 默认100
location / {
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
主要是 proxy_http_version
, proxy_set_header Connection ""
以及keepalive_requests
mysql数据库连接解决方案
修改yii数据库配置采用长链接
'db' => [
'class' => 'yii\db\Connection',
'dsn' => '*', 'username' => '*',
'password' => '*',
'charset' => 'utf8mb4',
'attributes' => [
PDO::ATTR_PERSISTENT => true
]
],
redis 连接数
django2 + uwsgi + nginx
安装uwsgi模块
pip install uwsgi
测试uwsgi服务
uwsgi --http 0.0.0.0:8080 --file project/wsgi.py --static-map=/static=static
配置uwsgi.ini
# uwsig使用配置文件启动
[uwsgi]
# 项目目录
chdir=/data/pyproject/zc1024
# 指定项目的application
module=zc1024.wsgi:application
# 指定sock的文件路径
socket=/data/pyproject/zc1024/tmp/uwsgi.sock
# 进程个数
workers=4
pidfile=/data/pyproject/zc1024/tmp/uwsgi.pid
# 指定IP端口
http=127.0.0.1:8080
# 指定静态文件
static-map=/static=/data/pyproject/zc1024/static
# 启动uwsgi的用户名和用户组
uid=ning
gid=ning
# 启用主进程
master=true
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启用线程
enable-threads=true
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=4096
# 设置日志目录
daemonize=/data/pyproject/zc1024/tmp/uwsgi.log
运行配置
uwsgi --ini uwsgi.ini
配置nginx
# 指定项目路径uwsgi
location / { # 这个location就和咱们Django的url(r'^admin/', admin.site.urls),
include uwsgi_params; # 导入一个Nginx模块他是用来和uWSGI进行通讯的
uwsgi_connect_timeout 30; # 设置连接uWSGI超时时间
uwsgi_pass unix:/data/pyproject/zc1024/tmp/uwsgi.sock; # 指定uwsgi的sock文件所有动态请求就会直接丢给他
}
# 指定静态文件路径
location /static/ {
alias /data/pyproject/zc1024/static/;
index index.html index.htm;
}
重新加载nginx配置
nginx -s reload
nginx出现blocked for more than 120 seconds 以及 hung_task_timeout_secs错误解决办法
问题原因
默认情况下, Linux 会最多使用 40% 的可用内存作为文件系统缓存。当超过这个阈值后,文件系统会把将缓存中的内存全部写入磁盘, 导致后续的 IO 请求都是同步的。
将缓存写入磁盘时,有一个默认120 秒的超时时间。 出现上面的问题的原因是 IO 子系统的处理速度不够快,不能在 120 秒将缓存中的数据全部写入磁盘。
IO 系统响应缓慢,导致越来越多的请求堆积,最终系统内存全部被占用,导致系统失去响应。
解决办法
根据应用程序情况,对 vm.dirty_ratio,vm.dirty_background_ratio 两个参数进行调优设置。 例如,推荐如下设置:
# sysctl -w vm.dirty_ratio=10
# sysctl -w vm.dirty_background_ratio=5
# sysctl -p
如果系统永久生效,修改 /etc/sysctl.conf 文件。加入如下两行:
#vi /etc/sysctl.conf
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
重启系统生效。
centos 7 + php 7 + nginx + wordpress之yum最简单安装办法
安装eple库
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
安装webtatic库
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
更新yum源
yum update
安装php7以及扩展
yum install php71w-gd php71w-pdo php71w-opcache php71w-fpm php71w-pecl-redis php71w-mysql php71w-mcrypt php71w-mbstring php71w-intl php71w-cli
安装nginx
yum install nginx1w -y
系统启动时自动启动nginx以及php-fpm
systemctl enable nginx php-fpm
systemctl start nginx php-fpm
修改php程序目录权限
chown -R apache:apache /data/web/www.c4ys.com/
修改ngingx配置(以为wordpress例)
vim /etc/nginx/conf.d/www.c4ys.com.conf
server {
server_name www.c4ys.com c4ys.com;
root /data/phpproject/www.c4ys.com;
location / {
index index.html index.php;
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
centos 7 + nginx + letsencrypt https
安装编译工具,头文件
yum install gcc gcc-c++ libffi-devel openssl-devel
安装certbot
yum install certbot python2-certbot-nginx
安装证书
certbot --nginx
waf比较(lua-nginx-module,modsecurity,naxsi)
ngx_lua_waf是一个基于lua-nginx-module(openresty)的web应用防火墙
https://github.com/loveshell/ngx_lua_waf
nginx配合modsecurity实现WAF功能
http://www.52os.net/articles/nginx-use-modsecurity-module-as-waf.html
NAXSI is an open-source, high performance, low rules maintenance WAF for NGINX
https://github.com/nbs-system/naxsi
中、小企业如何自建免费的云WAF
https://zhuanlan.zhihu.com/p/22068364
X-WAF是一款适用中、小企业的云WAF系统,让中、小企业也可以非常方便地拥有自己的免费云WAF。
基于openresty的Web应用安全防护系统(WAF)
http://git.oschina.net/miracleqi/OpenWAF
配置nginx使用letsencrypt免费https证书
生成证书
certbot certonly --webroot \
-w /data/web/c4ys/frontend/web/ -d c4ys.com -d www.c4ys.com \
-w /data/web/c4ys/mobile/web/ -d m.c4ys.com
修改nginx配置
listen 443 ssl;
ssl on;
ssl_certificate /etc/letsencrypt/live/www.c4ys.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.c4ys.com/privkey.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
error_page 497 https://$host$uri?$args;
自动更新证书
0 3 */10 * * certbot renew –quiet
0 3 */10 * * service nginx restart