5. nginx的常見問題
nginx 配置支持 websocket 連接
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
nginx前面有多個反向代理時,proxy的正確設置
#proxy_redirect off;
#proxy_set_header Host $host
注釋掉這兩行,讓它使用默認配置
nginx解決跨域問題
在nginx.conf中編輯
server {
location / {
root html;
index index.html index.htm;
//允許cros跨域訪問
add_header 'Access-Control-Allow-Origin' '*';
}
}
從http跳轉到https
項目前期使用http,后期為了安全方面的考慮,啟用了https。 項目架構:前端使用nginx作為多個tomcat實例的反向代理和負載均衡。 實際上只需要在nginx上啟用https即可,使客戶端與nginx之后使用https方式通信,而nginx與tomcat之間依然以http方式通信。
現在需要將之前客戶端所有的http請求全部都自動重定向為https,只需要在nginx上添加相應配置即可。
使用rewrite指令
server {
listen 80;
server_name domain.com;
rewrite ^(.*) https://$server_name$1 permanent;
}
server {
listen 443 ssl;
server_name domain.com;
ssl on;
ssl_certificate /etc/nginx/ssl/domain.com.crt;
ssl_certificate_key /etc/nginx/ssl/domain.com.crt;
# other
}
如果此時nginx作為Tomcat的前端反向代理的話,需要將相應配置放在配置ssl的server塊中。
使用return指令
server {
listen 80;
server_name domain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name domain.com;
ssl on;
ssl_certificate /etc/nginx/ssl/domain.com.crt;
ssl_certificate_key /etc/nginx/ssl/domain.com.crt;
# other
}
如果此時nginx作為Tomcat的前端反向代理的話,需要將相應配置放在配置ssl的server塊中。
使用error_page指令
只允許HTTP來訪問時,用HTTP訪問會讓Nginx報497錯誤,然后利用error_page將鏈接重定向至HTTPS上。
server {
listen 80;
listen 443 ssl;
server_name domain.com;
ssl on;
ssl_certificate /etc/nginx/ssl/domain.com.crt;
ssl_certificate_key /etc/nginx/ssl/domain.com.crt;
# other
error_page 497 https://$server_name$request_uri;
}
使用error_page指令時,將http和https的監聽配置寫在同一個server塊中,對應的其他配置也需要在該server配置塊中完成。
需要注意的是,此時需要將error_page指令語句寫在最后,否則不能生效。
Nginx出現403 forbidden的三種原因
引起nginx 403 forbidden通常是三種情況:一是缺少主頁文件,二是權限問題,三是SELinux狀態。
缺少主頁文件
server {
listen 80;
server_name localhost;
index index.php index.html;
# index index.html index.htm;
root /clay/clay1/clay2/;
}
如果在/clay/clay1/clay2/下面沒有index.php或index.html的時候,直接文件,會報403 forbidden。
當index文件問
index.html時,index指令可以省略不寫
權限問題
主要原因是nginx啟動用戶沒有,查看主頁文件的權限
1)查看nginx啟動用戶
ps aux | grep "nginx: worker process" | grep -v "grep" | awk '{ print $1 }'
2)查看主頁文件權限及遞歸查看主頁文件所在目錄權限
-
主頁文件,
nginx啟動用戶要有r權限,讀取文件內容的權限 -
遞歸主頁所在的目錄,
nginx啟動用戶要有x權限,可以訪問目錄的內容遞歸目錄在上述配置文件中是指
/clay/、/clay/clay1/、/clay/clay1/clay2/這三個目錄
SELinux為開啟狀態(enabled)
1)查看當前selinux的狀態
/usr/sbin/sestatus
2)將SELINUX=enforcing 修改為 SELINUX=disabled 狀態
vi /etc/selinux/config
#SELINUX=enforcing
SELINUX=disabled
3)重啟生效
reboot
通過nginx實現藍綠發布
樣例
nginx.conf通過兩個子配置文件來實現
include conf.d/v1.conf
#include conf.d/v2.conf
v1.conf
upstream app_v1 {
server 192.168.1.2:8080;
server 192.168.1.3:8080;
}
upstream app_v2 {
server 192.168.1.3:8080;
server 192.168.1.4:8080;
}
server {
listen 80;
server_name localhost;
set $group "app_v1";
location / {
proxy_pass http://$group;
}
}
v2.conf
upstream app_v1 {
server 192.168.1.2:8080;
server 192.168.1.3:8080;
}
upstream app_v2 {
server 192.168.1.3:8080;
server 192.168.1.4:8080;
}
server {
listen 80;
server_name localhost;
set $group "app_v2";
location / {
proxy_pass http://$group;
}
}
有的時候還是結合cookie進行使用
if ($http_cookie ~* "version=V1") {
set $group app_v1;
}
nginx allow 多個ip & ipv4的網段表示方法解析
單看模塊名ngx_http_access_module,很多人一定很陌生,但是deny和allow相比沒一個人不知道的,實際上deny和allow指令屬于ngx_http_access_module.我們想控制某個uri或者一個路徑不讓人訪問,在nginx就得靠它了。
nginx的訪問控制模塊語法很簡單,至少比apache好理解,apache的allow和deny的順序讓很多初學者抓頭.好了具體看下這個插件的使用方法吧。
1、安裝模塊
這個模塊內置在了nginx中,除非你安裝中使用了--without-http_access_module。
2、指令
allow 語法: allow address | CIDR | unix: | all; 默認值: — 配置段: http, server, location, limit_except
允許某個ip或者一個ip段訪問.如果指定unix:,那將允許socket的訪問.注意:unix在1.5.1中新加入的功能,如果你的版本比這個低,請不要使用這個方法。
deny 語法: deny address | CIDR | unix: | all; 默認值: — 配置段: http, server, location, limit_except
禁止某個ip或者一個ip段訪問.如果指定unix:,那將禁止socket的訪問.注意:unix在1.5.1中新加入的功能,如果你的版本比這個低,請不要使用這個方法。
3. allow、deny實例
location / { deny 192.168.1.1; allow 192.168.1.0/24; allow 10.1.1.0/16; allow 2001:0db8::/32; deny all; }
從上到下的順序,類似iptables。匹配到了便跳出。如上的例子先禁止了192.16.1.1,接下來允許了3個網段,其中包含了一個ipv6,最后未匹配的IP全部禁止訪問. 在實際生產環境中,我們也會使用nginx 的geo模塊配合使用,有興趣的請參考ttlsa相關文章nginx geo使用方法.
nginx訪問控制模塊要數nginx里面最簡單的指令,只要記住你想禁止誰訪問就deny加上IP,想允許則加上allow ip,想禁止或者允許所有,那么allow all或者deny all即可.
但是具體的配置出現很多問題
簡單一點舉例說明: ip段:10.0.0.1-10.0.0.255 的表示方法:10.0.0.0/24 ip段:10.0.0.1-10.0.255.255 的表示方法:10.0.0.0/16 ip段:10.0.0.1-10.255.255.255 的表示方法:10.0.0.0/8
利用主機數來計算
1)將主機數目轉化為二進制來表示
2)如果主機數小于或等于254(注意去掉保留的兩個IP地址),則取得該主機的二進制位數,為 N,這里肯定 N<8。如果大于254,則 N>8,這就是說主機地址將占據不止8位。
3)使用255.255.255.255來將該類IP地址的主機地址位數全部置1,然后從后向前的將N位全部置為 0,即為子網掩碼值。
如欲將B類IP地址168.195.0.0劃分成若干子網,每個子網內有主機700臺:
- 700=1010111100
- 該二進制為十位數,N = 10
- 將該B類地址的子網掩碼255.255.0.0的主機地址全部置 1,得到255.255.255.255 然后再從后向前將后 10位置0,即為: 11111111.11111111.11111100.00000000 即255.255.252.0。這就是該欲劃分成主機為700臺的B類IP地址 168.195.0.0的子網掩碼。
二進制表(表1)
0 0 0 0 0 0 0 0
128 64 32 16 8 4 2 1
CIDR值(表2)
子網掩碼 CIDR值
255.0.0.0 /8
255.128.0.0 /9
255.192.0.0 /10
255.224.0.0 /11
255.240.0.0 /12
255.248.0.0 /13
255.252.0.0 /14
255.254.0.0 /15
255.255.0.0 /16
255.255.128.0 /17
255.255.192.0 /18
255.255.224.0 /19
255.255.240.0 /20
255.255.248.0 /21
255.255.252.0 /22
255.255.254.0 /23
255.255.255.0 /24
255.255.255.128 /25
255.255.255.192 /26
255.255.255.224 /27
255.255.255.240 /28
255.255.255.248 /29
255.255.255.252 /30

浙公網安備 33010602011771號