配置這玩意配了兩天,公司網絡卡是一回事,不懂正則又是一回事,最後連後臺支不支持https都懷疑了,差點想用openssl生成個證書給後臺,不過多搜索了一下,還是讓我測通了,分享出來經驗給大夥兒,不明白的評論
首先,不懂nginx 基本東東的童鞋,請花幾分鐘看看nginx的講解,各種參數代表啥意思(我就搞懂了$request_uri 就解決了兩天沒搞出來的問題),還有稍微懂點正則表達式。實在不想搞懂的童鞋,最起碼 rewrite 和 location 要搞懂,然後仿照我這個 nginx 來配置就可以了
想搞懂的童鞋,推薦個連接:
https://segmentfault.com/a/1190000002797606
(ps:裏面有個$ 開頭的各參數舉例,例子有些是錯的,特別是$request_uri,所以不要參考例子,只要知道個參數是幹嘛的就行了,參數講解是沒錯的)
繼續
- 我的 nginx 配置的前情摘要:
- 我有個阿里域名 www.XXX.top,並且申請了證書,可以使用https
- 我配置了域名,指向我的阿里雲服務器(windows server 2016)
- 我想要訪問這個域名,就可以直接訪問阿里雲的80端口,後通過nginx解析到項目的前端(項目是前後端分離的)
- 後端我用的其他端口,但是由於https頁面內不允許http請求,所以我的後端請求也要改成https
- 我要滿足的需求:
- 訪問 www.XXX.top,默認跳轉
要實現的url跳轉概覽: www.XXX.top ---> https://www.XXX.top/AAA www.XXX.top/AAA ---> https://www.XXX.top/AAA www.XXX.top/BBB ---> https://www.XXX.top/BBB
- 後臺也要通過 https 訪問,原路徑爲 http://xxx.xxx.xxx.xxx:8090/demoService。。原來的用的是ip和端口訪問的http請求
- 需要準備的東西:
基礎的軟件、後臺的跨域設置、阿里雲服務器域名指向以及端口開放就不用說了
nginx 的https 的配置,在阿里雲裏面有講解,鏈接如下:
https://help.aliyun.com/knowledge_detail/95491.html?spm=a2c4g.11186623.2.9.13974c07MZ9izQ
記得server_name改成自己的,證書路徑什麼的都改成自己的,可參考:
https://blog.csdn.net/limingyue0312/article/details/79678869
還有個問題,如果你的服務器80端口被佔用了,一定要先找出來幹掉【心裏頭的疙瘩,不幹掉不爽】,像我的雲服務器,就莫名有個sqlserver的服務,佔用了80端口,找了好幾次才找出來,要掌握命令行這些找端口的命令:
- 找到pid,最後一列就是:netstat -ano | findstr "80"
- 通過找到的pid,查找任務進程誰佔用了:tasklist|findstr ""【引號裏放pid】
- 找到任務的進程id,去任務管理器裏找是哪位,然後去服務裏找到它,幹掉,把啓動屬性選成手動啓動以絕後患。
- 需要理解的例子:
如:
http://localhost:8888/test1/test2/test.php?param1='aaa'
$host:localhost
$server_port:8888
$request_uri:/test1/test2/test.php?param1='aaa'
$document_uri:/test1/test2/test.php 【和$uri 一樣】
常用nginx 命令:【管理員身份命令行,跳到根目錄(有nginx.exe 的目錄)】
啓動:start nginx.exe
進程結束後停止(可記錄日誌,有時候會很慢):nginx -s quit
強行終止(不記錄日誌):nginx -s stop
檢查配置文件(配置文件寫好後要用這個驗證,通過後再啓動,不然白搭):nginx -t
好了,可以上配置文件了,具體的說明,配置文件裏都有:
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
charset utf-8;
#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 logs/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
# gzip on;
# gzip_min_length 1k;
# gzip_buffers 4 16k;
# gzip_http_version 1.0;
# gzip_comp_level 2;
# gzip_types text/plain application/x-javascript text/cssapplication/xml;
# gzip_vary on;
#配置虛擬主機
server {
#監聽80端口
listen 80;
#你的域名,沒有域名就寫服務器ip就可以
server_name www.demo.top demo.top;
#這裏判斷request_uri 是否是空的【就是指host和端口號後面的所有東東(包括參數)】
#注意,即使是空的,也會有個 / 斜槓,所以要判斷是否等於 /
if ( $request_uri != '/'){
#!!!!大坑,if 後面一定要有空格,括號前後也是,就是要隔開,不然nginx -t 報錯,,,另外,沒有else 只有if
rewrite ^/(.*) https://$server_name$request_uri? permanent;
}
#前面驗證通過,後面就不會走了,因爲跳到了https鏈接,會進下文配置的https接收裏
rewrite ^/(.*) https://www.demo.top/AAA;
location / {
root html;
index index.html index.htm;
}
# 錯誤頁重定向
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
# #server裏可以配置的其他東東參考,不要直接放開使用,按需拿到上面的server裏用
# server{
##下面的 是要寫在server裏的,按需使用
# access_log logs/host.access.log main;
# location / {
# #域名www.test.com的請求全部轉發到這裏的服務器上
# proxy_pass http://back_server1;
# proxy_set_header Host $host;
# proxy_set_header X-Real-Ip $remote_addr;
# proxy_set_header X-Forwarded-For $remote_addr;
# #歡迎頁面,按照從左到右的順序查找頁面
# index index.html index.htm front.html
# }
#
# location ~ \.php$ {
# proxy_pass http://127.0.0.1;
# }
#
# location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
# }
#
# location ~ /\.ht {
# deny all;
# }
# }
#配置一個跳轉,可在proxy_pass裏使用
upstream demoService{
#你服務器的IP地址和後臺的服務的端口
server xx.xx.xx.xx:8090;
}
# 配置 HTTPS server
server {
listen 443 ssl;#設置爲on啓用SSL功能。
server_name www.demo.top demo.top;# localhost修改爲您證書綁定的域名。多個域名中間加空格
ssl_certificate ../cert/1775271_www.demo.top.pem;
ssl_certificate_key ../cert/1775271_www.demo.top.key;
#下面的東東是阿里雲裏的,就不深究了
ssl_session_cache shared:SSL:1m;#緩存大小
ssl_session_timeout 5m;#超時時間
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #使用此加密套件。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #修改protocols。
ssl_prefer_server_ciphers on;
#默認文件夾,項目在哪裏你就寫哪裏,不然就要輸入域名的時候自己在後面加文件夾名字
#這裏html指的是nginx的文件夾,如果在html文件夾裏新建個test文件夾,這裏就可以直接寫root html/test 就能直接指向test裏的index了
location / {
root html;
index index.html index.htm;
}
#這裏匹配域名host後面的第一個東東,用這個可以區分訪問的是後臺,比如訪問後臺是ip:port/demoService,這裏區分demoService,就可以指向不同的端口了
location /demoService/ {
#允許的來源,自己後臺跨域怎麼設置的就自己設置,不設置也行,這裏寫域名
add_header 'Access-Control-Allow-Origin' 'https://www.demo.top';
#設置爲true,允許ajax異步請求帶cookie信息
add_header "Access-Control-Allow-Credentials" "true";
#設置爲x-requested-with,content-type,允許ajax餘部請求。
add_header "Access-Control-Allow-Headers" "x-requested-with,content-type";
#要跳轉的地方,這裏跳轉到訪問8090端口,也就是說端口號後面第一個目錄是demoService的,都去訪問8090後臺端口
proxy_pass http://demoService;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 1024m;
proxy_connect_timeout 600;
proxy_read_timeout 600;
proxy_send_timeout 600;
proxy_buffering on;
proxy_buffer_size 64k;
proxy_buffers 8 1m;
proxy_busy_buffers_size 2m;
#proxy_temp_file_write_size 0;
}
}
}
結束,如有疑問,請評論區討論